#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 учебных записях.