RandomForestClassifier不预测所有类的概率

时间:2015-08-21 19:42:47

标签: python scipy scikit-learn random-forest

clf = RandomForestClassifier(min_samples_leaf=20)
clf.fit(X_train, y)
prob_pos= clf.predict_proba(X_test)

尺寸:

 (Pdb) print X_train.shape,X_test.shape,y.shape
    (1422392L, 14L) (233081L, 14L) (1422392L, 6L)

输出:

(Pdb) prob_pos
[array([[ 0.96133658,  0.03866342],
       [ 0.93514554,  0.06485446],
       [ 0.91520408,  0.08479592],
       ...,
       [ 0.95826389,  0.04173611],
       [ 0.97130832,  0.02869168],
       [ 0.93223876,  0.06776124]]), array([[ 0.9907225 ,  0.0092775 ],
       [ 0.94489664,  0.05510336],
       [ 0.98428571,  0.01571429],
       ...,
       [ 0.96415476,  0.03584524],
       [ 0.99193939,  0.00806061],
       [ 0.98918919,  0.01081081]]), array([[ 0.9907225 ,  0.0092775 ],
       [ 0.98253968,  0.01746032],
       [ 0.98166667,  0.01833333],
       ...,
       [ 0.96415476,  0.03584524],
       [ 0.99444444,  0.00555556],
       [ 0.99004914,  0.00995086]]), array([[ 1.        ,  0.        ],
       [ 0.99642857,  0.00357143],
       [ 0.98082011,  0.01917989],
       ...,
       [ 0.96978897,  0.03021103],
       [ 0.97467974,  0.02532026],
       [ 1.        ,  0.        ]]), array([[ 1.        ,  0.        ],
       [ 1.        ,  0.        ],
       [ 0.98238095,  0.01761905],
       ...,
       [ 1.        ,  0.        ],
       [ 0.99661017,  0.00338983],
       [ 0.99428571,  0.00571429]]), array([[ 1.        ,  0.        ],
       [ 1.        ,  0.        ],
       [ 0.99285714,  0.00714286],
       ...,
       [ 0.99705882,  0.00294118],
       [ 0.97885167,  0.02114833],
       [ 0.98688312,  0.01311688]])]

我不明白为什么概率不是X-train_samples x 6?

1 个答案:

答案 0 :(得分:2)

由于y.shape是(1422392L,6L),因此您有6种不同的输出。因此,您有一个包含6个数组的列表作为概率输出。由于每个数组都有2列,因此我得出结论,每个输出都有2个类。确实有2个班吗?然后一切看起来都很好。

如果6个类是单热编码的,如[1,0,0,0,0,0],则实际上是6个输出的2个类。然后列表中的第一个数组为你提供" 0"和" 1"第一个输出的概率,第二个数组的概率为" 0"和" 1"第二个输出的概率等等。

您正在解决here in scikit-learn documentaion所述的多输出问题,请参阅" 1.10.3。多输出问题"。

获得6个类的概率的最简单方法是将类编码为1,2,3,4,5,6并将y编码为1列。然后你将获得一个包含6列作为概率的数组

如果您有时同时拥有这两个课程,例如[1,0,1,0,0,1],那么您的问题本质上是多输出的(在我的评论中它表示'多课程'这是一个误导)。要获得6个类的概率,您需要收集列表中每个数组的第二列。代码是

prob_nx6 = np.array([arr[:,1] for arr in prob_pos]).T

现在我正在编辑这个答案,我想出了一个更简单的代码

prob_nx6 = np.hstack(prob_pos)[:,1::2] 

这将为您提供一个2D数组形状(n,6)(在您的情况下n = 1422392)。如果你想要一个长度为6的n个数组的列表,那么简单的代码就是

prob_nx6_liofarr = list(np.hstack(prob_pos)[:,1::2]) 

如果在此列表中,每个元素必须是list而不是array(即列表列表),则代码为

prob_nx6_liofli = np.hstack(prob_pos)[:,1::2].tolist() 
相关问题