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?
由于y.shape
是(1422392L, 6L),因此您有6个不同的输出。因此,您有一个包含6个数组的列表作为概率输出。由于每个数组有2列,因此我得出结论,每个输出有2个类。真的有两个班吗?那么我觉得一切都很好。
如果6个类是像[1,0,0,0,0,0]
一样的单热编码,这实际上是6个输出的2个类。然后列表中的第一个数组给出第一次输出的"0"one_answers"1"概率,第二个数组给出第二次输出的"0"one_answers"1"概率,依此类推。
您实际解决了scikit-learn文档中描述的多输出问题,参见"1.10.3"。多输出问题"。
获得6个类的概率的最简单方法是将您的类编码为1,2,3,4,5,6,并获得具有1列的y
。然后你将得到一个包含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]
这将给你一个形状为(n,6)的二维数组(在你的例子中是n=1422392)。如果您想要一个包含n个数组的列表,每个数组的长度为6,那么简单的代码是
prob_nx6_liofarr = list(np.hstack(prob_pos)[:,1::2])
如果列表中的每个元素必须是list而不是array(即列表的列表),则代码为
prob_nx6_liofli = np.hstack(prob_pos)[:,1::2].tolist()