анализ наивного байесовского прогнозирования spark

#apache-spark #machine-learning #apache-spark-mllib #naivebayes

#apache-spark #машинное обучение #apache-spark-mllib #наивный байес

Вопрос:

Я использовал наивный Байесовский анализ для классификации текста

Ниже приведена ссылка, которую я использовал для понимания наивного Байеса

https://www.analyticsvidhya.com/blog/2015/09/naive-bayes-explained/

Хотя я получил хорошие результаты прогнозирования, я не смог понять причину сбоев

Я измерил вероятность функций, используя predictProbabilities, чтобы понять причину правильного прогнозирования

Ниже приведено мое понимание, на основе которого я пытаюсь выяснить, почему прогнозы в некоторых случаях неверны

Предположим, что мои тестовые данные похожи на приведенные ниже (у меня около 100000 записей для обучения)

 Text                                      Classification
There is a murder in town                 - HIGH SEVERITY
The old women was murdered                - HIGH SEVERITY
Boy was hit by ball in street             - LOW SEVERITY
John sprained his ankle while playing     - LOW SEVERITY
  

Теперь, когда я делаю прогноз для приведенного ниже предложения
«В городе произошло убийство» — я ожидаю, что модель будет предсказывать ВЫСОКУЮ СТЕПЕНЬ СЕРЬЕЗНОСТИ.
Но иногда модель предсказывает НИЗКУЮ СЕРЬЕЗНОСТЬ

Я вытащил весь текст, содержащий одинаковые слова, и попытался выяснить, почему это происходит . Если я вычислю вероятность вручную, используя формулу в https://www.analyticsvidhya.com/blog/2015/09/naive-bayes-explained /, это должно было быть предсказано правильно. Но я не смог найти никакой подсказки, почему прогноз идет не так.

Пожалуйста, дайте мне знать, если мне не хватает какой-либо важной информации

Фрагмент кода добавлен ниже

Мой фрейм данных обучения состоит из трех столбцов «идентификатор», «риск», «метка».

Текст уже лемметизирован с использованием стэнфордского НЛП

     // TOKENIZE DATA

            regexTokenizer = new RegexTokenizer()
                      .setInputCol("text")
                      .setOutputCol("words")
                      .setPattern("\W"); 

            DataFrame tokenized = regexTokenizer.transform(trainingRiskData);

    // REMOVE STOP WORDS

            remover = new StopWordsRemover().setInputCol("words").setOutputCol("filtered");

            DataFrame stopWordsRemoved = remover.transform(tokenized);

// COMPUTE TERM FREQUENCY USING HASHING

        int numFeatures = 20;
        hashingTF = new HashingTF().setInputCol("filtered").setOutputCol("rawFeatures")
                .setNumFeatures(numFeatures);
        DataFrame rawFeaturizedData = hashingTF.transform(stopWordsRemoved);

IDF idf = new IDF().setInputCol("rawFeatures").setOutputCol("features");
        idfModel = idf.fit(rawFeaturizedData);

        DataFrame featurizedData = idfModel.transform(rawFeaturizedData);

JavaRDD<LabeledPoint> labelledJavaRDD = featurizedData.select("label", "features").toJavaRDD()
                .map(new Function<Row, LabeledPoint>() {

                    @Override
                    public LabeledPoint call(Row arg0) throws Exception {
                        LabeledPoint labeledPoint = new LabeledPoint(new Double(arg0.get(0).toString()),
                                (org.apache.spark.mllib.linalg.Vector) arg0.get(1));
                        return labeledPoint;
                    }
                });

NaiveBayes naiveBayes = new NaiveBayes(1.0, "multinomial");
        NaiveBayesModel naiveBayesModel = naiveBayes.train(labelledJavaRDD.rdd(), 1.0);
  

После построения обучающей модели тестовые данные передаются через те же преобразования, и прогнозирование выполняется с использованием приведенного ниже кода
Столбец 3 — это метка во фрейме тестовых данных.
Столбец 7 — это объекты во фрейме тестовых данных

 LabeledPoint labeledPoint = new LabeledPoint(new Double(dataFrameRow.get(3).toString()),
                        (org.apache.spark.mllib.linalg.Vector) dataFrameRow.get(7));

double predictedLabel = naiveBayesModel.predict(labeledPoint.features());
  

Комментарии:

1. Я надеюсь, что вы уже выполнили обычную предварительную обработку NLP, такую как стемминг, удаление знаков препинания, стоп-слова, удаление общих слов и т. Д.

2. Ниже приведены выполненные преобразования . Лемметизация с использованием Stanford NLP, удаление стоп-слов с помощью Spark, хеширование TF и IDF с использованием Spark перед обучением модели в наивном байесовском

3. Можете ли вы опубликовать свой фрагмент кода, касающийся рабочего процесса?

4. Обновите фрагмент кода к вопросу

5. Рабочий процесс кажется мне подходящим для количества функций. Вы знаете, что устанавливаете 20 функций из возможных тысяч, которые должны быть в ваших 100000 учебных записях.