為什么roc_auc_score()和auc()有不同的結果?
auc():計算ROC曲線下的面積.即圖中的area
roc_auc_score():計算AUC的值,即輸出的AUC
最佳答案
AUC並不總是ROC曲線下的面積.曲線下面積是某個曲線下的(抽象)區域,因此它比AUROC更通用.對於不平衡類,最好找到精確回憶曲線的AUC.
請參閱sklearn source for roc_auc_score:
def roc_auc_score(y_true, y_score, average="macro", sample_weight=None): # <...> docstring <...> def _binary_roc_auc_score(y_true, y_score, sample_weight=None): # <...> bla-bla <...> fpr, tpr, tresholds = roc_curve(y_true, y_score, sample_weight=sample_weight) return auc(fpr, tpr, reorder=True) return _average_binary_score( _binary_roc_auc_score, y_true, y_score, average, sample_weight=sample_weight)
首先獲得roc曲線,然后調用auc()來獲取該區域.你的問題是predict_proba()調用.對於正常的預測(),輸出總是相同的:
import numpy as np from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_curve, auc, roc_auc_score est = LogisticRegression(class_weight='auto') X = np.random.rand(10, 2) y = np.random.randint(2, size=10) est.fit(X, y) false_positive_rate, true_positive_rate, thresholds = roc_curve(y, est.predict(X)) print auc(false_positive_rate, true_positive_rate) # 0.857142857143 print roc_auc_score(y, est.predict(X)) # 0.857142857143
如果您為此更改了上述內容,則有時會得到不同的輸出:
false_positive_rate, true_positive_rate, thresholds = roc_curve(y, est.predict_proba(X)[:,1]) # may differ print auc(false_positive_rate, true_positive_rate) print roc_auc_score(y, est.predict(X))