scikit-learn
Charakterystyka pracy odbiornika (ROC)
Szukaj…
Wprowadzenie do ROC i AUC
Przykład metryki charakterystyki odbiornika (ROC) do oceny jakości wyjściowej klasyfikatora.
Krzywe ROC zazwyczaj mają prawdziwie dodatnią częstość na osi Y i fałszywie dodatnią częstość na osi X. Oznacza to, że lewy górny róg wykresu jest punktem „idealnym” - fałszywie dodatnim współczynnikiem zerowym i prawdziwym dodatnim współczynnikiem równym jeden. Nie jest to zbyt realistyczne, ale oznacza to, że większy obszar pod krzywą (AUC) jest zwykle lepszy.
Ważna jest również „stromość” krzywych ROC, ponieważ idealnie jest zmaksymalizować rzeczywistą dodatnią częstość przy jednoczesnym zminimalizowaniu częstości fałszywie dodatniej.
Prosty przykład:
import numpy as np
from sklearn import metrics
import matplotlib.pyplot as plt
Arbitralne wartości y
- w rzeczywistości są to przewidywane wartości docelowe ( model.predict(x_test)
):
y = np.array([1,1,2,2,3,3,4,4,2,3])
Wyniki to średnia dokładność danych testowych i etykiet ( 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])
Oblicz krzywą ROC i AUC:
fpr, tpr, thresholds = metrics.roc_curve(y, scores, pos_label=2)
roc_auc = metrics.auc(fpr, tpr)
Konspiratorstwo:
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()
Wynik:
Uwaga: źródła zostały zaczerpnięte z tych linków1 i linku2
Wynik ROC-AUC z nadpisywaniem i weryfikacją krzyżową
Potrzebne są przewidywane prawdopodobieństwa, aby obliczyć wynik ROC-AUC (pole pod krzywą). cross_val_predict
używa metod predict
klasyfikatorów. Aby uzyskać wynik ROC-AUC, można po prostu podklasować klasyfikator, zastępując metodę predict
, aby działała ona jak 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)))
wynik:
ROC-AUC score: 0.724972396025