如何在sklearn Pipeline中仅标准化数值型变量?
解决Sklearn Pipeline仅标准化数值变量的问题
这问题太常见了——直接套Pipeline确实会一股脑把所有列都标准化,包括你辛苦转好的哑变量。不过别担心,用ColumnTransformer就能完美解决这个精准处理不同列的需求,下面给你一步步讲怎么实现:
核心思路
用ColumnTransformer把数据分成两组:一组是需要标准化的数值型变量,另一组是直接保留的哑变量。把这个预处理逻辑作为Pipeline的第一步,后面再接KNN模型就行。
具体实现步骤
导入必要的库
import pandas as pd from sklearn.pipeline import Pipeline, ColumnTransformer from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier # 分类任务用这个;回归任务换KNeighborsRegressor区分数值列和哑变量列
你已经用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'],更灵活。构建预处理转换器
用ColumnTransformer定义对不同列的处理规则:preprocessor = ColumnTransformer( transformers=[ # 对数值列做标准化 ('num_scaler', StandardScaler(), numerical_features), # 对哑变量列直接跳过处理,原样保留 ('dummy_passthrough', 'passthrough', dummy_features) ])组装完整的Pipeline
把预处理和KNN模型串起来:# 分类任务示例 pipeline = Pipeline([ ('preprocessing', preprocessor), ('knn_classifier', KNeighborsClassifier(n_neighbors=5)) ]) # 如果是回归任务,替换成KNeighborsRegressor # pipeline = Pipeline([ # ('preprocessing', preprocessor), # ('knn_regressor', KNeighborsRegressor(n_neighbors=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
相关产品推荐
相关产品推荐

