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

Polars DataFrame适配scikit-learn模型的格式问题及报错排查

解决Polars转NumPy适配LogisticRegression的问题

一、处理y_train的列向量警告

LogisticRegression的fit()方法要求目标变量y是一维数组(形状为(n_samples,)),但Polars DataFrame转NumPy时默认输出二维数组(比如(n_samples,1)),这就是警告的根源。

除了用numpy.ravel(),你可以直接用Polars自身的方法更简洁地生成一维数组:

  • 方法1:转NumPy时指定flatten=True
    y_train_np = y_train.to_numpy(flatten=True)
    
  • 方法2:先转成Polars Series再转NumPy
    y_train_np = y_train.select("Survived").to_series().to_numpy()
    

二、处理X_test的NaN/inf及多余列问题

1. 先移除多余的Survived列

测试集不需要标签列,而且该列的null值会直接导致后续报错,先删掉:

X_test = X_test.drop("Survived")

2. 对齐X_train的缺失值处理策略

模型训练时X_train肯定做过缺失值处理,X_test必须用完全相同的规则,避免数据泄露:

  • 数值列填充:用训练集的中位数/均值填充(更严谨,不能用测试集自身的统计量)
    # 从训练集获取数值列的中位数
    train_medians = X_train.select(pl.col(pl.NUMERIC_DTYPES).median())
    # 用训练集中位数填充测试集缺失值
    X_test = X_test.with_columns(
        [pl.col(col).fill_null(train_medians.item(col)) for col in train_medians.columns]
    )
    
  • 类别列填充:填充众数或标记为"Unknown"
    # 填充众数
    train_modes = X_train.select(pl.col(pl.CATEGORICAL_DTYPES).mode())
    X_test = X_test.with_columns(
        [pl.col(col).fill_null(train_modes.item(col)[0]) for col in train_modes.columns]
    )
    # 或者直接标记为Unknown
    X_test = X_test.with_columns(pl.col(pl.CATEGORICAL_DTYPES).fill_null("Unknown"))
    

3. 清理无穷大值

检查并替换数值列中的正负无穷为null,再按上面的规则填充:

X_test = X_test.with_columns(
    pl.col(pl.NUMERIC_DTYPES).replace([float('inf'), float('-inf')], None)
)

4. 转NumPy数组用于预测

最后转成float64类型的数组,确保符合模型要求:

X_test_np = X_test.to_numpy(dtype=np.float64)

关键提醒

一定要保证X_train和X_test的预处理逻辑完全一致,比如填充用的统计量必须来自训练集,不能用测试集的数据,否则会引入数据泄露,导致模型泛化能力下降。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 14:30:16