首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
4.1 分类变量
4.1.1 One-Hot 编码(虚拟变量)
4.1.2 数字可以编码分类变量
4.2 分箱、离散化、线性模型与树
4.3 交互特征与多项式特征
4.4 单变量非线性变换
4.5 自动化特征选择
4.5.1 单变量统计
4.5.2 基于模型的特征选择
4.5.3 迭代特征选择
4.6 利用专家知识
5.1 交叉验证
5.1.1 scikit-learn 中的交叉验证
5.1.2 交叉验证的优点
5.1.3 分层k 折交叉验证和其他策略
5.2 网格搜索
5.2.1 简单网格搜索
5.2.2 参数过拟合的风险与验证集
5.2.3 带交叉验证的网格搜索
5.3 评估指标与评分
5.3.1 牢记目标
5.3.2 二分类指标
5.3.3 多分类指标
5.3.4 回归指标
5.3.5 在模型选择中使用评估指标
6.1 用预处理进行参数选择
6.2 构建管道
6.3 在网格搜索中使用管道
6.4 通用的管道接口
6.4.1 用make_pipeline 方便地创建管道
6.4.2 访问步骤属性
6.4.3 访问网格搜索管道中的属性
6.5 网格搜索预处理步骤与模型参数
6.6 网格搜索选择使用哪个模型
7.1 用字符串表示的数据类型
7.2 示例应用:电影评论的情感分析
7.3 将文本数据表示为词袋
7.3.1 将词袋应用于玩具数据集
7.3.2 将词袋应用于电影评论
7.4 停用词
7.5 用tf-idf 缩放数据
7.6 研究模型系数
7.7 多个单词的词袋(n元分词)
7.8 分词、词干提取与词形还原
7.9 主题建模与文档聚类
8.1 处理机器学习问题
8.2 从原型到生产
8.3 测试生产系统
8.4 构建你自己的估计器
8.5 下一步怎么走
8.5.1 理论
8.5.2 其他机器学习框架和包
8.5.3 排序、推荐系统与其他学习类型
8.5.4 概率建模、推断与概率编程
8.5.5 神经网络
8.5.6 推广到更大的数据集
当前位置:
首页>>
技术小册>>
Python机器学习基础教程(下)
小册名称:Python机器学习基础教程(下)
### 6.4 通用的管道接口 在Python的机器学习领域中,数据预处理、模型训练、评估及预测等步骤往往错综复杂且相互依赖。为了有效地管理和优化这些流程,Scikit-learn库引入了“管道”(Pipeline)这一概念,它提供了一种封装数据预处理和模型训练过程的方式,使得这些步骤可以作为一个整体被对待,从而简化了模型构建的过程,提高了代码的可读性和可维护性。本章将深入介绍Scikit-learn中的通用管道接口,包括其基本概念、使用方法、优势以及高级应用。 #### 6.4.1 管道接口概述 在Scikit-learn中,管道(Pipeline)是一个估计器(estimator),它按顺序排列了一系列的转换步骤(transformers)和最终的估计器(通常是分类器、回归器等)。这种结构允许数据在通过管道时,自动依次经过各个转换步骤的处理,最终到达并应用于最终估计器。这一过程不仅简化了代码,还确保了数据处理步骤和模型训练步骤之间的一致性和可重复性。 管道的核心优势在于: 1. **简化工作流**:将多个步骤封装为一个对象,使得模型训练过程更加清晰和简洁。 2. **减少数据泄露**:在交叉验证等评估过程中,管道能够确保训练数据仅用于训练,验证数据仅用于验证,从而避免数据泄露导致的模型过拟合问题。 3. **提升效率**:通过缓存中间结果,避免重复计算,特别是在进行多次模型训练或参数调优时。 #### 6.4.2 创建和使用管道 在Scikit-learn中,`Pipeline`类位于`sklearn.pipeline`模块下,使用前需先导入。创建管道的基本语法如下: ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 创建一个管道,包括标准化步骤和逻辑回归分类器 pipe = Pipeline(steps=[ ('scaler', StandardScaler()), ('classifier', LogisticRegression()) ]) ``` 在上述示例中,我们首先导入了`Pipeline`类、`StandardScaler`(用于特征标准化)和`LogisticRegression`(逻辑回归分类器)。然后,通过传递一个步骤列表(`steps`)给`Pipeline`的构造函数来创建管道。每个步骤都是一个元组,包含步骤的名称(如`'scaler'`、`'classifier'`)和对应的估计器实例。 创建管道后,可以像使用其他估计器一样使用它,包括拟合(`fit`)、预测(`predict`)、评估(如`score`)等: ```python from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据 data = load_iris() X, y = data.data, data.target # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 拟合管道 pipe.fit(X_train, y_train) # 预测 y_pred = pipe.predict(X_test) # 评估 accuracy = pipe.score(X_test, y_test) print(f'Accuracy: {accuracy:.2f}') ``` #### 6.4.3 管道的高级应用 **1. 交叉验证与网格搜索** 管道与Scikit-learn的交叉验证(如`GridSearchCV`、`RandomizedSearchCV`)和模型选择工具完美集成。这意味着你可以直接在管道上应用这些工具来搜索最优参数,而无需担心数据泄露问题。 ```python from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid = { 'classifier__C': [0.1, 1, 10], 'classifier__penalty': ['l1', 'l2'] } # 创建GridSearchCV对象 grid_search = GridSearchCV(pipe, param_grid, cv=5, scoring='accuracy') # 执行网格搜索 grid_search.fit(X_train, y_train) # 最佳参数 print("Best parameters found: ", grid_search.best_params_) # 最佳模型分数 print("Best score: ", grid_search.best_score_) ``` **2. 自定义转换步骤** 除了使用Scikit-learn内置的转换器外,你还可以定义自己的转换步骤,只要这些步骤实现了`fit`、`transform`(可选`fit_transform`)和`get_params`(可选`set_params`)方法即可。 ```python from sklearn.base import TransformerMixin, BaseEstimator class CustomTransformer(TransformerMixin, BaseEstimator): def fit(self, X, y=None): # 拟合过程(如果需要的话) return self def transform(self, X): # 转换过程 # 假设我们只是简单地返回X的转置(仅为示例) return X.T # 将自定义转换器加入管道 custom_pipe = Pipeline(steps=[ ('scaler', StandardScaler()), ('custom', CustomTransformer()), ('classifier', LogisticRegression()) ]) ``` **3. 嵌套管道** 在复杂的场景中,你可能需要将一个管道作为另一个管道的步骤,这称为嵌套管道。虽然直接创建嵌套管道可能稍显复杂,但它为处理复杂的数据流和模型结构提供了极大的灵活性。 ```python from sklearn.decomposition import PCA # 创建一个内部管道,用于特征降维 inner_pipe = Pipeline(steps=[ ('scaler', StandardScaler()), ('pca', PCA(n_components=2)) ]) # 外部管道,使用内部管道的输出作为输入 outer_pipe = Pipeline(steps=[ ('feature_reduction', inner_pipe), ('classifier', LogisticRegression()) ]) ``` #### 6.4.4 结论 Scikit-learn的管道接口为构建复杂的机器学习工作流提供了强大的工具。通过封装数据预处理、特征转换和模型训练等步骤,管道不仅简化了代码,还提高了模型训练过程的效率和可重复性。此外,管道与Scikit-learn的其他工具(如交叉验证、网格搜索)的无缝集成,使得模型的选择和调优变得更加便捷。掌握管道接口的使用,对于任何希望在Python中进行高效机器学习实践的人来说,都是一项不可或缺的技能。
上一篇:
6.3 在网格搜索中使用管道
下一篇:
6.4.1 用make_pipeline 方便地创建管道
该分类下的相关小册推荐:
Python3网络爬虫开发实战(下)
Python合辑10-函数
Python3网络爬虫开发实战(上)
Python合辑2-字符串常用方法
Python神经网络入门与实践
Python机器学习基础教程(上)
实战Python网络爬虫
Python编程轻松进阶(四)
Python数据分析与挖掘实战(下)
Python自动化办公实战
剑指Python(万变不离其宗)
Python高性能编程与实战