spark ml 2.0 - 朴素贝叶斯 - 如何确定每个 class 的阈值

spark ml 2.0 - Naive Bayes - how to determine threshold values for each class

我正在使用 NB 进行文档 class化,并试图了解阈值参数以了解它如何帮助优化算法。

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,那么至少有一个 class 预测概率应该大于 0.7,否则预测应该 return 为空。表示 class 将其定义为 'uncertain' 或将预测列留空。当您仍然以最大概率选择类别时,p/t 函数如何实现这一目标?

1) 调整的概率是多少?默认列 'probability' 实际上是条件概率, 'rawPrediction' 是 根据文件的信心。我相信阈值会调整 'rawPrediction' 而不是 'probability' 列。我对吗?

2) 这是我的一些概率和 rawPrediction 向量的样子。我如何根据这个设置阈值,以便我可以去除某些不确定的 classification? probability 介于 0 和 1 之间,但 rawPrediction 在这里似乎是对数刻度。

概率: [2.233368649314982E-15,1.6429456680945863E-9,1.4377313514127723E-15,7.858651849363202E-15]

原始预测: [-496.9606736723107,-483.452183395287,-497.40111830218746]

基本上我希望 classifier 在预测列没有任何大于 0.7% 的概率时将其留空。

另外,当不止一个类别的分数非常接近时,如何 class 将某件事确定为不确定的,例如0.812、0.800、0.799。我可能不想在这里选择最大值,而是 class 化为 "uncertain" 或留空,我可以对这些文档进行进一步的分析和处理,或者为这些文档训练另一个模型。

我没有玩过它,但目的是为每个 class 提供 不同的 阈值。我从文档字符串中提取了这个例子:

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],将预测 ("largest p/t") 从第 1 列(上面第三行)切换到第 1 列0(上面最后一行)。但是,我在源代码中找不到逻辑。有人吗?

退后一步:我没有看到一个内置的方法来做你想做的事:如果没有 class 主导,那就是不可知论者。您必须添加类似以下内容的内容:

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 分数、对数损失或信息增益,这些指标可以解释校准和准确性。