随机森林分类器为多标签类提供转置输出


出于

某种原因,每当我运行ensemble.RandomForestClassifier()并使用.predict_proba()方法时,它都会返回一个 [n_classes, n_samples] 形状的 2D 数组,而不是每个文档应该返回的 [n_samples, n_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_classes, n_samples]而不是[n_samples, n_classes]。有人可以告诉我为什么我的输出被转置吗?注意:.predict()方法工作正常。

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

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

形状数组 = [n_samples, n_classes],或者如果n_outputs> 1 n_outputs此类数组的列表

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

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

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

每一行都给你一个概率,即相应的X_test行属于第一个经典任务中的每个类,本质上是"这个项目是蓝色的吗? 因此,第一行告诉您,第一X_test行有 50% 的几率不是蓝色的,有 50% 的几率是蓝色的;第二行告诉您,第二行X_test有 70

% 的可能性不是蓝色的,有 30% 的可能性是蓝色的。

相关内容

  • 没有找到相关文章

最新更新