https://blog.csdn.net/weixin_45655710?type=blog
@浙大疏锦行
DAY 23 pipeline 管道
知识回顾:
1.转化器和估计器的概念
2.管道工程
3. ColumnTransformer和 Pipeline类
作业:
整理下全部逻辑的先后顺序,看看能不能制作出适合所有机器学习的通用 pipeline
好的,这是一个非常重要的复习内容!理解Pipeline和ColumnTransformer的逻辑结构,是掌握现代 Scikit-learn 和防止数据泄露的关键。
针对您的作业,我为您整理了当前信贷数据集的代码逻辑顺序,并提出了一个通用的机器学习 Pipeline 结构。
💡 作业一:整理当前代码的逻辑先后顺序
您提供的代码展示了从原始数据到最终模型评估的完整流程。使用Pipeline结构后,整个流程被清晰地拆分和封装。
1. 整体流程步骤 (宏观视角)
| 序号 | 步骤名称 | 对应操作 | 负责人 | 状态 |
|---|---|---|---|---|
| 1 | 数据加载 | pd.read_csv() | 外部 | 原始数据 |
| 2 | 数据划分 | train_test_split() | 外部 | 原始X train , X test , y train , y test X_{\text{train}}, X_{\text{test}}, y_{\text{train}}, y_{\text{test}}Xtrain,Xtest,ytrain,ytest |
| 3 | Pipeline 定义 | ColumnTransformer+Pipeline | 外部 | 定义模型结构 |
| 4 | 模型训练 | pipeline.fit(X_train, y_train) | Pipeline 内部 | X train X_{\text{train}}Xtrain预处理→ \to→分类器训练 |
| 5 | 模型预测 | pipeline.predict(X_test) | Pipeline 内部 | X test X_{\text{test}}Xtest预处理→ \to→分类器预测 |
| 6 | 模型评估 | classification_report() | 外部 | 结果分析 |
2. Pipeline 内部执行逻辑 (微观视角)
当执行pipeline.fit(X_train, y_train)或pipeline.predict(X_test)时,Pipeline会按以下顺序和规则执行内部的ColumnTransformer和RandomForestClassifier:
A. 预处理器preprocessor(ColumnTransformer)的执行顺序
ColumnTransformer是预处理的核心,它将不同的转换器(Transformer)并行应用于不同的列子集。
| 特征类型 | 转换器串联 (Pipeline 内部) | 目的 |
|---|---|---|
| 有序分类 | SimpleImputer(众数填充)→ \to→OrdinalEncoder(有序编码) | 处理Home Ownership,Years in current job,Term |
| 标称分类 | SimpleImputer(众数填充)→ \to→OneHotEncoder(独热编码) | 处理Purpose |
| 连续数值 | SimpleImputer(众数填充)→ \to→StandardScaler(标准化) | 处理剩余的数值特征 |
ColumnTransformer 行为规则:
- 并行处理:三种特征类型的转换器是同时运行的。
- 整合输出:所有转换器的输出结果(经过填充、编码、缩放)被水平拼接成一个单一的、干净的 NumPy 数组,然后传递给下一步的估计器。
B. Pipeline 训练与预测规则
| 阶段 | 转换器 (preprocessor) | 估计器 (classifier) | 核心意义 (防止数据泄露) |
|---|---|---|---|
| 训练 | fit_transform(X_train):计算并存储规则(均值、标准差、编码字典),并转换数据。 | fit(X_processed, y_train):学习模型的参数(如随机森林的树结构)。 | 转换规则只在训练集上学习。 |
| 预测 | transform(X_test):直接应用训练阶段学到的规则来转换数据。 | predict(X_processed):直接使用训练好的模型参数进行预测。 | 避免在测试集上学习任何统计量。 |
💡 作业二:制作适合所有机器学习的通用 Pipeline
通用 Pipeline 的设计思想是:定义所有可能的处理步骤,然后通过参数灵活地开启或关闭它们。
以下是一个通用的机器学习 Pipeline 模板,它涵盖了数据预处理、特征选择和模型训练等环节。
通用机器学习 Pipeline 结构模板
fromsklearn.pipelineimportPipelinefromsklearn.composeimportColumnTransformer# ... 其他必要的导入# 1. 定义不同类型的特征列 (这是最依赖具体数据集的一步)NUMERIC_FEATURES=[...]# 连续数值特征ORDINAL_FEATURES=[...]# 有序分类特征NOMINAL_FEATURES=[...]# 标称分类特征(需要独热编码)# ----------------- 步骤 1: 预处理 Transformers -----------------# 1.1 数值特征 Pipeline (通用且常见)numeric_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='median')),# 缺失值处理(中位数/均值)('scaler',StandardScaler())# 数据缩放(标准化/归一化)])# 1.2 有序特征 Pipelineordinal_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='most_frequent')),# 缺失值处理(众数)('encoder',OrdinalEncoder())# 有序编码])# 1.3 标称特征 Pipelinenominal_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='most_frequent')),# 缺失值处理(众数)('onehot',OneHotEncoder(handle_unknown='ignore'))# 独热编码])# ----------------- 步骤 2: ColumnTransformer 整合 -----------------preprocessor=ColumnTransformer(transformers=[('num',numeric_transformer,NUMERIC_FEATURES),('ord',ordinal_transformer,ORDINAL_FEATURES),('nom',nominal_transformer,NOMINAL_FEATURES)],remainder='drop'# 丢弃未指定的列(除非您确定要保留))# ----------------- 步骤 3: 完整 Pipeline -----------------# 引入一个特征选择步骤,使 Pipeline 更通用fromsklearn.feature_selectionimportSelectKBestfromsklearn.linear_modelimportLogisticRegression# 例子:一个分类估计器universal_pipeline=Pipeline(steps=[('preprocessor',preprocessor),# A. 预处理 (ColumnTransformer)('feature_selection',SelectKBest(k='all')),# B. 特征选择 (可选)('estimator',LogisticRegression(random_state=42))# C. 估计器/模型 (分类器/回归器)])通用 Pipeline 的优势和调优
这种通用结构的最大优势在于,它将操作流程和具体参数分离,完美适配GridSearchCV或RandomizedSearchCV进行超参数调优。
灵活调参:
您可以轻松调优预处理步骤的参数,例如:- Imputer 策略:
'preprocessor__num__imputer__strategy': ['median', 'mean'] - Scaler 类型:完全移除
StandardScaler步骤,或替换为MinMaxScaler。 - 特征选择:
'feature_selection__k': [50, 100, 'all']
- Imputer 策略:
兼容性强:
- 如果数据集中没有缺失值,您可以在调参时将
SimpleImputer的步骤参数设置为空列表[]来跳过该步骤。 - 如果不需要特征选择,可以直接将
SelectKBest的参数'k'设置为'all',或者在调参中将其移除。
- 如果数据集中没有缺失值,您可以在调参时将
这种封装和流程化的思想(DRY 原则)是现代数据科学项目的基础。