首页
技术小册
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.2 构建管道 在Python的机器学习领域中,构建管道(Pipeline)是一项至关重要的技术,它极大地简化了数据预处理、模型训练和评估的流程,提高了代码的可重用性和可维护性。管道的概念源自于将多个数据处理和模型训练步骤封装成一个单一、连贯的流程,从而避免了数据在多个步骤间手动传递时可能出现的错误和不一致性。本章节将深入探讨如何在Python中使用管道,特别是利用scikit-learn库中的`Pipeline`和`ColumnTransformer`来构建高效的机器学习工作流。 #### 6.2.1 管道简介 在机器学习任务中,数据往往需要经过一系列的预处理步骤,如特征选择、缺失值填充、标准化或归一化等,之后才能被用于模型训练。传统上,这些步骤是单独编写的,并在模型训练之前按顺序执行。然而,这种方式存在几个显著的问题:一是代码冗余,每个模型训练前都需要重复相同的预处理步骤;二是容易出错,手动管理数据在不同步骤间的传递可能导致数据不一致;三是难以复用,不同的模型可能需要不同的预处理步骤,但重复编写这些步骤既耗时又低效。 为了解决这些问题,scikit-learn引入了`Pipeline`类,它允许我们将多个步骤(如数据转换器、模型等)串联起来,形成一个单一的流程。在`Pipeline`中,数据自动地在各个步骤间传递,而用户只需关注每个步骤的配置,无需关心数据是如何流动的。此外,`Pipeline`还提供了统一的接口来调用训练(`fit`)、预测(`predict`)等方法,使得整个流程更加简洁和一致。 #### 6.2.2 使用Pipeline 在scikit-learn中,构建管道的基本步骤包括选择所需的转换器(如`StandardScaler`用于标准化数据)和估计器(如`LogisticRegression`用于逻辑回归模型),然后使用`Pipeline`类将它们组合起来。下面是一个简单的示例,展示了如何构建一个包含数据标准化和逻辑回归分类器的管道: ```python from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据 iris = load_iris() X, y = iris.data, iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 构建管道 steps = [('scaler', StandardScaler()), ('classifier', LogisticRegression(max_iter=200))] pipeline = Pipeline(steps) # 训练模型 pipeline.fit(X_train, y_train) # 预测 y_pred = pipeline.predict(X_test) # 评估模型 from sklearn.metrics import accuracy_score print(f"Accuracy: {accuracy_score(y_test, y_pred)}") ``` 在这个例子中,我们首先导入了必要的库和函数,然后加载了iris数据集并将其划分为训练集和测试集。接着,我们定义了一个包含标准化器和逻辑回归分类器的步骤列表,并使用这个列表创建了一个`Pipeline`对象。最后,我们通过调用`fit`和`predict`方法来训练模型和进行预测,并评估了模型的准确率。 #### 6.2.3 处理异构数据 在实际应用中,数据往往包含多种类型的特征,如数值型、类别型等,这些特征可能需要不同的预处理方式。为了处理这种情况,scikit-learn提供了`ColumnTransformer`,它允许我们对数据集中的不同列应用不同的转换器。`ColumnTransformer`可以与`Pipeline`结合使用,以实现对异构数据的灵活处理。 以下是一个使用`ColumnTransformer`和`Pipeline`处理包含数值型和类别型特征的示例: ```python from sklearn.compose import ColumnTransformer from sklearn.preprocessing import OneHotEncoder # 假设X是一个包含数值型和类别型特征的DataFrame # 这里为了示例,我们手动创建一个简单的DataFrame import pandas as pd import numpy as np # 创建一个包含数值型和类别型特征的DataFrame X = pd.DataFrame({ 'num_feature': np.random.randn(100), 'cat_feature': np.random.choice(['A', 'B', 'C'], 100) }) y = np.random.randint(0, 2, 100) # 假设的二元目标变量 # 定义数值型和类别型特征的预处理步骤 numeric_features = ['num_feature'] numeric_transformer = Pipeline(steps=[('scaler', StandardScaler())]) categorical_features = ['cat_feature'] categorical_transformer = Pipeline(steps=[('onehot', OneHotEncoder(handle_unknown='ignore'))]) # 创建一个ColumnTransformer,将不同的转换器应用于不同的特征列 preprocessor = ColumnTransformer( transformers=[ ('num', numeric_transformer, numeric_features), ('cat', categorical_transformer, categorical_features) ]) # 将预处理器和模型组合成管道 clf = Pipeline(steps=[('preprocessor', preprocessor), ('classifier', LogisticRegression(max_iter=200))]) # 训练模型(注意:这里需要确保X是DataFrame或类似结构) clf.fit(X, y) # 预测(略) ``` 在这个例子中,我们首先创建了一个包含数值型和类别型特征的`DataFrame`,并定义了相应的预处理步骤。然后,我们使用`ColumnTransformer`来指定哪些转换器应用于哪些特征列。最后,我们将`ColumnTransformer`和逻辑回归分类器组合成一个管道,并训练了模型。 #### 6.2.4 管道的优势与最佳实践 构建管道的优势在于它提高了代码的可重用性、可维护性和可测试性。通过封装复杂的预处理和建模流程,管道使得机器学习项目更加模块化和易于管理。此外,管道还支持网格搜索(GridSearchCV)等超参数调优技术,使得用户可以方便地找到最优的模型配置。 在实践中,构建管道时应当注意以下几点最佳实践: 1. **清晰定义步骤**:确保每个步骤都有明确的输入和输出,并且步骤之间的数据流动是合理的。 2. **重用性**:尽量将可复用的部分(如数据预处理步骤)封装成独立的转换器或管道,以便在其他项目中重用。 3. **模块化**:将复杂的流程拆分成多个模块,每个模块只负责一个具体的任务,这样可以降低代码的复杂度和出错率。 4. **文档化**:为管道中的每个步骤和转换器编写清晰的文档,说明其功能和用途,以便其他开发者理解和维护代码。 总之,构建管道是Python机器学习项目中不可或缺的一部分,它能够帮助我们更加高效和系统地处理数据、训练模型并评估性能。通过掌握管道的使用技巧,我们可以显著提升机器学习项目的质量和效率。
上一篇:
6.1 用预处理进行参数选择
下一篇:
6.3 在网格搜索中使用管道
该分类下的相关小册推荐:
Python编程轻松进阶(三)
Python合辑11-闭包函数
Python高性能编程与实战
Python合辑7-集合、列表与元组
Python合辑10-函数
Python数据分析与挖掘实战(下)
Python与办公-玩转Word
Python与办公-玩转PDF
剑指Python(万变不离其宗)
Python3网络爬虫开发实战(下)
Python爬虫入门与实战开发(下)
Python合辑6-字典专题