You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用全数据集时K折交叉验证出现异常负数值问题排查

为什么全数据集做10折交叉验证会出现负的得分?

我的问题是:将所用数据集划分为训练集与测试集(测试集占比20%),在训练集上执行cv=10的K折交叉验证时,准确率结果正常;但在全数据集(训练集+测试集)上执行相同操作时,出现了包含-128在内的异常负数值。相关代码如下:

import pandas as pd 
data=pd.read_csv('50_Startups.csv') 
X = data.iloc[:,[0,2]].values 
Y = data.iloc[:,-1].values 
from sklearn.cross_validation import train_test_split as tts 
X_train,X_test,Y_train,Y_test=tts(X,Y,test_size=0.2,random_state=0) 
from sklearn.linear_model import LinearRegression 
from sklearn.model_selection import cross_val_score 
accuracies = cross_val_score(estimator=LinearRegression(),X=X_train,y=Y_train,cv=10) 
accuracies_dataset= cross_val_score(estimator=LinearRegression(),X=X,y=Y,cv=10) 

其中accuracies_dataset结果异常为负值,accuracies结果正常,请问这是什么原因?

嘿,先帮你澄清一个容易混淆的关键点:你用的是线性回归(回归任务),cross_val_score默认返回的不是分类任务里的「准确率」,而是R²决定系数!这是理解问题的核心。

为什么会出现负数值?

R²的取值范围是$(-\infty, 1]$,它衡量的是模型对数据变异的解释能力。计算公式是:
$R^2 = 1 - \frac{残差平方和}{总平方和}$
当模型的预测效果还不如「直接用所有样本的均值当预测值」时,残差平方和会大于总平方和,R²就会变成负数。

全数据集vs训练集的差异原因

你的数据集只有50个样本:

  • 用全数据集做10折交叉验证时,每折的测试集只有5个样本。样本量太小的情况下,很容易出现某几折的测试集刚好和训练集的分布偏差极大(比如抽到几个极端样本),这时候模型完全没学到适配这些测试样本的规律,预测效果连「猜均值」都不如,就会出现极端的负R²。
  • 而拆分后的训练集有40个样本,10折CV每折测试集是4个样本,虽然样本量也小,但这部分数据的分布相对更均匀,没抽到极端偏差的测试子集,所以结果看起来正常。

几点建议

  1. 纠正指标表述:回归任务别用「准确率」,改用R²、MAE(平均绝对误差)或者MSE(均方误差)这类指标。如果想指定其他评分方式,可以在cross_val_score里加scoring参数,比如scoring='neg_mean_squared_error'。
  2. 调整交叉验证折数:50个样本做10折CV太激进了,试试换成5折,这样每折测试集有10个样本,结果会稳定很多。
  3. 检查数据质量:看看数据集里有没有极端异常值,这些值可能会在交叉验证的某一折中严重干扰模型拟合,建议做下数据清洗。

内容的提问来源于stack exchange,提问作者Anwesh Mohapatra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:47