scikit-learn - train_test_split 和 ShuffleSplit 产生非常不同的结果

Posted

技术标签:

【中文标题】scikit-learn - train_test_split 和 ShuffleSplit 产生非常不同的结果【英文标题】:scikit-learn - train_test_split and ShuffleSplit yielding very different results 【发布时间】:2017-02-02 11:37:27 【问题描述】:

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

但在这种情况下,我从这两种方法中得到的结果非常不同,我不知道为什么。我的理解是这两个 sn-ps 应该做完全相同的事情

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】:

我不确定是什么问题,但您可以尝试以下两件事:

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

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

    正如 xysmas 所说,尝试将 random_state 设置为 cross_val_scoreroc_auc_score

【讨论】:

以上是关于scikit-learn - train_test_split 和 ShuffleSplit 产生非常不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

如何保存 GridSearchCV 对象?

[机器学习与scikit-learn-2]:如何学习Scikit-learn

Sklearn 速查

无法安装 scikit-learn

scikit-learn学习基础知识四

[机器学习与scikit-learn-3]:scikit-learn模型地图与模型选择