You need to enable JavaScript to run this app. 使用OneHotEncoder编码分类列时报Input contains NaN的解决方案是什么?
优惠活动
大模型
产品
解决方案
定价
更多

使用OneHotEncoder编码分类列时报Input contains NaN的解决方案是什么?

问题根因

两个环境运行结果不一致的核心原因分为两类:

  • scikit-learn版本差异:Colab默认预装的scikit-learn版本≥1.1.0,该版本新增了allow_nan参数支持分类列的缺失值自动编码,即使不显式配置也不会触发Input contains NaN报错;而本地Jupyter环境的scikit-learn版本通常低于1.0.0,未适配缺失值处理逻辑,handle_unknown='ignore'参数仅用于处理训练集未出现的分类值,不会处理NaN,因此触发报错。
  • 数据集读取差异:相同数据源在两个环境的读取规则不同,例如本地读取csv时会将空值、空字符串统一识别为NaN,而Colab部分读取逻辑会将空字符串识别为独立分类值,导致Jupyter环境下的inputs_df[categorical_cols]实际存在缺失值,Colab对应数据集无缺失值。

解决方案

方案1:对齐scikit-learn版本

升级本地Jupyter环境的scikit-learn包至最新版本,显式配置allow_nan参数:

  1. 执行升级命令:
    pip install --upgrade scikit-learn
  2. 修改编码器初始化代码:
encoder = OneHotEncoder(sparse=False, handle_unknown='ignore', allow_nan=True).fit(inputs_df[categorical_cols])
encoded_cols = list(encoder.get_feature_names(categorical_cols))
inputs_df[encoded_cols] = encoder.transform(inputs_df[categorical_cols])

方案2:提前填充缺失值

无需升级依赖,提前将分类列的NaN替换为独立占位符,避免触发报错:

# 填充所有分类列的缺失值
inputs_df[categorical_cols] = inputs_df[categorical_cols].fillna('Missing')
# 原有逻辑保持不变
encoder = OneHotEncoder(sparse=False,handle_unknown='ignore').fit(inputs_df[categorical_cols])
encoded_cols = list(encoder.get_feature_names(categorical_cols))
inputs_df[encoded_cols] = encoder.transform(inputs_df[categorical_cols])

方案3:校验数据集一致性

运行以下代码确认两个环境的数据集缺失值情况是否一致:

print(inputs_df[categorical_cols].isna().sum())

如果Jupyter环境输出的缺失值统计大于0,优先执行缺失值填充即可解决问题。

内容的提问来源于stack exchange,提问作者Samuel David Egwu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 16:06:01