目录
1.3 ColumnTransformer和Pipeline类
机器学习中的转换器、估计器与管道工程
1. 知识回顾
1.1 转化器和估计器的概念
转化器(Transformer):
-
用于数据预处理和特征工程的类
-
必须实现
fit()
和transform()
方法 -
示例:
StandardScaler
,OneHotEncoder
,SimpleImputer
估计器(Estimator):
-
用于模型训练的类
-
必须实现
fit()
和predict()
方法 -
示例: 各种分类器(
RandomForestClassifier
)、回归器(LinearRegression
)
1.2 管道工程(Pipeline)
管道(Pipeline)是将多个数据处理步骤和最终估计器串联起来的工具:
-
按顺序执行一系列转换步骤
-
最后一个步骤通常是估计器(模型)
-
优点:
-
代码更简洁
-
避免数据泄露
-
便于交叉验证
-
可重复使用
-
1.3 ColumnTransformer和Pipeline类
ColumnTransformer:
-
用于对数据框的不同列应用不同的转换
-
可以并行处理数值型和类别型特征
-
语法示例:
ColumnTransformer(transformers=[ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features) ])
Pipeline类:
-
将多个处理步骤串联
-
语法示例:
Pipeline(steps=[ ('preprocessor', preprocessor), ('classifier', classifier) ])
2. 作业: 通用机器学习Pipeline逻辑顺序
通用Pipeline的典型顺序:
-
数据分割: 首先将数据分为训练集和测试集
-
列选择: 识别不同类型的特征(数值型、类别型、文本等)
-
预处理:
-
数值特征:
-
缺失值处理(填充/删除)
-
标准化/归一化
-
特征缩放
-
多项式特征生成
-
-
类别特征:
-
缺失值处理
-
编码(OneHot, Ordinal, Target等)
-
-
文本特征:
-
向量化(TF-IDF, Count等)
-
-
日期/时间特征:
-
提取特征(年、月、日、星期等)
-
-
-
特征选择: 选择最有价值的特征(可选步骤)
-
模型训练: 应用机器学习算法
-
模型评估: 在测试集上评估性能
通用Pipeline模板代码:
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
# 1. 数据分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
# 2. 定义列类型
numeric_features = ['age', 'income']
categorical_features = ['gender', 'education']
# 3. 创建转换器
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
# 4. 组合转换器
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# 5. 创建完整管道
clf = Pipeline(steps=[
('preprocessor', preprocessor),
('classifier', RandomForestClassifier())])
# 6. 训练和评估
clf.fit(X_train, y_train)
score = clf.score(X_test, y_test)
3. 学习笔记
关键要点:
-
数据预处理顺序很重要:
-
先处理缺失值,再进行特征转换
-
数值特征和类别特征通常需要不同的处理方式
-
-
Pipeline优势:
-
确保测试数据不参与任何预处理步骤的拟合
-
简化代码结构,提高可读性
-
便于超参数调优(可以一次调整所有步骤的参数)
-
-
ColumnTransformer的作用:
-
允许对不同类型数据并行应用不同转换
-
保持数据框结构,便于理解
-
-
通用Pipeline适用性:
-
可以轻松更换最后的估计器(分类/回归)
-
可以根据数据类型添加或删除预处理步骤
-
支持自定义转换器
-
最佳实践:
-
始终先分割数据再进行任何预处理
-
对训练数据使用
fit_transform
,对测试数据只使用transform
-
使用Pipeline可以自动处理这一区别
-
为每个特征类型创建单独的子Pipeline
-
使用有意义的步骤名称便于调试