【问题标题】:RandomForestClassifier give transposed output for multi-label classesRandomForestClassifier 为多标签类提供转置输出
【发布时间】:2016-02-23 21:36:57
【问题描述】:

由于某种原因,每当我运行ensemble.RandomForestClassifier() 并使用.predict_proba() 方法时,它都会返回[n_classes, n_samples] 形状的二维数组,而不是应该为per the docs.[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() 方法可以正常工作。

【问题讨论】:

    标签: python scikit-learn random-forest


    【解决方案1】:

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

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

    array of shape = [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% 的可能性是蓝色的。

    【讨论】:

    • “文档中提到的 n_classes 是单个输出的类数,而不是您正在执行的所有输出分类的总类数” - 就可以了。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 2016-12-15
    • 2020-04-02
    • 2022-01-21
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多