2016-09-24 37 views
0

我试图用大ish数据集运行一个简单的RandomForestClassifier()。我通常首先使用train_test_split进行交叉验证,然后开始使用cross_val_scorescikit-learn - train_test_split和ShuffleSplit产生非常不同的结果

在这种情况下,虽然这两种方法的结果非常不同,但我无法弄清楚原因。我的理解这些是这两个片段应该做同样的事情

cfc = RandomForestClassifier(n_estimators=50) 

scores = cross_val_score(cfc, X, y, 
         cv = ShuffleSplit(len(X), 1, 0.25), 
         scoring = 'roc_auc') 
print(scores) 
>>> [ 0.88482262] 

这:

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25) 

cfc = RandomForestClassifier(n_estimators=50) 
cfc.fit(X_train, y_train) 

roc_auc_score(y_test, cfc.predict(X_test)) 
>>> 0.57733474562203269 

然而分数差别很大。 (分数非常具有代表性,我在许多次跑步中观察到相同的行为)。

任何想法,为什么这可能是?我很想信任cross_val_score结果,但我想,以确保我不是搞乱了地方..

** **更新

我注意到,当我逆转的参数roc_auc_score顺序,我得到了类似的结果:

roc_auc_score(cfc.predict(X_test), y_test) 

但文件明确规定,第一要素应该是实际值,而第二个目标。

+0

你尝试用相同的随机状态眼看交叉验证?您的数据是否预先洗牌,甚至是跨班级? –

回答

0

我不知道有什么问题,但这里有两两件事你可以尝试:

  1. ROC AUC需求预测概率正确的评价,不难分数(即0或1)。因此请将cross_val_score更改为使用概率。您可以在this link上查看第一个答案以获取更多详细信息。

    比较这与roc_auc_score(y_test, cfc.predict_proba(X_test)[:,1])

  2. 正如xysmas说,尝试random_state设置既cross_val_scoreroc_auc_score

相关问题