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类是单个输出的类数,而不是您正在执行的所有输出分类的总类数”-这样就可以了。谢谢