scikit-learn
Operationele karakteristiek van de ontvanger (ROC)
Zoeken…
Inleiding tot ROC en AUC
Voorbeeld van ROC-statistiek (Receiver Operating Characteristic) om de uitvoerkwaliteit van de classificator te evalueren.
ROC-curves hebben meestal een echte positieve snelheid op de Y-as en een fout-positieve snelheid op de X-as. Dit betekent dat de linkerbovenhoek van de plot het "ideale" punt is - een vals positieve snelheid van nul en een echte positieve snelheid van één. Dit is niet erg realistisch, maar het betekent wel dat een groter gebied onder de curve (AUC) meestal beter is.
De "steilheid" van ROC-curven is ook belangrijk, omdat het ideaal is om de echte positieve snelheid te maximaliseren en tegelijkertijd de fout-positieve snelheid te minimaliseren.
Een eenvoudig voorbeeld:
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt
Willekeurige y
waarden - in het echte geval zijn dit de voorspelde doelwaarden ( model.predict(x_test)
):
y = np.array([1,1,2,2,3,3,4,4,2,3])
Scores is de gemiddelde nauwkeurigheid op de gegeven testgegevens en labels ( model.score(X,Y)
):
scores = np.array([0.3, 0.4, 0.95,0.78,0.8,0.64,0.86,0.81,0.9, 0.8])
Bereken de ROC-curve en de AUC:
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
roc_auc = metrics.auc(fpr, tpr)
Het in kaart brengen:
plt.figure()
plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], 'k--')
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()
Output:
Opmerking: de bronnen zijn afkomstig van deze link1 en link2
ROC-AUC-score met overschrijven en kruisvalidatie
Men heeft de voorspelde waarschijnlijkheden nodig om de ROC-AUC (gebied onder de curve) te berekenen. De cross_val_predict
gebruikt de predict
van classificaties. Om de ROC-AUC-score te kunnen krijgen, kan de classificator eenvoudigweg worden onderverdeeld, waarbij de predict
wordt predict_proba
, zodat deze zou werken als predict_proba
.
from sklearn.datasets import make_classification from sklearn.linear_model import LogisticRegression from sklearn.cross_validation import cross_val_predict from sklearn.metrics import roc_auc_score class LogisticRegressionWrapper(LogisticRegression): def predict(self, X): return super(LogisticRegressionWrapper, self).predict_proba(X) X, y = make_classification(n_samples = 1000, n_features=10, n_classes = 2, flip_y = 0.5) log_reg_clf = LogisticRegressionWrapper(C=0.1, class_weight=None, dual=False, fit_intercept=True) y_hat = cross_val_predict(log_reg_clf, X, y)[:,1] print("ROC-AUC score: {}".format(roc_auc_score(y, y_hat)))
output:
ROC-AUC score: 0.724972396025