scikit-learn中AdaBoost训练时遇到NaN输入报错如何解决
报错原因及解决方案
你之前用XGBoost没有报错,是因为XGBoost原生支持缺失值处理,但scikit-learn中的AdaBoostClassifier不支持输入包含缺失值、无穷大的特征,必须先完成数据清洗才能训练。
你之前两次尝试失败的原因
- 第一次用
fillna(method='ffill')仍报错:前向填充只能用前面行的值填充后面的缺失值,如果首行就存在缺失值、或者连续多行末尾有缺失值,填充后仍然会残留NaN,没有完全解决缺失值问题。 - 第二次传lambda函数填充报错:
fillna()不能直接传入lambda函数作为填充值,你写的语法不符合pandas接口要求,导致直接把函数对象当成了填充值,无法转为浮点数才抛出类型错误。 - 补充:你代码里的
random_state参数和当前报错无关,加这个参数只是为了固定训练测试集拆分的随机结果,方便复现实验,不影响模型运行。
具体解决步骤
步骤1:导入依赖包
需要额外导入numpy处理无穷值:
import numpy as np
步骤2:清洗异常值
先把所有无穷大值替换为NaN,统一处理:
# 替换正负无穷为NaN df = df.replace([np.inf, -np.inf], np.nan)
步骤3:正确填充缺失值
如果是快速验证可以直接用全量数值列的中位数填充:
# 仅对数值列用中位数填充,非数值列不会处理 df = df.fillna(df.median(numeric_only=True))
如果要做规范建模避免数据泄露,推荐拆分训练测试集后,只用训练集的统计量填充:
# 先拆分数据集 cols_to_drop = ['testId'] df.drop(cols_to_drop, axis=1, inplace=True) X = df.drop('Verdict', axis=1) y = df['Verdict'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=5) # 用训练集的中位数填充训练集和测试集,避免泄露测试集信息 train_median = X_train.median(numeric_only=True) X_train = X_train.fillna(train_median) X_test = X_test.fillna(train_median)
步骤4:校验清洗结果
确认没有残留缺失值和异常值:
# 检查是否还有缺失值,输出为0说明无缺失 print(X_train.isnull().sum().sum(), X_test.isnull().sum().sum()) # 检查是否所有数值都是有限值,输出为True说明无无穷值 print(np.isfinite(X_train).all().all(), np.isfinite(X_test).all().all())
校验通过后再运行AdaBoost训练代码即可正常运行。
内容的提问来源于stack exchange,提问作者futuredataengineer
相关产品推荐
相关产品推荐

