博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》被 OneHotEncoder 的 NaN 坑到凌晨三点终于搞定了目录昨晚写特征工程OneHotEncoder 突然炸了。报错信息刺眼得像深夜的键盘声ValueError: Input contains NaN, infinity or a value too large for dtype(float64)我盯着屏幕看了半小时才反应过来它根本不吃 NaN数据里有缺失值比如空字符串或np.nan直接塞给 OneHotEncoder 就崩。核心根源scikit-learn 的 OneHotEncoder 设计时就默认输入必须是干净的数值。它不处理缺失值也不认 NaN。你得先清理数据它才肯干活。错误示范我踩过坑fromsklearn.preprocessingimportOneHotEncoder# 假设 df[country] 有 NaN 值encOneHotEncoder()Xdf[[country]]# 有缺失值的列X_encodedenc.fit_transform(X)# 报错直接崩为啥崩因为 OneHotEncoder 会检查输入发现 NaN 就直接抛异常。它不负责填缺失你得先处理。正确姿势直接上代码fromsklearn.composeimportColumnTransformerfromsklearn.pipelineimportPipelinefromsklearn.imputeimportSimpleImputerfromsklearn.preprocessingimportOneHotEncoder# 关键用 SimpleImputer 先填充缺失再编码preprocessorColumnTransformer(transformers[(cat,Pipeline(steps[(imputer,SimpleImputer(strategymost_frequent)),# 用最常见值填充缺失比如填Unknown(onehot,OneHotEncoder(handle_unknownignore))# 处理未知类别避免额外报错]),[country])# 要处理的列名])# 一次性搞定填充缺失 编码X_transformedpreprocessor.fit_transform(df)为什么这样写SimpleImputer(strategymost_frequent)把缺失值替换成该列最常出现的值比如China填了 50 次就用它。handle_unknownignore避免新类别比如测试集有Japan但训练集没出现导致崩溃。ColumnTransformer把缺失值处理和编码打包成流水线省得手动分步。图数据输入 → 缺失值填充 → OneHot编码 → 输出特征避坑总结别跳过缺失值处理OneHotEncoder 不会自动填 NaN你得先喂它干净数据。用 Pipeline 统一处理别分开写 imputer 和 encoder容易漏步骤。handle_unknown别忘测试集有新类别时这个参数能救命。验证数据df.isnull().sum()先跑一遍别让 NaN 悄悄混进来。我昨天就是死磕了 2 小时以为是 OneHotEncoder 的 bug。结果发现是自己忘了数据清洗。现在写代码先加一行df.fillna(Missing, inplaceTrue)再套编码器——省下半夜摸鱼的时间。记住数据脏了再牛的模型也得跪。