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

如何在机器学习Pipeline中仅标准化数值列?

只对数值型特征做标准化的Pipeline实现方案

嘿,我完全懂你踩的坑——直接给StandardScaler传columns参数肯定跑不通,因为StandardScaler本身根本没这个参数呀!要实现只对指定数值列做标准化,咱们得用sklearn的ColumnTransformer来配合Pipeline,它就是专门用来给不同特征组分配不同预处理逻辑的工具。

下面给你一步步拆解实现方法:

1. 先导入必要的模块

from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler
# 如果你的类别列需要编码,还可以导入独热编码器
# from sklearn.preprocessing import OneHotEncoder

2. 构建特征预处理规则

这里分两种常见场景:

场景1:类别列暂时不做处理,直接保留

如果你只是想标准化数值列,类别列原样传给后续模型,可以这么写:

# 定义预处理转换器:只对X_num_cols中的数值列做标准化,其余列直接传递
preprocessor = ColumnTransformer(
    transformers=[
        # 给这个预处理步骤起个名字,指定用StandardScaler,作用于X_num_cols
        ('num_scaler', StandardScaler(), X_num_cols)
    ],
    # 关键参数:未被指定的列(比如类别列)不做处理,直接保留
    remainder='passthrough'
)

场景2:类别列需要做独热编码

如果你同时需要处理类别列(比如做独热编码),只需要在transformers里再加一组规则:

# 假设你已经定义了类别列的列表
# X_cat_cols = ['category_feature1', 'category_feature2']

preprocessor = ColumnTransformer(
    transformers=[
        ('num_scaler', StandardScaler(), X_num_cols),
        # 给类别列做独热编码,handle_unknown='ignore'避免测试集出现新类别报错
        ('cat_encoder', OneHotEncoder(handle_unknown='ignore'), X_cat_cols)
    ],
    # 如果所有特征列都被上述规则覆盖了,就不需要remainder;否则还是加上remainder='passthrough'
)

3. 集成到Pipeline并使用

把预处理步骤和你的模型(比如分类/回归模型)组合成完整的Pipeline,就可以正常拟合和预测了:

# 举个例子,用逻辑回归模型,替换成你实际用的模型就行
from sklearn.linear_model import LogisticRegression

# 构建完整Pipeline
pipe = Pipeline([
    ('preprocessing', preprocessor),
    ('model', LogisticRegression())
])

# 训练和预测
pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)

为什么之前的方法不行?

StandardScaler是一个面向整个特征矩阵的转换器,它没有columns参数来指定要处理的列——你可能把它和pandas的列级操作搞混了。而ColumnTransformer会自动把不同预处理步骤的结果合并成统一的特征矩阵,完美适配Pipeline的端到端流程,这也是sklearn处理混合类型特征的标准方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:27:10