2016-03-05 125 views
1

我從sklearn的RandomForestClassifier和roc_curve,AUC方法分別接收不同的ROC-AUC得分,AUC方法。差異ROC-AUC分數sklearn RandomForestClassifier與

下面的代碼讓我的0.878的ROC-AUC(即gs.best_score_):

def train_model(mod = None, params = None, features = None, 
     outcome = ...outcomes array..., metric = 'roc_auc'): 
    gs = GridSearchCV(mod, params, scoring=metric, loss_func=None, score_func=None, 
     fit_params=None, n_jobs=-1, iid=True, refit=True, cv=10, verbose=0, 
     pre_dispatch='2*n_jobs', error_score='raise') 
    gs.fit(...feature set df..., outcome) 

    print gs.best_score_ 
    print gs.best_params_ 

    return gs 

model = RandomForestClassifier(random_state=2000, n_jobs=-1) 
features_to_include = [...list of column names...] 

parameters = { 
      'n_estimators': [...list...], 'max_depth':[...list...], 
      'min_samples_split':[...list...], 'min_samples_leaf':[...list...] 
      } 

gs = train_model(mod = model, params = parameters, features = features_to_include) 

然而,下面的代碼讓我0.97的ROC-AUC:

fpr = dict() 
tpr = dict() 
roc_auc = dict() 
fpr['micro'], tpr['micro'], _ = roc_curve(...outcomes array..., 
            gs.predict_proba(...feature set df...)[:, 1]) 
roc_auc['micro'] = auc(fpr['micro'], tpr['micro']) 

爲什麼會有這樣的差異?我的代碼有問題嗎?

謝謝! 克里斯

回答

0

他們將返回不同的值,原因有二:

  1. 因爲GridSearchCV方法將您的數據分成10組(你正在做的10倍交叉驗證在你的代碼),採用9進行培訓,並在最後一組報告AUC。你得到的best_score_只是報道的最高AUC報告等(更多信息讀取here)。您的roc_curve計算報告整個集合的AUC。

  2. 默認交叉驗證roc_auc是宏版本(請參閱here),但您稍後的計算會計算微版本。

+0

大。所以如果我要爲這個模型正式報告AUC,我會用第二個(0.97)?而且我猜「微」的版本可能比在這種情況下,「宏觀」更好,因爲它需要標籤不平衡考慮在內。這就是說,你知道'微'與'宏'的好解釋(如果它與AUC計算有關,那麼獎金)?我的數據集有一幫真正的Falses和預測Falses的,不會在誤報率或真陽性率出現。這會影響我使用micro vs macro的決定嗎?謝謝!! – Chris

+0

不完全 - 報告一個合理的AUC「正式」你需要某種這是沒有經過培訓就持有了測試集。使用培訓數據來報告測試/性能指標是欺騙行爲,並且總是過度報告。我將使用LOWER(第一)分數作爲您報告的AUC。對於宏觀和微觀,我發佈的鏈接應該解釋它。 – mprat