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=Truey_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
相关产品推荐
相关产品推荐

