2017-07-04 2 views
0

Für eine DS-Konkurrenz verwendete ich SVM, um eine binäre Klassifizierung durchzuführen. Hier haben tdata, vdata beide 256 Features. tlabels, vlabels haben beide Dimensionen n_samples x 1 und ihre eindeutigen Werte sind 0/1.Etikettenvorhersage zur Wahrscheinlichkeitsvorhersage/AUC mit scikit-learn SVM

Nun müssen wir gemäß den Wettbewerbsregeln anstelle von Labels einen Wahrscheinlichkeitswert (zwischen 0 und 1) angeben, und AUC wird verwendet, um das Ranking zu bestimmen.

Ich bin ziemlich neu in SVMs und Sklearn. Hinweise, wie Sie diesen Code konvertieren können, um Wahrscheinlichkeitswerte und AUC zu generieren, sind sehr hilfreich.

Code:

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced') 
classifier.fit(tdata, tlabels) 
expected = vlabels 
predicted = classifier.predict(vdata) 

print("Classification report for classifier %s:\n%s\n" 
     % (classifier, metrics.classification_report(expected, predicted))) 
cm = metrics.confusion_matrix(expected, predicted) 
accuracy = (cm[0,0]+cm[1,1])*100.0/sum(sum(cm)) 
print("accuracy = "+str(accuracy)) 

Ausgang:

Classification report for classifier SVC(C=1.0, cache_size=200, class_weight='balanced', coef0=0.0, 
    decision_function_shape=None, degree=3, gamma=0.00020000000000000001, 
    kernel='rbf', max_iter=-1, probability=False, random_state=None, 
    shrinking=True, tol=0.001, verbose=False): 
      precision recall f1-score support 

     0.0  0.93  0.88  0.90  1881 
     1.0  0.92  0.95  0.94  2686 

avg/total  0.92  0.92  0.92  4567 


accuracy = 92.3144296037 
+0

Haben Sie betrachtet [sklearn.metrics.auc] (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html) – shanmuga

+0

Ja, aber wie ändere ich den Klassifikator, um Wahrscheinlichkeitswerte zwischen 0 und 1 auszugeben? – dharm0us

+0

Für die Wahrscheinlichkeiten habe ich eine Antwort geschrieben, für die AUC sklearn.metrics.auc sollte gut funktionieren – sera

Antwort

1

Verwenden predict_proba Funktion von SVC für Wahrscheinlichkeiten statt Klassen zu erhalten.
Zur Verwendung predict_proba Funktion auf SVC Parameter probability=True sollte während der Initialisierung gegeben werden.

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced', probability=True) # parameter probability=True should be given 
classifier.fit(tdata, tlabels) 
expected = vlabels 
predicted = classifier.predict(vdata) 
pred_proba = classifier.predict_proba(vdata) # predict_proba function call 

fpr, tpr, thresholds = metrics.roc_curve(labels, proba_one) 
metrics.auc(fpr, tpr) 

Referenz:
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

+0

Weiß jemand, wie kann ich vorhergesagte Wahrscheinlichkeiten in Klassenbeschriftungen konvertieren? Meine Klassifizierung ist nicht binär. Ich habe durchschnittlich zwei Modelle genommen und muss sie zurück in Etiketten konvertieren. – Saif

+0

'predicate_proba' gibt eine Wahrscheinlichkeit für jede Klassenbezeichnung für jeden Datensatz. Angenommen, Sie haben 4 Klassenbezeichnungen, bedeutet dies, dass Sie für jeden Datensatz 4 Wahrscheinlichkeit haben (bis zu 1.0). Sie wählen die Klassenbezeichnung mit der höchsten Wahrscheinlichkeit aus. – shanmuga

+0

'predicate_proba' gibt ein eindimensionales Array zurück, einen Wahrscheinlichkeitswert für jeden Datensatz.Siehe hierzu [Frage] (https://stackoverflow.com/questions/47486385/scikit-learn-convert-prediciton-probabilities-to-labeled-predictions) zum besseren Verständnis. – Saif

1

Schritt 1

definieren: probability=True in SVC (dieser Parameter für SVC verfügbar ist) sehen link.

classifier=svm.SVC(gamma=g,C=c,kernel='rbf',class_weight='balanced', probability=True) 

Schritt 2

Dann brauchen Sie predict_proba Methode zu verwenden.

Beispiel:

classifier.fit(X,y) 
classifier.predict_proba(X) 

Das Ergebnis ist die Wahrscheinlichkeit, dass Sie sich im Bereich wollen [0,1].

Hoffe, das hilft.

SVC link

predict_proba