2017-07-04 8 views
0

Pour une compétition DS, j'utilisais SVM pour faire une classification binaire. Ici, tdata, vdata ont tous deux 256 caractéristiques. tlabels, vlabels ont tous deux des dimensions n_samples x 1 et leurs valeurs uniques sont 0/1. Maintenant, selon les règles de la compétition, à la place des étiquettes, nous devons soumettre le score de probabilité (entre 0 et 1) et l'AUC sera utilisé pour décider du classement. Je suis assez nouveau pour les SVM et Sklearn. Tout pointeur sur la façon de convertir ce code pour générer des scores de probabilité et AUC, sera d'une grande aide.Prédiction de l'étiquette à la prédiction de score de probabilité/AUC en utilisant scikit-learn SVM

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)) 

Sortie:

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

Avez-vous regardé [sklearn.metrics.auc] (http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html) – shanmuga

+0

Oui, mais comment puis-je modifier le classificateur pour générer des scores de probabilité entre 0 et 1? – dharm0us

+0

Pour les probabilités j'ai posté une réponse, pour l'AUC sklearn.metrics.auc devrait fonctionner bien – sera

Répondre

1

Utilisez la fonction predict_proba de SVC pour obtenir des probabilités au lieu de classes.
Pour utiliser la fonction predict_proba sur SVC, le paramètre probability=True doit être donné lors de l'initialisation.

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) 

Référence:
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.auc.html
http://scikit-learn.org/stable/modules/generated/sklearn.svm.SVC.html

+0

Est-ce que quelqu'un sait comment je peux convertir des probabilités prédites en étiquettes de classe? Ma classification n'est pas binaire. J'ai pris en moyenne deux modèles et j'ai besoin de les convertir en étiquettes. – Saif

+0

'predict_proba' donne une probabilité pour chaque étiquette de classe pour chaque enregistrement. Supposons que vous ayez 4 étiquettes de classe, cela signifie que pour chaque enregistrement, vous aurez 4 probabilités (en ajoutant jusqu'à 1.0). Vous sélectionnez l'étiquette de classe avec la plus forte probabilité. – shanmuga

+0

'predict_proba' renvoie un tableau unidimensionnel, une valeur de probabilité pour chaque enregistrement.Reportez-vous à cette [question] (https://stackoverflow.com/questions/47486385/scikit-learn-convert-prediciton-probabilities-to-labelled-predictions) pour une meilleure compréhension. – Saif

1

Étape 1

Define: probability=True in SVC (ce paramètre est disponible pour SVC) voir link.

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

Étape 2

Ensuite, vous devez utiliser la méthode predict_proba.

Exemple:

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

Le résultat est la probabilité que vous voulez dans la gamme [0,1].

Espérons que cela aide.

SVC link

predict_proba