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

sklearn Pipeline预处理步骤导致模型评分全为NaN如何排查

问题原因及解决方案

核心报错原因

你评分全为NaN的核心原因是分类特征预处理流程存在错误,Cross Validate子进程运行失败但未抛出显式报错,具体问题点如下:

  • 错误使用LabelEncoder处理输入特征:LabelEncoder是专门为标签y设计的转换器,仅接受1维数组作为输入。而ColumnTransformer传给分类转换器的特征永远是2维数组(即使是单列分类特征,维度也为(n_samples, 1)),直接触发维度不匹配报错,导致整个pipeline运行失败,评分返回NaN。你开启了n_jobs=-1多进程运行,子进程的报错不会同步到主进程,所以你只会看到拟合耗时,看不到具体错误。
  • (代码笔误)循环内pipeline的模型变量未正确赋值:你循环里写的是pipeline = Pipeline([ ('prep', preprocessor),('model', model)]),但你没有定义model变量,应该替换为models[i]。如果去掉预处理时你是直接传入模型,大概率是贴代码时的笔误,也会导致运行失败。

修复方案

  1. 替换分类特征预处理流程:直接去掉LabelEncoder,只用OneHotEncoder即可,新版scikit-learn的OneHotEncoder原生支持字符串、整数类型的分类特征输入,无需提前编码。如果你的分类特征列存在缺失值,可以同步添加缺失值填充步骤:
categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='most_frequent')), # 分类特征用众数填充缺失值,无缺失可删除该行
    ('onehot', OneHotEncoder(handle_unknown='ignore'))
])
  1. 修正循环内的模型引用:
pipeline = Pipeline([ ('prep', preprocessor),('model', models[i])])
  1. 调试时临时关闭多进程:修改n_jobs=1运行,可直接看到完整报错信息,方便定位其他潜在问题。
  2. 额外优化:负对数损失的评分键是neg_log_loss,你打印时取平均值的话结果会是负数,如果需要正常的log_loss值,可以取-mean(log_loss)输出。

内容的提问来源于stack exchange,提问作者yogz123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:18:01