从 MultiOutputClassifier 了解 predict_proba

数据挖掘 scikit-学习 随机森林 多标签分类
2021-09-23 20:34:10

在 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_samplen_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_'
3个回答

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

这两个总和为 1。

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

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

如果您有 k 个类别,则输出将是 (N,k),您必须指定您想要的类别的概率。

在 中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)

对于第一个问题:

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

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

如果要检查这一点,可以将这些数组中的值与predict.

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