求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 


业务架构设计
4月18-19日 在线直播



基于UML和EA进行系统分析设计
4月25-26日 北京+在线



AI 智能化软件测试方法与实践
5月23-24日 上海+在线
 
追随技术信仰

随时听讲座
每天看新闻
 
 
Sklearn 教程
1. Sklearn简介
2. Sklearn安装
3. Sklearn 基础概念
4. Sklearn 数据预处理
5. Sklearn 机器学习模型
6. Sklearn 模型评估与调优
7. Sklearn 管道(Pipeline)
8. Sklearn 自定义模型与功能
9. Sklearn 模型保存与加载
9. Sklearn 应用案例
 

 
目录
Sklearn 管道(Pipeline)
159 次浏览
5次  

在机器学习项目中,数据处理、特征工程、模型训练、评估等步骤往往是互相依赖的,这些步骤的顺序和协调性对于最终模型的性能至关重要。

Pipeline 是 scikit-learn 中用于组织和简化这些步骤的一个重要工具。

通过 Pipeline,我们可以将数据预处理与模型训练整合在一起,从而简化工作流并提高代码的可复用性。

什么是 Pipeline

Pipeline 是一个可按顺序执行多个数据处理步骤和模型训练步骤的工具。

在 Pipeline 中,每个步骤是一个元组,包含一个名称和一个对象。

每个对象通常是一个 转换器(Transformer) 或 估计器(Estimator),其中:

  • 转换器(Transformer) 是执行数据转换的对象,比如数据预处理(例如归一化、标准化、特征选择等)。

  • 估计器(Estimator) 是用于训练模型的对象,例如分类器或回归器。

Pipeline 使得将多个步骤整合为一个可重用的工作流变得简单,并且可以确保数据处理过程的一致性,避免因代码重复或手动处理导致的错误。

为什么要使用 Pipeline

  • 简化代码:将多个步骤组合成一个整体,简化了代码结构和管理。

  • 避免数据泄漏:在数据预处理时,确保训练集和测试集的处理是隔离的,避免数据泄漏。比如,标准化操作时,不能在测试集上计算均值和标准差。

  • 减少重复工作:通过 Pipeline 可以把数据预处理与模型训练过程串联起来,避免在每次训练时重复写预处理代码。

  • 提高可复用性:将数据处理和模型训练封装成一个 Pipeline 对象,可以在不同的项目和数据集上复用。

  • 方便调优:通过 Pipeline 可以直接在调优时应用超参数优化、交叉验证等,简化整个流程。

Pipeline 的组成部分

Pipeline 由多个步骤(step)组成,每个步骤是一个元组,包含两个元素:

  • 步骤名称(字符串类型): 用于标识每个步骤。

  • 转换器或估计器: 用于数据处理或建模的对象。

常见的步骤包括:

  • 数据预处理步骤:如数据清洗、标准化、编码等。

  • 模型训练步骤:如分类器、回归器等。

创建一个简单的 Pipeline

假设我们有一个数据集,并且需要对数据进行标准化后训练一个支持向量机(SVM)分类器。我们可以将标准化和模型训练步骤组合成一个管道(Pipeline)。

实例

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris

# 加载数据
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.2, random_state=42)

# 创建 Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 数据标准化
    ('svc', SVC())  # 支持向量机分类器
])

# 训练模型
pipeline.fit(X_train, y_train)

# 预测结果
y_pred = pipeline.predict(X_test)

# 打印模型精度
print(f"Model accuracy: {pipeline.score(X_test, y_test)}")

执行以上代码,输出如下:

Model accuracy: 1.0

Pipeline 工作原理

在上面的示例中,Pipeline 执行了两个步骤:

  • 数据标准化(通过 StandardScaler()):对数据进行标准化处理,使每个特征具有均值 0 和方差 1。

  • 模型训练(通过 SVC()):在标准化后的数据上训练支持向量机分类器。

Pipeline 的工作流程是:首先执行数据预处理步骤(如标准化),然后传递处理后的数据给模型进行训练。这个过程可以通过

