[英]Proper inputs for Scikit Learn roc_auc_score and ROC Plot
我正在嘗試在驗證集上確定適合roc_auc_score
的 roc_auc_score。
我在 function 輸入上看到一些相互矛盾的信息。
文檔說:
“y_score 數組,形狀為 (n_samples,) 或 (n_samples, n_classes) 目標分數。在二進制和多標簽情況下,這些可以是概率估計值或非閾值決策值(由某些分類器上的決策函數返回)。在多類情況,這些必須是總和為 1 的概率估計。二進制情況需要一個形狀 (n_samples,),並且分數必須是 class 的分數,label 更大。多類和多標簽情況需要一個形狀 (n_samples , n_classes)。在多類情況下,class 分數的順序必須對應於標簽的順序(如果提供),或者對應於 y_true 中標簽的數字或字典順序。”
不確定這究竟需要什么:1)針對測試集中實際 y 值的預測概率或 2)針對測試集中實際 y 值的 class 預測
我一直在搜索,在二進制分類案例(我的興趣)中,有些人使用預測概率,而其他人使用實際預測(0 或 1)。 換句話說:
適合 model:
model.fit(X_train, y_train)
使用任一:
y_preds = model.predict(X_test)
或者:
y_probas = model.predict_proba(X_test)
我發現:
roc_auc_score(y_test, y_preds)
和:
roc_auc_score(y_test, y_probas[:,1]) # probabilites for the 1 class
產生非常不同的結果。
哪一個是正確的?
我還發現實際上 plot ROC 曲線我需要使用概率。
任何指導表示贊賞。
model.predict(...)
將為您提供每個觀察的預測 label。 也就是說,它將返回一個充滿 1 和 0 的數組。
model.predict_proba(...)[:, 1]
將為您提供每個觀察值等於 1 的概率。 也就是說,它將返回一個充滿零和一之間數字的數組,包括零和一。
ROC 曲線是通過將每個可能的概率作為閾值並計算得到的真陽性率和假陽性率來計算的。 因此,如果您將model.predict(...)
傳遞給metrics.roc_auc_score()
,則您正在計算僅使用兩個閾值(一個或零)的 ROC 曲線的 AUC。 這是不正確的,因為這些不是 model 的預測概率。
要獲得 model 的 AUC,您需要將預測概率傳遞給roc_auc_score(...)
:
from sklearn.metrics import roc_auc_score
roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.