Sklearn cross_val_score 给出的数字与 model.score 明显不同?

Posted

技术标签:

【中文标题】Sklearn cross_val_score 给出的数字与 model.score 明显不同?【英文标题】:Sklearn cross_val_score gives significantly differnt number than model.score? 【发布时间】:2020-09-08 06:14:18 【问题描述】:

我有一个二元分类问题

首先我训练测试将我的数据拆分为:

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

我检查了 y_train,它基本上有两个类 (1,0) 的 50/50 拆分,这就是它的数据集

当我尝试以下基本模型时:

model = RandomForestClassifier()
model.fit(X_train, y_train)
model.score(X_train, y_train)

输出为 0.98 或 1% 的差异,具体取决于训练测试拆分的随机状态。

但是,当我尝试使用 cross_val_score 时,例如:

cross_val_score(model, X_train, y_train, cv=StratifiedKFold(shuffle=True), scoring='accuracy')

输出是

array([0.65      , 0.78333333, 0.78333333, 0.66666667, 0.76666667])

数组中没有一个分数接近0.98?

当我尝试 score = 'r2' 时,我得到了

>>>cross_val_score(model, X_train, y_train, cv=StratifiedKFold(shuffle=True), scoring='r2')
array([-0.20133482, -0.00111235, -0.2       , -0.2       , -0.13333333])

有人知道为什么会这样吗?我试过Shuffle = TrueFalse 但没有帮助。

提前致谢

【问题讨论】:

为什么是 Z_train 而不是 X_train?你确定它的训练是正确的吗 抱歉,这是 *** 中的错字,不是实际代码中的错字,不过感谢您指出这一点 @iLoveItWhenUCallMeBigData 你是在训练集上计算分数还是错字? 是的.. 如果您在训练集上进行计算,则模型已使用训练数据进行拟合。更公平的比较是计算测试分数 【参考方案1】:

在您的基础模型中,您会在训练语料库中计算您的分数。虽然这是确保您的模型实际从您提供的数据中学习的正确方法,但它并不能确保您的模型在新的和未见过的数据上的最终准确性。

不是 100% 肯定(我不太了解 scikit-learn),但我希望 cross_val_score 实际上将 X_trainy_train 拆分为训练集和测试集。

因此,当您对训练期间未见的数据计算分数时,准确度会低得多。尝试将这些结果与model.score(X_test, y_test) 进行比较,应该更接近。

【讨论】:

啊,你是对的,我认为 cross val 的输出是模型与训练数据的匹配程度的输出(这是一个有效的事情,并且需要检查过度拟合所以 idk为什么 cmets 中的人们对此感到不安……无论如何)。您是对的,它在 n-1 折上进行训练,并且输出是作为测试的最后一折。谢谢 @iLoveItWhenUCallMeBigData 很高兴它有帮助 ;)

以上是关于Sklearn cross_val_score 给出的数字与 model.score 明显不同?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

在 sklearn cross_val_score 上评估多个分数

我从 GridSearchCV 获得的 R^2 分数与我从 cross_val_score 获得的分数非常不同,为啥? (sklearn,python)

使用joblib在sklearn中重用由cross_val_score拟合的模型

sklearn中的cross_val_score交叉验证

scikit-learn中的cross_val_score函数scoring参数设置