我正在尝试使用大型数据集运行一个简单的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
的结果,但我想确保我没有搞砸某个地方。
** Update **
我注意到,当我将参数的顺序颠倒为roc_auc_score
时,我得到了类似的结果:
roc_auc_score(cfc.predict(X_test), y_test)
但是文档明确指出第一个元素应该是实际值,第二个元素应该是目标。
我不知道是什么问题,但这里有两件事你可以尝试:
-
ROC AUC需要预测概率来进行适当的评估,而不是硬分数(即0或1)。因此更改
cross_val_score
以使用概率。你可以在这个链接上查看第一个答案,了解更多细节。与
比较roc_auc_score(y_test, cfc.predict_proba(X_test)[:,1])
-
正如xysmas所说,尝试将随机状态设置为
cross_val_score
和roc_auc_score