You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 15:18:02