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
= True
和False
但没有帮助。
提前致谢
【问题讨论】:
为什么是 Z_train 而不是 X_train?你确定它的训练是正确的吗 抱歉,这是 *** 中的错字,不是实际代码中的错字,不过感谢您指出这一点 @iLoveItWhenUCallMeBigData 你是在训练集上计算分数还是错字? 是的.. 如果您在训练集上进行计算,则模型已使用训练数据进行拟合。更公平的比较是计算测试分数 【参考方案1】:在您的基础模型中,您会在训练语料库中计算您的分数。虽然这是确保您的模型实际从您提供的数据中学习的正确方法,但它并不能确保您的模型在新的和未见过的数据上的最终准确性。
不是 100% 肯定(我不太了解 scikit-learn),但我希望 cross_val_score
实际上将 X_train
和 y_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)