2016-05-06 1 views
3

Nach den Dokumenten, die OneVsRest Klassifikator unterstützt Multilabel Klassifizierung: http://scikit-learn.org/stable/modules/multiclass.html#multilabel-learningVorhersage Multilabel Daten mit sklearn

Hier ist der Code, den ich zu laufen bin versucht:

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 

bekomme ich folgende Fehlermeldung:

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 

Nicht den MultiLabelBinarizer verwenden gibt den gleichen Fehler, also nehme ich an, dass das nicht das Problem ist. Kann jemand diesen Klassifikator für multilabel Daten verwenden?

Antwort

4

Ihr train_test_split() Ausgang ist nicht korrekt. Ändern Sie diese Zeile:

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

Um dies:

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

Auch Wahrscheinlichkeiten zu verwenden, anstatt der Klasse Prognosen, müssen Sie SVC() zu SVC(probability = True) ändern und clf.predict_proba zu clf.predict ändern.

setzen sie alle zusammen:

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 

Das bin ich keine Fehler gibt, wenn ich es laufen.

+0

Wie würden Sie den x DataFrame aus einer Textliste ableiten? – MyopicVisage

2

Ich erfuhr auch "ValueError: Multioutput Zieldaten wird nicht mit Label Binarisierung unterstützt" mit OneVsRestClassifier. Mein Problem wurde durch die Art der Trainingsdaten verursacht, die "list" war, nach dem Gießen mit np.array() funktioniert es.