2016-10-15 2 views
5

I eine Pipeline in scikit lernen am ErstellenVerwendung Konfusionsmatrix als scoring metric in Kreuzvalidierung in scikit lernen

pipeline = Pipeline([ 
    ('bow', CountVectorizer()), 
    ('classifier', BernoulliNB()), 
]) 

und Berechnen der Genauigkeit unter Verwendung von Kreuzvalidierung

scores = cross_val_score(pipeline, # steps to convert raw messages  into models 
        train_set, # training data 
        label_train, # training labels 
        cv=5, # split data randomly into 10 parts: 9 for training, 1 for scoring 
        scoring='accuracy', # which scoring metric? 
        n_jobs=-1, # -1 = use all cores = faster 
        ) 

Wie kann ich berichten Verwirrung Matrix statt "Genauigkeit"?

Antwort

7

Kurze Antwort ist „Sie kann nicht“.

Sie benötigen Unterschied zwischen cross_val_score und Kreuzvalidierung als Modellauswahlmethode zu verstehen. cross_val_score wie Name schon sagt, funktioniert nur auf Partituren. Die Verwirrungsmatrix ist keine Punktzahl, sondern eine Zusammenfassung dessen, was während der Auswertung passiert ist. Ein wesentlicher Unterschied besteht darin, dass ein Score soll ein bestellbaren Objekt, insbesondere in zurückzukehren Scikit-Learn - einen Schwimmer. Anhand des Ergebnisses können Sie feststellen, ob Methode b besser ist, indem Sie einfach vergleichen, ob b eine größere Punktzahl hat. Das kann man nicht mit der Konfusionsmatrix tun, die, wie der Name schon sagt, eine Matrix ist.

Wenn Sie Verwirrungsmatrizen für mehrere Auswertungsläufe (wie Kreuzvalidierung) erhalten möchten, müssen Sie dies manuell tun, was in scikit-learn nicht so schlimm ist - es sind eigentlich ein paar Zeilen Code.

kf = cross_validation.KFold(len(y), n_folds=5) 
for train_index, test_index in kf: 

    X_train, X_test = X[train_index], X[test_index] 
    y_train, y_test = y[train_index], y[test_index] 

    model.fit(X_train, y_train) 
    print confusion_matrix(y_test, model.predict(X_test)) 
12

könnten Sie cross_val_predict anstelle von cross_val_score.

anstatt das zu tun:

from sklearn.model_selection import cross_val_score 
scores = cross_val_score(clf,x,y,cv=10) 

können Sie tun:

from sklearn.model_selection import cross_val_predict 
from sklearn.metrics import confusion_matrix 
y_pred = cross_val_predict(clf,x,y,cv=10) 
conf_mat = confusion_matrix(y,y_pred) 
0

Was können Sie tun, ist aber eine Scorer zu definieren, die bestimmte Werte aus die Konfusionsmatrix verwendet. Siehe here [link]. Nur unter Berufung auf den Code:

Dies wird die Kreuzvalidierung für jede dieser vier scorers durchführen und den Scoring-Wörterbuch cv_results, zB zurückkehrt, mit den Tasten test_tp, test_tn usw. Die Verwirrung Matrizen Werte von jeder Kreuzung enthalten -validierungssplit

Daraus könnte man eine durchschnittliche Konfusionsmatrix rekonstruieren, dafür scheint die cross_val_predict von Xema eleganter zu sein.

Beachten Sie, dass dies tatsächlich nicht mit cross_val_score arbeiten; Sie cross_validate (in Scikit-Learn v0.19 eingeführt) benötigen.

Seitennotiz: Sie könnten einen dieser Scorer (d. H. Ein Element der Matrix) für Hyper-Parameter-Optimierung über Raster-Suche verwenden.

* BEARBEITEN: Wahre Negative werden bei [1, 1] zurückgegeben, nicht [0, 0]

Verwandte Themen