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