【问题标题】:Random Forest Classifier :To which class corresponds the probabilities随机森林分类器:与哪个类对应的概率
【发布时间】:2018-09-13 14:22:33
【问题描述】:

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

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

我在 col 概率中有以下内容:

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

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

我的问题:probability[0 始终对应于预测值,而在 spark 文档中不清楚!

【问题讨论】:

  • 我同意,文档不清楚+1。
  • 我会观察到每个概率元组中两个数字的总和为 1。我的猜测是,例如对于 0.0,模型在 90% 的情况下都是正确的,并且10% 的时候它弄错了。
  • 概率对应于连续的标签,所以如果你在实践中看到第二行,那就是一个错误。在这种情况下,欢迎 minimal reproducible example 和/或 JIRA 票证。
  • @user6910411 您的意思是 Probability[0] 始终用于一个类,而 Probabiity[1] 用于另一类。如何判断哪个概率是哪个类和第二个问题为什么 row2 是一个错误。谢谢!
  • 它是[P(label=i) for i in 0..#labels],不依赖于预测。仅当您使用非标准阈值(首选标签 = 1)时,您的情况才有可能。或者这是一个错误。如果没有 MCVE,一种方法或另一种问题是没有用的。

标签: apache-spark machine-learning pyspark random-forest data-science


【解决方案1】:

我将您的问题解释为:“预测”列下的数组中的第一个元素是否始终对应于“预测类别”,您的意思是随机森林分类器预测观察结果应该具有的标签。

如果我的答案是正确的,答案是肯定的。

probability 行中的数组中的项目可以被读取为模型告诉你的:

['My confidence that the predicted label = the true label', 'My confidence that the label != the true label']

在预测多个标签的情况下,模型会告诉你:

['My confidence that the label I predict = specific label 1', 'My confidence that the label I predict = specific label 2', ...'My confidence that the label I predict = specific label N']

这是由您尝试预测的 N 个标签索引的(这意味着您必须注意标签的结构方式)。

也许看看this answer会有所帮助。你可以这样做:

model = pipeline.fit(trainig_data) predictions = model.transform(test_data) print predictions.show(10)

(使用示例中的相关管道和数据。)

这将显示每个类别的概率。

【讨论】:

  • 谢谢@Savage Henry 在我的情况下,我只有 2 个类别 0 和 1,我感兴趣的是只有总是预测 1 的概率。所以概率数组只包含 2 个元素总是概率[1] 指的是@ user6910411 的答案。那是对的吗 ?无论如何,当我们处于应用模式时,没有 True 标签。文档对此并不清楚!
  • 我很抱歉,但我没有关注你的问题。也许这会有所帮助:阅读您发布的表格中的条目的方式是(逐列):真正的标签是 0 |模型预测 0 | [分配给 0 的概率是正确的标签],[1-分配给 0 的概率是正确的标签,AKA 分配给 1 的概率是正确的标签]。第一个元素是相对于预测值的;如果不调整其他参数,它通常总是 >0.50。
  • 感谢@Savage Henry 花时间完成了它澄清了很多的步骤。所以让我们想象一下,现在我已经构建了我的模型,并尝试将其应用于我们没有标签(0 或 1)的新数据集。该模型将生成一个类(0或1)的预测,所以如果我对1的概率感兴趣,我必须像这样经历(如果预测为0,那么我必须采用概率[1]如果预测= 1 我必须得到概率[0]。对吗?
  • 这在很大程度上取决于您的建模框架。预测二元结果的标准做法是使目标值类似于 0 和 1(或者可能是 1 和 2),以便它们是数字的。一些包可以处理分类数据(A 或 B),但在幕后他们正在进行转换。但输出将再次类似于:|真正的标签是 A |模型预测标签为 A | [分配给标签的概率为 A],[分配给标签的概率为 B] |
  • 谢谢@Savage Henry,是的,我已经将标签转换为 0 代表 False 和 1 代表 True。就像我在概率列中有一个包含 2 个值的数组一样,所以我认为概率 [0] 是错误的概率,概率 [1] 是真的概率。由于 apache 的文档不是很明确:“probabilityCol Vector”probability” Vector of length # classes equal to rawPrediction normalized to a multinomial distribution Classification only”spark.apache.org/docs/2.1.0/ml-classification-regression.html
【解决方案2】:

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

答案在模型拟合之前。

为了适应模型,我们在目标上使用 labelIndexer。此标签索引器将目标按频率降序转换为索引。

例如:如果在我的目标中,我有 20% 的“aa”和 80% 的“bb”标签索引器将创建一个列“label”,其值为 0 表示“bb”,1 表示“aa”(因为我“bb”比“aa”更频繁)

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

在二分类中:

  • first proba = 该类是训练集中出现频率最高的类的概率
  • second proba = 该类是训练集中频率较低的类的概率

【讨论】:

猜你喜欢
  • 2014-05-28
  • 2013-01-10
  • 2017-07-02
  • 2018-02-18
  • 2017-04-24
  • 2015-05-03
  • 1970-01-01
  • 2016-06-09
  • 2018-05-20
相关资源
最近更新 更多