pipeline.fit() 一步完成,pipeline.predict() 进行预测时,数据也会按照相同的顺序通过管道中的每个步骤。

Pipeline 的优势

简化代码和流程

通过 Pipeline,我们可以将多个步骤整合成一个对象,从而减少了手动执行多个步骤的代码。

没有使用,需要多次执行预处理:

实例

# Without Pipeline (需要多次执行预处理)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

model = SVC()
model.fit(X_train_scaled, y_train)
y_pred = model.predict(X_test_scaled)

使用 Pipeline,一步完成:

实例

# With Pipeline (一步完成)
pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('svc', SVC())
])

pipeline.fit(X_train, y_train)
y_pred = pipeline.predict(X_test)

保证训练和测试数据处理一致性

在没有 Pipeline 时,如果我们手动进行数据处理和训练,可能会不小心对训练集和测试集使用不同的处理方法,导致数据泄漏。

例如,我们在训练集上计算标准化的均值和方差,但如果在测试集上计算了不同的均值和方差,就会导致模型的评估不准确。使用 Pipeline 可以确保这些处理方法的一致性。

自动化整个过程

Pipeline 可以让我们将多个步骤封装成一个对象,自动化整个数据预处理、模型训练和预测的过程。通过这个自动化的流程,可以减少人为错误,并提高代码的可复用性。

Pipeline 的调参与优化

当我们使用 Pipeline 时,可以直接进行超参数调优。

通过结合 GridSearchCV 或 RandomizedSearchCV,可以优化管道中的每一个步骤的超参数。

使用 GridSearchCV 调优 Pipeline 中的超参数:

实例

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.model_selection import GridSearchCV


# 加载数据
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.2, random_state=42)

# 创建 Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 数据标准化
    ('svc', SVC())  # 支持向量机分类器
])

# 训练模型
pipeline.fit(X_train, y_train)

# 定义超参数网格
param_grid = {
    'svc__C': [0.1, 1, 10],  # 调整 SVC 中的 C 参数
    'svc__kernel': ['linear', 'rbf']  # 调整 kernel 参数
}

# 创建 GridSearchCV 对象
grid_search = GridSearchCV(pipeline, param_grid, cv=5)

# 执行超参数调优
grid_search.fit(X_train, y_train)

# 输出最佳参数和得分
print(f"Best parameters: {grid_search.best_params_}")
print(f"Best score: {grid_search.best_score_}")

<
strong>说明:
  • svc__Csvc__kernel 是 Pipeline 中 SVC 步骤的超参数。通过在 GridSearchCV 中指定这些参数,我们可以直接对 Pipeline 中的模型进行超参数调优。

  • cv=5 表示 5 折交叉验证。

输出结果如下:

实例

Best parameters: {'svc__C': 0.1, 'svc__kernel': 'linear'}
Best score: 0.9583333333333334

使用 Pipeline 进行交叉验证

可以结合 Pipeline 和交叉验证,确保整个模型的评估过程是一致的。在交叉验证中,每次迭代都会对训练数据进行预处理,然后训练模型进行验证。

实例

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score


# 加载数据
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.2, random_state=42)

# 创建 Pipeline
pipeline = Pipeline([
    ('scaler', StandardScaler()),  # 数据标准化
    ('svc', SVC())  # 支持向量机分类器
])

# 训练模型
pipeline.fit(X_train, y_train)

# 执行 5 折交叉验证
cv_scores = cross_val_score(pipeline, X, y, cv=5)

# 输出交叉验证分数
print(f"Cross-validation scores: {cv_scores}")
print(f"Mean cross-validation score: {cv_scores.mean()}")

在这个例子中,cross_val_score 会自动对数据进行交叉验证,同时在每次训练前对数据进行标准化处理。

输出结果如下/:

Cross-validation scores: [0.96666667 0.96666667 0.96666667 0.93333333 1.        ]
Mean cross-validation score: 0.9666666666666666

您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



159 次浏览
5次