我已经在apache spark上构建了一个非常基本的朴素bayes,当然还使用了mllib。但我对中性究竟意味着什么有一些澄清。
根据我的理解,在给定的数据集中,有预先标记的句子,其中包含必要的类,例如,下面的例子为3。
0-> Negative sentiment
1-> Positive sentiment
2-> Neutral sentiment
此中性线在训练集本身中预先标记。
是否有其他形式的中立性处理。假设数据集中没有可用的中性句子,那么我是否可以从概率范围计算出来,如
0.0 - 0.4 => Negative
0.4- - 0.6 => Neutral
0.6 - 1.0 => Positive
这样的映射是否可能在火花中。我四处搜索但找不到任何东西。 RDD API中的NaiveBayesModel
类有一个predict
方法,它只返回根据训练集映射的double,即如果只有0,1那么它将只返回0,1而不是缩放方式,如上面的0.0 - 1.0。
任何关于此的指示/建议都会非常有帮助。
编辑 - 1
示例代码
//Performs tokenization,pos tagging and then lemmatization
//Returns a array of string
val tokenizedString = Util.tokenizeData(text)
val hashingTF = new HashingTF()
//Returns a double
//According to the training set 1.0 => Positive, 0.0 => Negative
val status = model.predict(hashingTF.transform(tokenizedString.toSeq))
if(status == 1.0) "Positive" else "Negative"
示例数据集内容
1,Awesome movie
0,This movie sucks
当然原始数据集包含更长的句子,但这应该足以解释我猜
使用上面的代码我正在计算。我的问题是一样的
1)数据集中的中立性处理 在上面的数据集中,如果我要添加另一个类别,如 2,这部电影可以由孩子们享受
为了论证,我们假设它是一个中立的评论,然后model.predict
方法将根据传入的句子给出1.0,0.0,2.0。
2)使用model.predictProbabilities
它给出了一系列双精度数,但我不确定它给出的结果是什么顺序,即索引0是负数还是正数?有三个特征,即否定,正面,中立,那么该方法将以什么顺序返回预测?
答案 0 :(得分:1)
我不确定我是否理解这个问题但是:
predictProbabilities
来获取课程概率。setThresholds
为每个班级设置预测阈值。答案 1 :(得分:1)
使用构建模型的代码会很有帮助(为了使您的示例正常工作,数据集中的0.0必须在模型中将其转换为0.0,或者在使用StringIndexer阶段对其进行索引之后,或者如果您从文件中转换了它,但假设此代码有效:
val status = model.predict(hashingTF.transform(tokenizedString.toSeq))
if(status == 1.0) "Positive" else "Negative"
然后是的,这意味着索引0的概率是负的概率,而1的概率是积极的概率(它有点奇怪且必须有原因,但ML中的一切都是双重的,甚至是特征和类别索引)。如果你的代码中有这样的东西:
val labelIndexer = new StringIndexer()
.setInputCol("sentiment")
.setOutputCol("indexedsentiment")
.fit(trainingData)
然后你可以使用labelIndexer.labels
来识别标签(索引0处的概率是指数0处的labelIndexer.labels。
现在关于你的其他问题。