scikit-learn - train_test_split和ShuffleSplit产生了截然不同的结果

时间:2016-09-24 20:19:40

标签: python pandas scikit-learn

我正在尝试使用大型数据集运行一个简单的RandomForestClassifier()。我通常首先使用train_test_split进行交叉验证,然后开始使用cross_val_score

在这种情况下,我从这两种方法得到了非常不同的结果,我无法弄清楚为什么。我的理解是这两个片段应该完全相同

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)

但文档明确指出第一个元素应该是实际值,第二个元素应该是目标值。

1 个答案:

答案 0 :(得分:0)

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

  1. ROC AUC需要预测概率以进行适当的评估,而不是硬评分(即0或1)。因此,更改cross_val_score以使用概率。您可以查看this link上的第一个答案以获取更多详细信息。

    将此与roc_auc_score(y_test, cfc.predict_proba(X_test)[:,1])

  2. 进行比较
  3. 正如xysmas所说,尝试将random_state设置为cross_val_scoreroc_auc_score