LinearRegression与线性核SVC得分差异大及交叉验证警告问题咨询
问题解答
1 线性回归与SVC得分差异巨大的核心原因
你混淆了回归模型和分类模型的适用场景:
LinearRegression是回归模型,专门处理y为连续值的预测任务(比如月度销售额),其score方法返回的是R²指标,衡量模型对连续值的拟合程度,0.98说明你的线性回归模型拟合效果很好。SVC全称为Support Vector Classifier,是分类模型,只能处理y为离散类别的预测任务(比如判断用户是否购买、商品属于哪个品类)。你传入连续的y值时,SVC会把每一个不同的y值都识别为一个独立的分类标签,大部分标签的样本量只有1条,模型根本无法学习分类规律,且其score方法返回的是分类准确率(要求预测值和真实值完全一致才算正确),连续值几乎不可能完全匹配,所以得分接近0是必然结果。
2 交叉验证警告/报错的原因
你调用cross_val_score时传入的是分类模型SVC,scikit-learn会默认使用分层K折拆分策略(StratifiedKFold),该策略要求每个分类标签在所有拆分的折里都有样本,而你的连续y值对应的分类标签最少只有1个样本,连2折拆分的要求都满足不了,自然会触发警告;当你把cv调大到5时,要求每个标签最少有5个样本,完全不满足,因此直接报错。
本质还是使用分类工具处理回归任务导致的不兼容问题。
3 回归场景的正确处理方案
- 替换分类模型为回归模型:如果要使用支持向量机做回归任务,需调用
SVR而不是SVC,示例引入代码:from sklearn.svm import SVR,模型初始化代码:svr_reg = SVR(kernel='linear', C=1, random_state=42) - 交叉验证适配回归场景:回归任务不需要分层拆分,直接使用普通K折即可,也可以开启shuffle打乱数据顺序避免时序等规律影响,示例代码:
from sklearn.model_selection import KFold, cross_val_score # 定义5折交叉验证,先打乱数据再拆分 kf = KFold(n_splits=5, shuffle=True, random_state=42) # 传入回归模型做交叉验证,默认返回R²得分,也可通过scoring参数指定MSE、MAE等指标 scores = cross_val_score(svr_reg, X, y, cv=kf)
- 模型对比时统一使用回归类模型:你可以分别对线性回归、SVR等回归模型做拟合和交叉验证,不要混用分类模型。
内容的提问来源于stack exchange,提问作者IRK
相关产品推荐
相关产品推荐

