楼主: 时光人
639 1

python机器学习: 管道的构建及其应用 [推广有奖]

  • 3关注
  • 34粉丝

已卖:165份资源

院士

23%

还不是VIP/贵宾

-

威望
1
论坛币
26913 个
通用积分
429.8724
学术水平
95 点
热心指数
109 点
信用等级
91 点
经验
39970 点
帖子
1630
精华
3
在线时间
580 小时
注册时间
2019-2-25
最后登录
2025-5-6

楼主
时光人 学生认证  发表于 2019-12-2 10:46:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

AIU人工智能学院:数据科学、人工智能从业者的在线大学。

数据科学(Python/R/Julia)数据分析、机器学习、深度学习

通过前面的说明,我们已经知道Pipeline可以用于将多个处理步骤合并为一个,并且本身具备fit、predict和score方法,其行为与scikit-learn中的其他模型相同,并且最常见的用力是将预处理步骤(比如缩放)与一个监督模型(比如分类器)链接在一起。

构建管道:我们来看使用Pipeline类表示MinMaxScaler缩放数据之后在使用一个SVM工作流程(暂时不适用网格搜索)。

首先,我们构造一个由步骤列表组成的管道对象,每个步骤都是一个元组,其中包含名称(可以选定任意字符串作为其名称(不包含双下划线))和一个估计器示例:

from sklearn.pipeline import Pipeline

from sklearn.datasets import load_breast_cancer

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)

pipe = Pipeline([("scaler", MinMaxScaler), ("svm", SVC)])

#这里我们创建了两个步骤,第一个叫做“scaler”,第二个叫做“svm”,分别是MinMaxScaler实例和SVC实例。

#现在我们可以向任何其他scikit-learn估计器一样拟合这个管道

pipe.fit(x_train, y_train)

#这里首先对第一个缩放器调用fit,然后使用该缩放器对训练数据进行变化,最后将缩放后的数据来拟合SVM。

#现在我们要在测试数据上进行评估,只需要调用pipe_score

print("Test score of pipe: {:.3f}".format(pipe.score(x_test, y_test)))

运行后其结果为:

Test score of pipe: 0.951

由上述步骤可以看出:如果对管道调用score方法,则首先使用缩放器对测试数据进行变换,然后利用缩放后的测试数据对SVM调用score方法。这个结果与我们从上节得到的结果相同(利用手动变换数据)。但是我们减少了“预处理+分类”这个过程,减少了不少的代码量。不过,使用管道的主要优点在于我们可以在cross_val_score或GridSearchCV中使用这个估计器。

在网格中使用管道:在网格中使用管道的工作原理和使用其他任何估计器相同。首先我们定义一个需要搜索的网格参数,并利用管道和参数构建一个GridSearchCV。不过在指定参数网格时存在一个细微的变化——我们需要为每个参数指定他在管道中所属的步骤,需要调节两个参数C和gamma,属于第二个步骤。我们给出这个步骤的名称是“SVM”。

为管道定义参数网格的语法是为每个参数指定步骤的名称,后面加上__(双下划綫),然后是参数的名称。因此,要想搜索SVC的C参数,必须使用“svm__C”作为参数网格的字典,对gamma也使用类似的方法。

param_grid = {'svm__C': [0.001,0.01,0.1,1,10,100], 'svm__gamma': [0.001,0.01,0.1,1,10,100]}

#有了这个参数网格,我们可以向平常一样使用GridSearchCV

grid = GridSearchCV(pipe, param_grid=param_grid, cv=5)

grid.fit(x_train, y_train)

print("Best cross validation accuracy is: {:.3f}".format(grid.best_score_))

print("Test set score of Pipe is: {:.3f}".format(grid.score(x_test, y_test)))

print("Best parameters of Pipe are : {}".format(grid.best_params_))

运行后其结果为:

Best cross validation accuracy is: 0.981

Test set score of Pipe is: 0.972

Best parameters of Pipe are : {'svm__C': 1, 'svm__gamma': 1}

与前面所作的网格搜索不同,现在对于交叉验证的每次划分来说,仅使用训练部分对MinMaxScaler进行拟合,测试部分的信息没有泄露到搜错中,下面我们对两种情况进行对比:

mglearn.plots.plot_proper_processing

使用管道在交叉验证循环内部进行预处理时的数据使用情况

在交叉验证中,信息泄露的影响大小取决于预处理步骤的性质,使用测试部分来估计数据的范围,通常不会产生大的影响,但是在特征提取和特征中使用测试部分,则会导致较大的差异。


关注“AIU人工智能”公众号,回复“白皮书”获取数据分析、大数据、人工智能行业白皮书及更多精选学习资料!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝


回帖推荐

楚天江南客 发表于2楼  查看完整内容

这是一门大学问啊!

沙发
楚天江南客 学生认证  发表于 2019-12-3 14:08:30
这是一门大学问啊!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-21 09:22