Python RandomForestClassifier为多标签类提供转置输出

Python RandomForestClassifier为多标签类提供转置输出,python,scikit-learn,random-forest,Python,Scikit Learn,Random Forest,出于某种原因,每当我运行集成.RandomForestClassifier()并使用.predict\u proba()方法时,它都会以[n\u classes,n\u samples]的形式返回一个2d数组,而不是它应该返回的[n\u samples,n\u classes]形状 以下是我的示例代码: # generate some sample data X = np.array([[4, 5, 6, 7, 8], [0, 5, 6, 2, 3],

出于某种原因,每当我运行
集成.RandomForestClassifier()
并使用
.predict\u proba()
方法时,它都会以
[n\u classes,n\u samples]
的形式返回一个2d数组,而不是它应该返回的
[n\u samples,n\u 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_类,n_类]
而不是
[n_类,n_类]
。有人能告诉我为什么我的输出是转置的吗?注意:
.predict()
方法工作得很好。

通过对数据进行二值化,您已经解决了问题,因此您现在要执行四个单独的分类任务。每个任务都有两个类,0和1,其中1表示“有此标签”,0表示“没有此标签”)

文档中的格式有点奇怪,但上面说:

形状数组=[n_个样本,n_个类],或者如果n_个输出>1,则n_个输出的数组列表

因为您有四个输出,所以可以得到四个数组的列表。这些数组中的每一个都是形状(2,2),因为每个输出有两个样本(即X_测试中的两行)和两个类(0和1)。文档中提到的
n_classes
是单个输出的类数,而不是您正在执行的所有输出分类的类总数。(它返回列表而不是单个数组的原因是,不要求单独的分类具有相同数量的类。您可以执行多输出分类任务,其中一个输出具有两个类,另一个输出具有100个类。)

例如,列表中的第一个元素是

array([[ 0.5,  0.5],
        [ 0.7,  0.3]]), 

每一行都给出了
X_测试
的对应行属于第一个分类任务中的每个类的概率,本质上是“该项目是否为蓝色?”因此第一行告诉您第一个
X_测试
行不为蓝色的概率为50%,蓝色的概率为50%;第二行告诉您,第二个
X\u测试
行不为蓝色的概率为70%,为蓝色的概率为30%。

“文档中提到的n\u类是单个输出的类数,而不是您正在执行的所有输出分类的总类数”-这样就可以了。谢谢