2017-11-30 2 views
0

Also habe ich ein kleines Beispiel mit Scikit-Lernens Support Vector Classifier (SVM.SVC) in Kombination mit Pipelining und Grid Search konstruiert. Nach dem Anpassen und Auswerten bekomme ich eine ROC-Kurve, die sehr interessant aussieht: Sie biegt nur einmal.Das Diagramm dieser ROC-Kurve sieht seltsam aus (sklearn SVC)

ROC curve of an SVC

Ich dachte, ich hier eher eine Kurvenform erhalten würde. Wer kann dieses Verhalten erklären? Minimaler Arbeitsbeispielcode:

# Imports 
import sklearn as skl 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.datasets import make_classification 
from sklearn import preprocessing 
from sklearn import svm 
from sklearn.model_selection import GridSearchCV 
from sklearn.pipeline import Pipeline 
from sklearn import metrics 
from tempfile import mkdtemp 
from shutil import rmtree 
from sklearn.externals.joblib import Memory 


def plot_roc(y_test, y_pred): 
    fpr, tpr, thresholds = skl.metrics.roc_curve(y_test, y_pred, pos_label=1) 
    roc_auc = skl.metrics.auc(fpr, tpr) 
    plt.figure() 
    lw = 2 
    plt.plot(fpr, tpr, color='darkorange', lw=lw, label='ROC curve (area ={0:.2f})'.format(roc_auc)) 
    plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--') 
    plt.xlim([0.0, 1.0]) 
    plt.ylim([0.0, 1.05]) 
    plt.xlabel('False Positive Rate') 
    plt.ylabel('True Positive Rate') 
    plt.title('Receiver operating characteristic example') 
    plt.legend(loc="lower right") 
    plt.show(); 

# Generate a random dataset 
X, y = skl.datasets.make_classification(n_samples=1400, n_features=11, n_informative=5, n_classes=2, weights=[0.94, 0.06], flip_y=0.05, random_state=42) 
X_train, X_test, y_train, y_test = skl.model_selection.train_test_split(X, y, test_size=0.3, random_state=42) 

#Instantiate Classifier 
normer = preprocessing.Normalizer() 
svm1 = svm.SVC(probability=True, class_weight={1: 10}) 

cached = mkdtemp() 
memory = Memory(cachedir=cached, verbose=3) 
pipe_1 = Pipeline(steps=[('normalization', normer), ('svm', svm1)], memory=memory) 

cv = skl.model_selection.KFold(n_splits=5, shuffle=True, random_state=42) 

param_grid = [ {"svm__kernel": ["linear"], "svm__C": [1, 10, 100, 1000]}, {"svm__kernel": ["rbf"], "svm__C": [1, 10, 100, 1000], "svm__gamma": [0.001, 0.0001]} ] 
grd = GridSearchCV(pipe_1, param_grid, scoring='roc_auc', cv=cv) 

#Training 
y_pred = grd.fit(X_train, y_train).predict(X_test) 
rmtree(cached) 

#Evaluation 
confmatrix = skl.metrics.confusion_matrix(y_test, y_pred) 
print(confmatrix) 
plot_roc(y_test, y_pred) 
+1

Probieren Sie 'y_pred = grd.fit (X_train, y_train) .predict_proba (X_test) [:, 1]' und senden Sie sie an die Plot-Methode. –

+0

Das funktioniert komplett. Wird es jetzt auf meinen ernsthaften Datensatz anwenden. – Ulu83

Antwort

1

Ihre plot_roc(y_test, y_pred) Funktion ruft intern roc_curve.

Gemäß der documentation of roc_curve:

y_score: array, shape = [N_SAMPLES]

Ziel Partituren, kann entweder Wahrscheinlichkeitsschätzungen der positiven Klasse, Vertrauenswerte oder Nicht-schwellen Maß Entscheidungen (wie von "Decision_function" auf einigen Klassifikatoren zurückgegeben).

Also funktioniert das am besten, wenn y_pred die Wahrscheinlichkeit der positiven Klasse ist, anstelle von harten Vorhersageklassen.

Versuchen Sie, den folgenden Code ein:

y_pred = grd.fit(X_train, y_train).predict_proba(X_test)[:,1] 

und dann y_pred senden Methode zu zeichnen.

Verwandte Themen