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?
答案 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()