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

如何仅对numpy数组指定列应用sklearn StandardScaler并集成到Pipeline?

解决方法:用ColumnTransformer配合Pipeline实现指定列缩放

当然可以一步搞定这个需求!Scikit-learn里的ColumnTransformer就是专门用来处理这种对不同列应用不同预处理操作的场景,刚好能和Pipeline无缝集成,完美满足你只缩放前2列、保留最后一列二元值的需求。

具体实现步骤:

  1. 导入所需工具:需要StandardScaler、ColumnTransformer和Pipeline,还有numpy用来生成示例数据。
  2. 定义列处理规则:用ColumnTransformer指定:
    • 对前2列(索引0和1)应用StandardScaler
    • 对最后1列(索引2)用'passthrough'参数直接保留,不做任何处理
  3. 集成到Pipeline:把ColumnTransformer作为Pipeline的第一步(如果后续还有模型,直接加在后面就行)

完整代码示例:

import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline

# 生成示例数据:3列,前2列连续值,最后1列二元值
X = np.array([[1.0, 2.0, 0],
              [3.0, 4.0, 1],
              [5.0, 6.0, 0],
              [7.0, 8.0, 1]])

# 定义列转换器:指定要缩放的列和保留的列
preprocessor = ColumnTransformer(
    transformers=[
        ('scaler', StandardScaler(), [0, 1])  # 对0、1列应用StandardScaler
    ],
    remainder='passthrough'  # 剩下的列(这里是第2列)直接保留
)

# 构建Pipeline(如果后续要加模型,直接在列表里添加即可)
pipeline = Pipeline(steps=[('preprocessor', preprocessor)])

# 执行预处理
X_processed = pipeline.fit_transform(X)

print("处理后的数据:")
print(X_processed)

代码解释:

  • ColumnTransformer的transformers参数是一个列表,每个元素是一个三元组:(名称, 预处理对象, 列索引/列名),这里我们给缩放操作命名为'scaler',指定对索引0和1的列应用StandardScaler。
  • remainder='passthrough'是关键:它会把所有没有被指定处理的列原封不动地保留下来,刚好对应你的第三列二元值。如果不设置这个参数,默认会丢弃未指定的列,这就不符合你的需求了。
  • 把这个preprocessor放到Pipeline里后,后续无论是训练模型还是预测,都可以直接用pipeline.fit()或者pipeline.transform(),完全实现了一步完成预处理的目标。

如果你的数据集是DataFrame而不是numpy数组,也可以直接用列名来指定(比如['col1', 'col2']),用法是一样的哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:07:31