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

Apache spark spark ml 2.0-朴素贝叶斯-如何确定每个类的阈值,apache-spark,machine-learning,text-classification,threshold,naivebayes,Apache Spark,Machine Learning,Text Classification,Threshold,Naivebayes,我正在使用NB进行文档分类,并试图了解阈值参数,以了解它如何帮助优化算法 Spark ML 2.0thresholdsdoc说: Param用于多类别分类中的阈值,以调整预测每个类别的概率。数组的长度必须等于类的数量,值>=0。预测p/t值最大的类别,其中p是该类别的原始概率,t是类别的阈值。 有人能更好地解释这一点吗?它能达到什么目标?我的总体想法是,如果阈值为0.7,那么至少有一个类预测概率应该大于0.7,如果不是,那么预测应该返回空。表示将其分类为“不确定”或将预测列留空。当你仍然选择概率

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

Spark ML 2.0
thresholds
doc说:

Param用于多类别分类中的阈值,以调整预测每个类别的概率。数组的长度必须等于类的数量,值>=0。预测p/t值最大的类别,其中p是该类别的原始概率,t是类别的阈值。

有人能更好地解释这一点吗?它能达到什么目标?我的总体想法是,如果阈值为0.7,那么至少有一个类预测概率应该大于0.7,如果不是,那么预测应该返回空。表示将其分类为“不确定”或将预测列留空。当你仍然选择概率最大的类别时,p/t函数如何实现这一点

1) 它调整的概率是多少?默认列“概率”实际上是条件概率,“rawPrediction”是 根据文件的规定,信心。我相信阈值将调整“预测”而不是“概率”列。我说得对吗

2) 下面是我的一些概率和预测向量的样子。如何在此基础上设置阈值,以便消除某些不确定的分类<代码>概率介于0和1之间,但这里的预测似乎在对数范围内

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

rawPrediction:
[-496.9606736723107,-483.452183395287,-497.401111830218746]

基本上,我希望分类器将预测列留空,如果它的概率不超过0.7%


此外,当多个类别的得分非常接近时,如0.812、0.800、0.799,如何将某个类别归类为不确定。在这里,我可能不想选择max,而是将其归类为“不确定”或留空,我可以对这些文档进行进一步的分析和处理,或者为这些文档培训另一个模型。

我没有使用过它,但目的是为每个类提供不同的阈值。我从docstring中提取了这个示例:

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弱(概率,阈值=0.7,ε=0.01):
返回np.all(probs>>案例=[[5.5]、[5.7]、[7.705]、[6.1]]
>>>在下列情况下:
...    打印“{:15s}-{}”。格式(大小写,弱(大小写))
[0.5,0.5]-正确
[0.5,0.7]-错误
[0.7,0.705]-正确
[0.6,0.1]-正确
(注意,我没有检查
probs
是否为合法的概率分布。)

或者,如果您实际上没有做出艰难的决定,请使用预测概率和一个指标,如Brier分数、日志损失或信息增益,以说明校准和准确性