泰坦尼克数据集新增Age、Fare列后cross_val_score报FitFailedWarning
问题原因拆解
- 新增
Age、Fare后首次训练报错
泰坦尼克数据集的Age列天然存在约20%的缺失值,你当前的pipeline没有加入缺失值处理环节,逻辑回归模型无法接收NaN输入触发拟合失败,和ColumnTransformer、make_pipeline的兼容性无关。 - 做数值缩放后
predict调用报错
你大概率是在pipeline外单独做的缩放和缺失值处理,交叉验证和预测阶段的数据处理逻辑不一致,导致预测输入仍存在未处理的缺失值,或是Fare列的极端异常值引发数值溢出。 - 最终
AttributeError: 'str' object has no attribute 'decode'报错
这是scikit-learn旧版本和scipy版本不兼容导致的:scipy 1.6.0及以上版本将优化返回的message字段从bytes类型改为了str类型,而0.24及更早版本的scikit-learn仍会调用decode方法解析该字段,因此触发属性错误。
修复方案
第一步:完善pipeline特征处理逻辑,避免数据泄露
将缺失值填充、数值缩放全部整合进pipeline,保证训练、预测的处理逻辑完全一致:
from sklearn.impute import SimpleImputer from sklearn.preprocessing import StandardScaler # 分类特征处理流程 cat_pipe = make_pipeline( OneHotEncoder(handle_unknown='ignore') ) # 数值特征(Age、Fare)处理流程 num_pipe = make_pipeline( SimpleImputer(strategy='median'), # 用中位数填充缺失值,对异常值鲁棒性更高 StandardScaler() # 统一数值量级 ) columns_trans = make_column_transformer( (cat_pipe, ['Sex', 'Embarked']), (num_pipe, ['Age', 'Fare']), remainder='passthrough' ) logreg = LogisticRegression(solver='lbfgs', max_iter=1000) # 增大迭代次数避免收敛警告 pipe = make_pipeline(columns_trans, logreg)
第二步:解决版本兼容问题,二选一操作即可
- 升级scikit-learn到0.24.2及以上版本:
pip install -U scikit-learn - 降级scipy到1.5.4版本:
pip install scipy==1.5.4
内容的提问来源于stack exchange,提问作者Akshit Dayal
相关产品推荐
相关产品推荐

