使用全数据集时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个样本,虽然样本量也小,但这部分数据的分布相对更均匀,没抽到极端偏差的测试子集,所以结果看起来正常。
几点建议
- 纠正指标表述:回归任务别用「准确率」,改用R²、MAE(平均绝对误差)或者MSE(均方误差)这类指标。如果想指定其他评分方式,可以在
cross_val_score里加scoring参数,比如scoring='neg_mean_squared_error'。 - 调整交叉验证折数:50个样本做10折CV太激进了,试试换成5折,这样每折测试集有10个样本,结果会稳定很多。
- 检查数据质量:看看数据集里有没有极端异常值,这些值可能会在交叉验证的某一折中严重干扰模型拟合,建议做下数据清洗。
内容的提问来源于stack exchange,提问作者Anwesh Mohapatra
相关产品推荐
相关产品推荐

