报错ValueError: Input y contains NaN的原因排查与代码修改咨询
问题:训练机器学习管道时出现
ValueError: Input y contains NaN错误 代码片段
# Fit each pipeline on the training data for pipeline in pipelines: pipeline.fit(x_train, y_train)
报错堆栈
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-129-39301fb0712f> in <cell line: 19>() 18 # Fit each pipeline on the training data 19 for pipeline in pipelines: ---> 20 pipeline.fit(x_train, y_train) 5 frames /usr/local/lib/python3.10/dist-packages/sklearn/utils/validation.py in _assert_all_finite(X, allow_nan, msg_dtype, estimator_name, input_name) 159 "#estimators-that-handle-nan-values" 160 ) --> 161 raise ValueError(msg_err) 162 163 ValueError: Input y contains NaN.
原因分析
报错直接明确问题:目标变量y_train中存在缺失值(NaN),而scikit-learn的绝大多数模型默认不允许目标变量包含缺失值,调用fit()方法时会触发验证检查,从而抛出该错误。
解决方法
1. 先确认缺失情况
运行以下代码,明确y_train中NaN的数量和位置:
# 统计NaN的总数量 print(y_train.isna().sum()) # 查看NaN所在的行索引(适用于Series/DataFrame类型的y_train) print(y_train[y_train.isna()].index)
2. 根据场景选择处理方式
方式一:删除含缺失值的样本
如果NaN的数量极少,直接删除对应样本最简便,注意要同步过滤x_train中的对应行:
# 生成非缺失值的掩码 mask = y_train.notna() # 过滤得到干净的训练数据集 x_train_clean = x_train[mask] y_train_clean = y_train[mask] # 使用清理后的数据训练管道 for pipeline in pipelines: pipeline.fit(x_train_clean, y_train_clean)
方式二:填充缺失值
如果缺失样本量较大,无法直接删除,可根据y_train的类型选择填充方式:
- 若
y_train是数值型变量:用均值、中位数或众数填充(中位数更抗极端值影响):y_train_clean = y_train.fillna(y_train.median()) - 若
y_train是分类变量:用出现次数最多的类别(众数)填充:y_train_clean = y_train.fillna(y_train.mode()[0])
填充完成后,用y_train_clean替换原y_train执行训练即可。
方式三:更换支持目标变量含NaN的模型
如果业务允许,可替换为XGBoost、LightGBM这类原生支持目标变量包含缺失值的模型,无需预处理NaN即可直接训练。
内容的提问来源于stack exchange,提问作者Pushpavathi Kothapalli AP2213
相关产品推荐
相关产品推荐

