Apache spark 火花朴素贝叶斯预测分析
我使用朴素贝叶斯进行文本分类 下面是我用来理解朴素贝叶斯的链接 虽然我得到了很好的预测结果,但我无法理解失败案例的原因 我使用predictProbabilities来测量特征的概率,以了解其原因 正确预测 以下是我的理解,在此基础上,我试图找出为什么预测在某些情况下是错误的 假设我的测试数据如下(我有大约100000条培训记录) 现在,当我为下面的句子做预测时 “这座城市发生了一起谋杀案”——我希望这个模型能预测出严重性。 但有时该模型预测的严重性较低 我把所有的文字都拉了出来,试图找出为什么会发生这种情况。 如果我使用中的公式手动计算概率,它应该被正确预测。 但是我找不到任何线索来解释为什么预测会出错 如果我遗漏了任何重要信息,请告诉我 下面添加了代码段 我的培训数据框架由“id”、“风险”、“标签”三列组成 文本已经使用斯坦福NLP进行了引理化Apache spark 火花朴素贝叶斯预测分析,apache-spark,machine-learning,apache-spark-mllib,naivebayes,Apache Spark,Machine Learning,Apache Spark Mllib,Naivebayes,我使用朴素贝叶斯进行文本分类 下面是我用来理解朴素贝叶斯的链接 虽然我得到了很好的预测结果,但我无法理解失败案例的原因 我使用predictProbabilities来测量特征的概率,以了解其原因 正确预测 以下是我的理解,在此基础上,我试图找出为什么预测在某些情况下是错误的 假设我的测试数据如下(我有大约100000条培训记录) 现在,当我为下面的句子做预测时 “这座城市发生了一起谋杀案”——我希望这个模型能预测出严重性。 但有时该模型预测的严重性较低 我把所有的文字都拉了出来,试图找出为什
// 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);
我希望您已经完成了NLP的常见预处理,如词干分析、标点符号删除、停止词、常见词删除等。下面是已完成的转换。使用Stanford NLP进行Lemmetization,使用Spark停止单词删除,在Naive Bayes中培训模型之前使用Spark对TF和IDF进行哈希处理,您可以发布关于工作流程的代码片段吗?请将代码片段更新为问题除了功能数量之外,工作流对我来说似乎还可以。您知道,您将在100000个培训记录中设置最终数千个功能中的20个。我希望您已经完成NLP的常见预处理,如词干分析、标点符号删除、停止词、常用词删除等。下面是已完成的转换。使用Stanford NLP进行Lemmetization,使用Spark停止单词删除,在Naive Bayes中培训模型之前使用Spark对TF和IDF进行哈希处理,您可以发布关于工作流程的代码片段吗?请将代码片段更新为问题除了功能数量之外,工作流对我来说似乎还可以。您知道,您将在100000个培训记录中设置最终数千个功能中的20个功能。
// 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);
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());