连续型Y响应变量适配IterativeImputer与cross_val_score的问题
解决连续型Y下cross_val_score的适配问题
你的报错根源很明确:RepeatedStratifiedKFold是专门给分类任务设计的分层交叉验证器,而accuracy是分类任务的评分指标,但你的Y是连续型价格数据,属于回归任务,两者不兼容才会抛出这个错误。不需要把Y转成分类,只需要换成回归任务对应的交叉验证器和评分指标即可,具体方案如下:
1. 替换交叉验证器
把RepeatedStratifiedKFold换成回归任务适用的RepeatedKFold——它不需要基于类别分层,直接对连续型目标变量做重复K折拆分,完全适配你的场景。
2. 替换评分指标
把accuracy换成回归任务的常用指标,比如:
'r2':R²得分,衡量模型解释方差的比例'neg_mean_squared_error':负均方误差(scikit-learn默认偏好得分越高越好,所以用负值表示)'neg_mean_absolute_error':负平均绝对误差
完整代码示例
假设你原来的错误代码是这样的:
from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer from sklearn.linear_model import BayesianRidge from sklearn.model_selection import cross_val_score, RepeatedStratifiedKFold # 假设X是单特征的训练数据(含缺失值),y是连续型价格 imputer_reg = IterativeImputer(estimator=BayesianRidge(), random_state=42) cv = RepeatedStratifiedKFold(n_splits=5, n_repeats=3, random_state=42) scores = cross_val_score(imputer_reg, X, y, cv=cv, scoring='accuracy')
修改后的正确代码:
from sklearn.experimental import enable_iterative_imputer from sklearn.impute import IterativeImputer from sklearn.linear_model import BayesianRidge from sklearn.model_selection import cross_val_score, RepeatedKFold # 初始化带BayesianRidge的迭代填充器 imputer_reg = IterativeImputer(estimator=BayesianRidge(), random_state=42) # 替换为回归用的重复K折交叉验证 cv = RepeatedKFold(n_splits=5, n_repeats=3, random_state=42) # 替换为回归评分指标,比如R² scores = cross_val_score(imputer_reg, X, y, cv=cv, scoring='r2') # 查看得分 print(f"交叉验证R²得分: {scores.mean():.4f} ± {scores.std():.4f}")
额外说明
因为你只处理单个特征,IterativeImputer会基于BayesianRidge这个回归模型,用特征自身的非缺失值拟合后填充缺失值,这个逻辑在回归场景下是完全成立的,不需要调整填充逻辑,只需要修正交叉验证和评分的部分即可。
内容的提问来源于stack exchange,提问作者Data Science Analytics Manager
相关产品推荐
相关产品推荐

