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

如何在sklearn Pipeline中仅标准化数值型变量?

解决Sklearn Pipeline仅标准化数值变量的问题

这问题太常见了——直接套Pipeline确实会一股脑把所有列都标准化,包括你辛苦转好的哑变量。不过别担心,用ColumnTransformer就能完美解决这个精准处理不同列的需求,下面给你一步步讲怎么实现:

核心思路

用ColumnTransformer把数据分成两组:一组是需要标准化的数值型变量,另一组是直接保留的哑变量。把这个预处理逻辑作为Pipeline的第一步,后面再接KNN模型就行。

具体实现步骤

  1. 导入必要的库

    import pandas as pd
    from sklearn.pipeline import Pipeline, ColumnTransformer
    from sklearn.preprocessing import StandardScaler
    from sklearn.neighbors import KNeighborsClassifier  # 分类任务用这个;回归任务换KNeighborsRegressor
    
  2. 区分数值列和哑变量列
    你已经用pd.get_dummies转好了哑变量,所以可以通过数据类型或者列名来区分两组列:

    # 假设你的数据集是df
    # 提取数值型列(比如int64、float64类型)
    numerical_features = df.select_dtypes(include=['int64', 'float64']).tolist()
    # 提取哑变量列(通常是uint8类型,因为get_dummies生成的0/1列默认是这个类型)
    dummy_features = df.select_dtypes(include=['uint8']).tolist()
    

    当然你也可以手动指定列名,比如numerical_features = ['age', 'income'],更灵活。

  3. 构建预处理转换器
    用ColumnTransformer定义对不同列的处理规则:

    preprocessor = ColumnTransformer(
        transformers=[
            # 对数值列做标准化
            ('num_scaler', StandardScaler(), numerical_features),
            # 对哑变量列直接跳过处理,原样保留
            ('dummy_passthrough', 'passthrough', dummy_features)
        ])
    
  4. 组装完整的Pipeline
    把预处理和KNN模型串起来:

    # 分类任务示例
    pipeline = Pipeline([
        ('preprocessing', preprocessor),
        ('knn_classifier', KNeighborsClassifier(n_neighbors=5))
    ])
    
    # 如果是回归任务,替换成KNeighborsRegressor
    # pipeline = Pipeline([
    #     ('preprocessing', preprocessor),
    #     ('knn_regressor', KNeighborsRegressor(n_neighbors=5))
    # ])
    
  5. 使用Pipeline训练和预测
    接下来就像用普通Pipeline一样操作就行:

    # 假设X是特征集,y是目标变量
    pipeline.fit(X_train, y_train)
    y_pred = pipeline.predict(X_test)
    

额外提示

  • 如果你是在Pipeline里从零处理分类变量(还没转哑变量),其实可以把OneHotEncoder也整合到ColumnTransformer里,这样整个流程更规范,还能避免训练集和测试集哑变量列不一致的问题,比如:
    from sklearn.preprocessing import OneHotEncoder
    preprocessor = ColumnTransformer(
        transformers=[
            ('num', StandardScaler(), numerical_features),
            ('cat', OneHotEncoder(handle_unknown='ignore'), categorical_features)
        ])
    
    不过你已经用pd.get_dummies处理过了,前面的方案完全够用。
  • 记得确保训练集和测试集的列顺序、列名完全一致,不然ColumnTransformer会报错哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:17:21