随机森林分类器:概率对应哪个类别

3

我正在使用来自pyspark.ml.classificationRandomForestClassifier

我在二元分类数据集上运行模型并显示概率。

在列概率中,我有以下内容:

+-----+----------+---------------------------------------+
|label|prediction|probability                            |
+-----+----------+---------------------------------------+
|0.0  |0.0       |[0.9005918461098429,0.0994081538901571]|
|1.0  |1.0       |[0.6051335859900139,0.3948664140099861]|
+-----+----------+---------------------------------------+

我有一个包含两个元素的列表,显然对应于预测类别的概率。

我的问题: probability[0] 是否始终对应预测值?而在 Spark 文档中并不清楚!


我同意,文档不够清晰 +1。 - Tim Biegeleisen
我会观察每个概率元组中两个数字的总和为1。我的猜测是,例如对于0.0,模型有90%的时间是正确的,有10%的时间是错误的。 - Tim Biegeleisen
2
概率对应于连续的标签,因此如果在实践中看到第二行,则是一个错误。在这种情况下,欢迎提供 [mcve] 和/或 JIRA 票据。 - zero323
@user6910411 你的意思是Probability[0]始终是一个类别,而Probability[1]则是另一个类别。如何确定哪个概率是哪个类别的,第二个问题是为什么row2是一个bug。谢谢! - moufkir
它是[P(label=i) for i in 0..#labels],与预测无关。如果您使用非标准阈值(优先标签=1),则可能会出现这种情况。否则就是一个bug。总之,没有MCVE的问题是不有用的。 - zero323
显示剩余2条评论
2个回答

1
我将您的问题理解为:在“predictions”列下的数组中,第一个元素是否总是对应于“预测类”,即随机森林分类器预测观察结果应该具有的标签。如果我理解正确,答案是肯定的。
在两个“probability”行中的数组项可以被解读为模型告诉您的内容:
[“我对预测标签=真实标签的信心”,“我对标签!=真实标签的信心”]
如果预测多个标签,则模型会告诉您:
[“我预测的标签=特定标签1的信心”,“我预测的标签=特定标签2的信心”,...,“我预测的标签=特定标签N的信心”]
这由您要预测的N个标签索引(这意味着您必须注意标签的结构方式)。
也许看一下这个答案会有所帮助。你可以像这样做: model = pipeline.fit(trainig_data) predictions = model.transform(test_data) print predictions.show(10) (使用你的示例中相关的流程和数据。)
这将显示每个类别的概率。

感谢@Savage Henry s,就我的情况而言,我只有两个类0和1,我只对始终预测1的概率感兴趣。因此,由于概率数组仅包含2个元素,我采用了始终probability[1]的概率,参考@user6910411的答案。这样正确吗?无论如何,在应用模式下没有真实标签。文档对此并不清楚! - moufkir
1
抱歉,我不太明白你的问题。也许这会有所帮助:阅读你发布的表格条目的方式是(逐列进行):真实标签为0 | 模型预测为0 | [分配给0作为正确标签的概率],[分配给1作为正确标签的概率,即分配给0不是正确标签的概率]。第一个元素与预测值相关;在没有调整其他参数的情况下,它通常始终大于0.50。 - Savage Henry
感谢@Savage Henry抽出时间仔细阅读这些步骤,这澄清了很多问题。现在假设我已经建立好了我的模型,并尝试将其应用于一个新的数据集,该数据集没有标签(0或1)。该模型将生成一个类别的预测(0或1),因此如果我对1的概率感兴趣,我必须按照以下方式进行(如果预测为0,则必须获取probability [1]的概率,如果预测= 1,则必须获取probability [0]的概率)。我是正确的吗? - moufkir
1
这在很大程度上取决于您的建模框架。预测二元结果的标准做法是将目标值设为类似于0和1(或者可能是1和2)这样的数字。一些软件包可以处理分类数据(A或B),但在幕后它们会进行转换。但输出将再次是类似于:| 真实标签为A | 模型预测标签为A | [分配给标签A的概率],[分配给标签B的概率] | - Savage Henry
谢谢@Savage Henry,是的我已经将标签转换为0表示False和1表示True。 就像我在概率列中有一个由2个值组成的数组一样,所以我认为probability[0]是False的概率,而probability[1]是True的概率。 由于Apache文档不是很明确:“probabilityCol Vector”probability“Vector of length # classes equal to rawPrediction normalized to a multinomial distribution Classification only”,请参考https://spark.apache.org/docs/2.1.0/ml-classification-regression.html - moufkir

0

我在这里发布了几乎相同的问题,我认为答案可能会对你有所帮助: Scala: how to know which probability correspond to which class?

答案是在模型拟合之前。

为了拟合模型,我们在目标上使用一个labelIndexer。这个label indexer将目标转换为按降序频率排序的索引。

例如:如果在我的目标中,“aa”的比例为20%,“bb”的比例为80%,则label indexer将创建一个名为“label”的列,该列对于“bb”取值为0,对于“aa”取值为1(因为“bb”比“aa”更频繁)

当我们拟合随机森林时,概率对应于频率的顺序。

在二元分类中:

  • 第一个概率=训练集中最常见类别的概率
  • 第二个概率=训练集中最不常见类别的概率

如果你足够幸运拥有一个版本大于或等于 "2.3.0" 的Spark,你可以使用 "setStringOrderType" 来选择除降序频率之外的其他方式来创建索引(例如:按字母顺序)。 - Anneso
https://github.com/apache/spark/blob/master/mllib/src/main/scala/org/apache/spark/ml/feature/StringIndexer.scala - Anneso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接