【问题标题】:Predicting multilabel data with sklearn使用 sklearn 预测多标签数据
【发布时间】:2016-05-06 12:48:05
【问题描述】:

根据文档,OneVsRest 分类器支持多标签分类:http://scikit-learn.org/stable/modules/multiclass.html#multilabel-learning

这是我要运行的代码:

from sklearn import metrics
from sklearn.preprocessing import MultiLabelBinarizer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.cross_validation import train_test_split
from sklearn.svm import SVC

x = [[1,2,3],[3,3,2],[8,8,7],[3,7,1],[4,5,6]]
y = [['bar','foo'],['bar'],['foo'],['foo','jump'],['bar','fox','jump']]

y_enc = MultiLabelBinarizer().fit_transform(y)

train_x, train_y, test_x, test_y = train_test_split(x, y_enc, test_size=0.33)

clf = OneVsRestClassifier(SVC())
clf.fit(train_x, train_y)
predictions = clf.predict_proba(test_x)

my_metrics = metrics.classification_report( test_y, predictions)
print my_metrics

我收到以下错误:

Traceback (most recent call last):
  File "multilabel.py", line 178, in <module>
    clf.fit(train_x, train_y)
  File "/sklearn/lib/python2.6/site-packages/sklearn/multiclass.py", line 277, in fit
    Y = self.label_binarizer_.fit_transform(y)
  File "/sklearn/lib/python2.6/site-packages/sklearn/base.py", line 455, in fit_transform
    return self.fit(X, **fit_params).transform(X)
  File "/sklearn/lib/python2.6/site-packages/sklearn/preprocessing/label.py", line 302, in fit
    raise ValueError("Multioutput target data is not supported with "
ValueError: Multioutput target data is not supported with label binarization

不使用 MultiLabelBinarizer 会产生相同的错误,所以我假设这不是问题。有谁知道如何将此分类器用于多标签数据?

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    您的train_test_split() 输出不正确。更改此行:

    train_x, train_y, test_x, test_y = train_test_split(x, y_enc, test_size=0.33)

    到这里:

    train_x, test_x, train_y, test_y = train_test_split(x, y_enc, test_size=0.33)

    此外,要使用概率而不是类别预测,您需要将 SVC() 更改为 SVC(probability = True) 并将 clf.predict_proba 更改为 clf.predict

    把它们放在一起:

    from sklearn import metrics
    from sklearn.preprocessing import MultiLabelBinarizer
    from sklearn.multiclass import OneVsRestClassifier
    from sklearn.cross_validation import train_test_split
    from sklearn.svm import SVC
    
    
    x = [[1,2,3],[3,3,2],[8,8,7],[3,7,1],[4,5,6]]
    y = [['bar','foo'],['bar'],['foo'],['foo','jump'],['bar','fox','jump']]
    
    mlb = MultiLabelBinarizer()
    y_enc = mlb.fit_transform(y)
    
    train_x, test_x, train_y, test_y = train_test_split(x, y_enc, test_size=0.33)
    
    clf = OneVsRestClassifier(SVC(probability=True))
    clf.fit(train_x, train_y)
    predictions = clf.predict(test_x)
    
    my_metrics = metrics.classification_report( test_y, predictions)
    print my_metrics
    

    这在我运行它时不会给我任何错误。

    【讨论】:

    • 如何从文本列表中导出 x DataFrame?
    【解决方案2】:

    我还遇到了 OneVsRestClassifier 的“ValueError:标签二值化不支持多输出目标数据”。我的问题是由训练数据类型为“列表”引起的,在使用 np.array() 进行转换后,它可以工作。

    【讨论】:

      【解决方案3】:

      对我来说,在 np.array() 中包装 train_xtrain_ytext_xtest_y 已经解决了这个问题。

      【讨论】:

        猜你喜欢
        • 2015-05-15
        • 2013-12-08
        • 2018-03-18
        • 2016-12-11
        • 2022-06-28
        • 2020-05-18
        • 2018-10-15
        • 2018-05-07
        相关资源
        最近更新 更多