spark ml 2.0 - 朴素贝叶斯 - 如何确定每个类的阈值
Posted
技术标签:
【中文标题】spark ml 2.0 - 朴素贝叶斯 - 如何确定每个类的阈值【英文标题】:spark ml 2.0 - Naive Bayes - how to determine threshold values for each class 【发布时间】:2017-03-21 11:29:32 【问题描述】:我正在使用 NB 进行文档分类,并尝试了解阈值参数以了解它如何帮助优化算法。
Spark ML 2.0 thresholds
文档说:
Param for Thresholds in multi-class classification to adjust the probability of predicting each class. Array must have length equal to the number of classes, with values >= 0. The class with largest value p/t is predicted, where p is the original probability of that class and t is the class' threshold.
0) 有人可以更好地解释一下吗?它可以达到什么目标?我的一般想法是,如果您的阈值为 0.7,那么至少一个类别的预测概率应该大于 0.7,如果不是,那么预测应该返回空。意味着将其分类为“不确定”或将预测列留空。当您仍然选择概率最大的类别时,p/t 函数如何实现这一目标?
1) 它调整的概率是多少?默认列“概率”实际上是条件概率,而“原始预测”是 根据文件的信心。我相信阈值会调整“原始预测”而不是“概率”列。我对吗?
2) 下面是我的一些概率和 rawPrediction 向量的样子。如何在此基础上设置阈值,以便消除某些不确定的分类? probability
介于 0 和 1 之间,但 rawPrediction
似乎在这里是对数刻度。
概率:
[2.233368649314982E-15,1.6429456680945863E-9,1.4377313514127723E-15,7.858651849363202E-15]
原始预测:
[-496.9606736723107,-483.452183395287,-497.40111830218746]
基本上,如果分类器的概率不超过 0.7%,我希望分类器将“预测”列留空。
此外,当一个以上类别的分数非常接近时,如何将某事物分类为不确定,例如0.812、0.800、0.799。在这里我可能不希望选择最大值,而是将其归类为“不确定”或留空,我可以对这些文档进行进一步的分析和处理,或者为这些文档训练另一个模型。
【问题讨论】:
【参考方案1】:我没有玩过它,但目的是为每个类提供不同的阈值。我从文档字符串中提取了这个例子:
model = nb.fit(df)
>>> result.prediction
1.0
>>> result.probability
DenseVector([0.42..., 0.57...])
>>> result.rawPrediction
DenseVector([-1.60..., -1.32...])
>>> nb = nb.setThresholds([0.01, 10.00])
>>> model3 = nb.fit(df)
>>> result = model3.transform(test0).head()
>>> result.prediction
0.0
如果我理解正确的话,效果是将 [0.42, 0.58] 转换为 [.42/.01, .58/ 10] = [42, 5.8],将预测(“最大 p/t”)从第 1 列(上面的第三行)切换到第 0 列(上面的最后一行)。但是,我在源代码中找不到逻辑。有人吗?
退后一步:我没有看到一种内置的方式来做你想做的事:如果没有阶级占主导地位,那就不可知论了。您必须添加以下内容:
def weak(probs, threshold=.7, epsilon=.01):
return np.all(probs < threshold) or np.max(np.diff(probs)) < epsilon
>>> cases = [[.5,.5],[.5,.7],[.7,.705],[.6,.1]]
>>> for case in cases:
... print ':15s - '.format(case, weak(case))
[0.5, 0.5] - True
[0.5, 0.7] - False
[0.7, 0.705] - True
[0.6, 0.1] - True
(注意我没有检查probs
是否是一个合法的概率分布。)
或者,如果您实际上并没有做出艰难的决定,请使用预测概率和指标(例如 Brier 分数、对数损失或信息增益)来说明校准和准确性。
【讨论】:
以上是关于spark ml 2.0 - 朴素贝叶斯 - 如何确定每个类的阈值的主要内容,如果未能解决你的问题,请参考以下文章
nltk.org 使用朴素贝叶斯分类器进行句子分割的示例:.sent 如何分隔句子以及 ML 算法如何改进它?