2016-03-05 46 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