Python机器学习基础教程9

一、算法链与管道

大多数机器学习应用不仅需要应用单个算法,而且还需要将许多不同的处理步骤和机器学习模型链接在一起。本章将介绍如何使用Pipeline 类来简化构建变换和模型链的过程。我们将重点介绍如何将 Pipeline 和 GridSearchCV 结合起来,从而同时搜索所有
处理步骤中的参数。
举例说明模型连的重要性:

from sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler

# 加载并划分数据
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)

# 计算训练数据的最小值和最大值
scaler = MinMaxScaler().fit(X_train)

# 对训练数据进行缩放
X_train_scaled = scaler.transform(X_train)
svm = SVC()

# 在缩放后的训练数据上学习SVM
svm.fit(X_train_scaled, y_train)

# 对测试数据进行缩放,并计算缩放后的数据的分数
X_test_scaled = scaler.transform(X_test)
print("Test score: {:.2f}".format(svm.score(X_test_scaled, y_test)))

运行结果:
Test score: 0.97

用预处理进行参数选择

希望利用 GridSearchCV 找到更好的 SVC 参数。

from sklearn.model_selection import GridSearchCV
# 只是为了便于说明,不要在实践中使用这些代码!
param_grid = {
   'C': [0.001, 0.01, 0.1, 1, 10, 100],'gamma': [0.001, 0.01, 0.1, 1, 10, 100]}

grid = GridSearchCV(SVC(), param_grid=param_grid, cv=5)
grid.fit(X_train_scaled, y_train)

print("Best cross-validation accuracy: {:.2f}".format(grid.best_score_))
print("Best set score: {:.2f}".format(grid.score(X_test_scaled, y_test)))
print("Best parameters: ", grid.best_params_)

运行结果:
Best cross-validation accuracy: 0.98
Best set score: 0.97
Best parameters:  {
   'C': 1, 'gamma': 1}

利用缩放后的数据对SVC进行网格搜索,但是,在代码中有一个不容易察觉的错误,在缩放数据时候,我们使用了训练集中的所有数据来找到训练的方法,然后我们使用缩放后的数据来运行带交叉验证的网格搜索。对于交叉验证中的每次划分,原始数据集的一部分被划分为训练部分,另一部分被划分为测试部分。测试部分用于度量在训练部分上所训练的模型在新数据上的表现。但是,我们在缩放数据时已经使用过测试部分中所包含的信息。请记住,交叉验证每次划分的测试部分都是训练集的一部分,我们使用整个训练集的信息来找到数据的正确缩放。
对于模型来说,这些数据与新数据看起来截然不同。
在这里插入图片描述
对于建模过程,交叉验证中的划分无法正确地反映新数据的特征。我们已经将这部分数据的信息泄露(leak)给建模过程。这将导致在交叉验证过程中得到过于乐观的结果,并可能会导致选择次优的参数。
为了解决这个问题,在交叉验证的过程中,应该在进行任何预处理之前完成数据集的划分。任何从数据集中提取信息的处理过程都应该仅应用于数据集的训练部分,因此,任何交叉验证都应该位于处理过程的“最外层循环”。
Pipeline 类可以将多个处理步骤合并(glue)为单个 scikit-learn 估计器。Pipeline 类本身具有 fit、predict 和 score 方法,其行为与 scikit-learn 中的其他模型相同。Pipeline 类最常见的用例是将预处理步骤(比如数据缩放)与一个监督模型(比如分类器)链接在一起。

构建管道

使用 Pipeline 类来表示在使用 MinMaxScaler 缩放数据之后再训练一个SVM 的工作流程:首先我们构建一个由步骤列表组成的管道对象。每个步骤都是一个元组,其中包含一个名称(选定的任意字符串)和一个估计器的实例,像其他任何scikit-learn估计器一样来拟合这个管道。fit首先对第一个步骤调用fit,然后使用该缩放器对训练数据进行变换。最后用缩放后的数据来拟合SVM,要想在测试数据上进行评估,只需要调用pipe.score。

from sklearn.pipeline import Pipeline
pipe = Pipeline([("scaler", MinMaxScaler()), ("svm", SVC())])
pipe.fit(X_train, y_train)
print("Test score: {:.2f}".format(pipe.score(X_test, y_test)))

运行结果:
Test score: 0.97

利用管道,我们减少了“预处理 + 分类”过程所需要的代码量。但是,使用管道的主要优点在于,现在我们可以在 cross_val_score 或
GridSearchCV 中使用这个估计器。

在网格搜索中使用管道

我们定义一个需要搜索的参数网格,并利用管道和参数网格构建一个GridSearchCV。在指定参数网格时存在一处细微变化。我们需要为每个参数指定它在管道中所属的步骤。我们要调节的两个参数C和gamma都是SVC的参数,属于第二个步骤。我们给这个步骤的名称是svm。为管道定义参数网格的语法是为每个参数指定步骤名称,后面加上__,然后是参数名称。要想搜索SVC的C参数,必须使用svm_C作为参数网格字典的键,对gamma参数也是同理。

param_grid = {
   'svm__C': [0.001, 0.01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值