scikit-learn
Receiver Operating Characteristic (ROC)
Ricerca…
Introduzione a ROC e AUC
Esempio di metrica Receiver Operating Characteristic (ROC) per valutare la qualità di uscita del classificatore.
Le curve ROC presentano tipicamente una velocità positiva reale sull'asse Y e una percentuale di falsi positivi sull'asse X. Ciò significa che l'angolo in alto a sinistra della trama è il punto "ideale" - un tasso di falsi positivi pari a zero e un vero tasso positivo di uno. Questo non è molto realistico, ma significa che un'area più ampia sotto la curva (AUC) di solito è migliore.
Anche la "pendenza" delle curve ROC è importante, poiché è ideale per massimizzare il tasso positivo reale riducendo al minimo il tasso di falsi positivi.
Un semplice esempio:
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt
Valori arbitrari y
: in questo caso i valori target previsti ( model.predict(x_test)
):
y = np.array([1,1,2,2,3,3,4,4,2,3])
Il punteggio è l'accuratezza media dei dati di test e delle etichette 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])
Calcola la curva ROC e l'AUC:
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
roc_auc = metrics.auc(fpr, tpr)
Tracciare:
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()
Produzione:
Nota: le fonti sono state prese da questi link1 e link2
Punteggio ROC-AUC con override e cross validation
Uno ha bisogno delle probabilità previste per calcolare il punteggio ROC-AUC (area sotto la curva). cross_val_predict
utilizza i metodi di predict
dei classificatori. Per poter ottenere il punteggio ROC-AUC, si può semplicemente sottoclasse il classificatore, sovrascrivendo il metodo di predict
, in modo che si predict_proba
come 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)))
produzione:
ROC-AUC score: 0.724972396025