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 - 朴素贝叶斯 - 如何确定每个类的阈值的主要内容,如果未能解决你的问题,请参考以下文章

SPARK ML,朴素贝叶斯分类器:一类的高概率预测

ML—朴素贝叶斯

nltk.org 使用朴素贝叶斯分类器进行句子分割的示例:.sent 如何分隔句子以及 ML 算法如何改进它?

Spark:如何获得伯努利朴素贝叶斯的概率和 AUC?

大数据:Spark mlib Naive bayes朴素贝叶斯分类之多元朴素贝叶斯源码分析

Spark MLlib速成宝典模型篇04朴素贝叶斯Naive Bayes(Python版)