从MultiOutputClassifier了解predict_proba


28

我正在scikit-learn网站上跟踪此示例,以使用随机森林模型执行多输出分类。

from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np

X, y1 = make_classification(n_samples=5, n_features=5, n_informative=2, n_classes=2, random_state=1)
y2 = shuffle(y1, random_state=1)
Y = np.vstack((y1, y2)).T

forest = RandomForestClassifier(n_estimators=10, random_state=1)
multi_target_forest = MultiOutputClassifier(forest, n_jobs=-1)
multi_target_forest.fit(X, Y).predict(X)

print(multi_target_forest.predict_proba(X))

由此predict_proba我得到2个5x2数组:

[array([[ 0.8,  0.2],
       [ 0.4,  0.6],
       [ 0.8,  0.2],
       [ 0.9,  0.1],
       [ 0.4,  0.6]]), array([[ 0.6,  0.4],
       [ 0.1,  0.9],
       [ 0.2,  0.8],
       [ 0.9,  0.1],
       [ 0.9,  0.1]])]

我真的很期待n_sample通过n_classes矩阵。我正在努力了解这与存在的类的概率之间的关系。

文档predict_proba状态:

形状数组= [n_samples,n_classes],或者如果n_outputs> 1,则由n_outputs组成的数组列表。

输入样本的分类概率。类的顺序与属性classes_中的顺序相对应。

我想我的描述中有后者,但我仍在努力理解这与我的课堂概率有何关系。

此外,当我尝试访问模型的classes_属性时,forest我得到了,AttributeError而该属性在上不存在MultiOutputClassifier。如何将类与输出关联?

print(forest.classes_)

AttributeError: 'RandomForestClassifier' object has no attribute 'classes_'

Answers:


31

假设目标为(0,1),则分类器将输出维度为(N,2)的概率矩阵。第一个索引是指数据属于类别0的概率,第二个索引是指数据属于类别1的概率。

这两个总和为1。

然后可以通过以下方式输出结果:

probability = model.predict_proba(X)[:,1]

如果您有k个类别,则输出为(N,k),则必须指定所需类别的概率。


2
如果是这种情况,我仍然对为什么每个班级有两列感到困惑。如果每个类别都有自己的条目,那么每个条目都不应该是(N,1)矩阵来说明该类别的概率吗?
哈帕

2
两个类别的两列,请回想一下,当您定义target(0,1)时,有两个类别。每个行/数据点都需要对0和1进行预测。例如,数据点1有80%的可能性属于0,而20%的可能性属于1。输出为(0.8,0.2)。如果您要对1进行预测,则需要访问prediciton [:,1]以获取第二列。通常,如果您希望获得第k类的可能性,则需要访问预测[:,k]
chrisckwong821

1
这似乎忽略了这个问题是关于多输出模型的。
Ben Reiniger

2

在中MultiOutputClassifier,您将两个输出视为单独的分类任务;从您链接的文档中:

该策略包括为每个目标配备一个分类器。

因此,结果列表中的两个数组分别代表两个分类器/因变量。然后,这些数组是@ chrisckwong821提到的二进制分类输出(列的类别为0类,概率为1类),但每个问题对应一个。

换句话说,的返回值predict_proba将是一个列表,该列表的长度等于您的宽度y,即n_outputs您的情况2。您从predict_proba文档参考中引述的内容,在文档中n_outputs对此进行了介绍fit

fit(self, X, y[, sample_weight])

y :(稀疏)类似数组的形状 (n_samples, n_outputs)


我同意您的意见,最赞成的答案没有回答问题,也没有解释为什么会有(N,2)个形状的数组。您的回答确实回答了以下问题:n_outputs
红豌豆

1
谢谢,我很惊讶地发现另一个答案如此之高。并感谢您的编辑!
Ben Reiniger

0

对于第一个问题:

第一个5x2数组为您提供了分类在第一类中的5个测试样本的概率。此外,此5x2数组的第一列告诉您“测试样本未归为第一类的概率”,此5x2数组的第二列告诉您“测试样本未归为第一类的概率” ”。

同样,第二个5x2数组为您提供第二类测试样本的分类概率。

如果要进行检查,可以将这些数组中的值与中的结果进行对比predict

有时,返回predict_proba可能会给您一个包含Nx1数组和Nx2数组的列表。如果是这样,则没有测试数据被归类为代表这些类的Nx1阵列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.