某种原因,每当我运行ensemble.RandomForestClassifier()
并使用.predict_proba()
方法时,它都会返回一个 [n_classes, n_samples]
形状的 2D 数组,而不是每个文档应该返回的 [n_samples, n_classes]
形状。
这是我的示例代码:
# generate some sample data
X = np.array([[4, 5, 6, 7, 8],
[0, 5, 6, 2, 3],
[1, 2, 6, 5, 8],
[6, 1, 1, 1, 3],
[2, 5, 3, 2, 0]])
»» X.shape
(5, 5)
y = [['blue', 'red'],
['red'],
['red', 'green'],
['blue', 'green'],
['orange']]
X_test = np.array([[4, 6, 1, 2, 8],
[0, 0, 1, 5, 1]])
»» X_test.shape
(2, 5)
# binarize text labels
mlb = preprocessing.MultiLabelBinarizer()
lb_y = mlb.fit_transform(y)
»» lb_y
[[1 0 0 1]
[0 0 0 1]
[0 1 0 1]
[1 1 0 0]
[0 0 1 0]]
»» lb_y.shape
(5, 4)
到目前为止,一切正常。但是当我这样做时:
rfc = ensemble.RandomForestClassifier(random_state=42)
rfc.fit(X, lb_y)
yhat_p = rfc.predict_proba(X_test)
»» yhat_p
[array([[ 0.5, 0.5],
[ 0.7, 0.3]]),
array([[ 0.4, 0.6],
[ 0.5, 0.5]]),
array([[ 0.7, 0.3],
[ 0.7, 0.3]]),
array([[ 0.7, 0.3],
[ 0.6, 0.4]])]
我的yhat_p
尺寸是[n_classes, n_samples]
而不是[n_samples, n_classes]
。有人可以告诉我为什么我的输出被转置吗?注意:.predict()
方法工作正常。
通过对数据进行二值化,您已经改变了问题,因此您现在正在执行四个单独的分类任务。 每个任务都有两个类,0 和 1,其中 1 表示"具有此标签",0 表示"没有此标签")。
文档中的格式有点奇怪,但它说:
形状数组 = [n_samples, n_classes],或者如果n_outputs> 1 n_outputs此类数组的列表
由于您有四个输出,因此您将获得四个数组的列表。 这些数组中的每一个都是形状 (2, 2),因为您有两个样本(即X_test中的两行)和每个输出的两个类(0 和 1)。 文档中提到的n_classes
是单个输出的类数,而不是您正在执行的所有输出分类中的类总数。 (它返回列表而不是单个数组的原因是,单独的分类不需要具有相同数量的类。 您可以执行多输出分类任务,其中一个输出具有两个类,另一个输出具有 100 个类。
例如,列表中的第一个元素是
array([[ 0.5, 0.5],
[ 0.7, 0.3]]),
每一行都给你一个概率,即相应的X_test
行属于第一个经典任务中的每个类,本质上是"这个项目是蓝色的吗? 因此,第一行告诉您,第一X_test
行有 50% 的几率不是蓝色的,有 50% 的几率是蓝色的;第二行告诉您,第二行X_test
有 70