【问题标题】:Scikit Learn Multilabel Classification: ValueError: You appear to be using a legacy multi-label data representationScikit 学习多标签分类:ValueError:您似乎正在使用旧的多标签数据表示
【发布时间】:2016-03-16 18:08:43
【问题描述】:

我正在尝试使用 scikit learn 0.17 和 anaconda 2.7 来解决多标签分类问题。这是我的代码

import pandas as pd
import pickle
import re
from sklearn.cross_validation import train_test_split
from sklearn.metrics.metrics import classification_report, accuracy_score, confusion_matrix
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB as MNB
from sklearn.pipeline import Pipeline
from sklearn.grid_search import GridSearchCV

traindf = pickle.load(open("train.pkl","rb"))

X, y = traindf['colC'], traindf['colB'].as_matrix()

Xtrain, Xtest, ytrain, ytest = train_test_split(X, y, train_size=0.7)

pip = Pipeline([
('vect', TfidfVectorizer(
                        analyzer='word',
                        binary=False,
                        decode_error='ignore',
                        dtype=<type 'numpy.int64'>,
                        encoding=u'utf-8',
                        input=u'content',
                        lowercase=True,
                        max_df=0.25,
                        max_features=None,
                        min_df=1,
                        ngram_range=(1, 1),
                        norm=u'l2',
                        preprocessor=None,
                        smooth_idf=True,
                        stop_words='english',
                        strip_accents=None,
                        sublinear_tf=True,
                        token_pattern=u'(?u)\\b\\w\\w+\\b',
                        tokenizer=nltk.data.load('tokenizers/punkt/english.pickle'),
                        use_idf=True, vocabulary=None)),
('clf', LogisticRegression(
                        C=10,
                        class_weight=None,
                        dual=False,
                        fit_intercept=True,
                        intercept_scaling=1,
                        max_iter=100,
                        multi_class='multinomial',
                        n_jobs=1,
                        penalty='l2', 
                        random_state=None, 
                        solver='lbfgs',
                        tol=0.0001,
                        verbose=0, 
                        warm_start=False))
                ])

parameters = {}

gridSearchTS = GridSearchCV(pip,parameters,n_jobs=3, verbose=1, scoring='accuracy')
gridSearchTS.fit(Xtrain, ytrain)

predictions = gridSearchTS.predict(Xtest)

print ('Accuracy:', accuracy_score(ytest, predictions))
print ('Confusion Matrix:', confusion_matrix(ytest, predictions))
print ('Classification Report:', classification_report(ytest, predictions))

testdf = pickle.load(open("test.pkl","rb"))

predictions=gridSearchTS.predict(testdf['colC'])

testdf['colB'] = predictions

print(testdf.info())

testdf.to_csv("res.csv")

这是我的数据的样子

训练

colC                colB
some text           [list of tags]
some text           [list of tags]

测试

colC                    
some text           
some text

但我得到了错误

raise ValueError('You appear to be using a legacy multi-label data'
ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.

这是什么意思?

这是完整的堆栈跟踪

Traceback (most recent call last):

  File "X:\asd.py", line 34, in getTags
    gridSearchTS.fit(Xtrain, ytrain)
  File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\grid_search.py", line 804, in fit
    return self._fit(X, y, ParameterGrid(self.param_grid))
  File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\grid_search.py", line 532, in _fit
    cv = check_cv(cv, X, y, classifier=is_classifier(estimator))
  File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\cross_validation.py", line 1676, in check_cv
    if type_of_target(y) in ['binary', 'multiclass']:
  File "X:\popol\Continuum\Anaconda2\lib\site-packages\sklearn\utils\multiclass.py", line 251, in type_of_target
    raise ValueError('You appear to be using a legacy multi-label data'
ValueError: You appear to be using a legacy multi-label data representation. Sequence of sequences are no longer supported; use a binary array or sparse matrix instead.

我该如何解决这个问题?我需要更改数据的格式吗?为什么 gridSearchTS.fit(Xtrain, ytrain) 失败? 如何让 X 和 y 适合 fit 函数?

编辑

我试过了

        from sklearn.preprocessing import MultiLabelBinarizer  
        y=MultiLabelBinarizer().fit_transform(y)      

        random_state = np.random.RandomState(0)


        # Split into training and test
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5,
                                                            random_state=random_state)

        # Run classifier
        from sklearn import svm, datasets
        classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,
                                         random_state=random_state))
        y_score = classifier.fit(X_train, y_train).decision_function(X_test)

但现在我明白了

ValueError: could not convert string to float: <value of ColC here>

y_score = classifier.fit(X_train, y_train).decision_function(X_test) 

我也必须对 X 进行二值化吗?为什么我需要将 X 维度转换为浮点数?

【问题讨论】:

  • 我会说错误信息很清楚。哪一部分你不明白?
  • 我该如何解决这个问题?我需要更改数据的格式吗?为什么 gridSearchTS.fit(Xtrain, ytrain) 失败?如何使 X 和 y 适合 fit 函数?
  • 第二个和第四个问题比你最初的“这是什么意思?”更清楚。题。您可能需要更新您的问题以将其放入。
  • scikit-learn 文档在这里可能会有所帮助。特别是section on multilabel classification format,其中包括一个从一种格式转换为另一种格式的示例。
  • 谢谢,我做了编辑。为什么投反对票?

标签: python machine-learning scikit-learn multilabel-classification


【解决方案1】:

文档给出了这个例子:

>>> from sklearn.preprocessing import MultiLabelBinarizer
>>> y = [[2, 3, 4], [2], [0, 1, 3], [0, 1, 2, 3, 4], [0, 1, 2]]
>>> MultiLabelBinarizer().fit_transform(y)
array([[0, 0, 1, 1, 1],
       [0, 0, 1, 0, 0],
       [1, 1, 0, 1, 0],
       [1, 1, 1, 1, 1],
       [1, 1, 1, 0, 0]])

MultiLabelBinarizer.fit_transform 接收您的标记集并可以输出二进制数组。然后输出应该可以传递给您的 fit 函数。

【讨论】:

猜你喜欢
  • 2017-09-01
  • 2015-08-26
  • 2016-12-06
  • 2016-10-17
  • 2017-07-21
  • 2020-03-09
  • 1970-01-01
  • 2013-12-18
  • 2017-07-05
相关资源
最近更新 更多