Apache spark 火花朴素贝叶斯预测分析

Apache spark 火花朴素贝叶斯预测分析,apache-spark,machine-learning,apache-spark-mllib,naivebayes,Apache Spark,Machine Learning,Apache Spark Mllib,Naivebayes,我使用朴素贝叶斯进行文本分类 下面是我用来理解朴素贝叶斯的链接 虽然我得到了很好的预测结果,但我无法理解失败案例的原因 我使用predictProbabilities来测量特征的概率,以了解其原因 正确预测 以下是我的理解,在此基础上,我试图找出为什么预测在某些情况下是错误的 假设我的测试数据如下(我有大约100000条培训记录) 现在,当我为下面的句子做预测时 “这座城市发生了一起谋杀案”——我希望这个模型能预测出严重性。 但有时该模型预测的严重性较低 我把所有的文字都拉了出来,试图找出为什

我使用朴素贝叶斯进行文本分类

下面是我用来理解朴素贝叶斯的链接

虽然我得到了很好的预测结果,但我无法理解失败案例的原因

我使用predictProbabilities来测量特征的概率,以了解其原因 正确预测

以下是我的理解,在此基础上,我试图找出为什么预测在某些情况下是错误的

假设我的测试数据如下(我有大约100000条培训记录)

现在,当我为下面的句子做预测时 “这座城市发生了一起谋杀案”——我希望这个模型能预测出严重性。 但有时该模型预测的严重性较低

我把所有的文字都拉了出来,试图找出为什么会发生这种情况。 如果我使用中的公式手动计算概率,它应该被正确预测。 但是我找不到任何线索来解释为什么预测会出错

如果我遗漏了任何重要信息,请告诉我

下面添加了代码段

我的培训数据框架由“id”、“风险”、“标签”三列组成

文本已经使用斯坦福NLP进行了引理化

    // 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());