GridSearchCV() 与 Pipline相结合

GridSearchCV()或RandomizedSearchCV()方法的初级用法见:
//www.greatytc.com/writer#/notebooks/52233537/notes/117238898

Pipeline对象的使用方法见:
//www.greatytc.com/writer#/notebooks/52233537/notes/117140178

具体例子见(jupyter notebook):

E:\cgx硬盘\★Python and AI\(cgx★★)scikit learn 学习笔记\sklearn_cgx\GridSearchCV和RandomizedSearchCV参数搜索\GridSearchCV_and_Pipeline.ipynb

Cas1: Pipeline的每个计算步骤只搜索一种方法的一种或多种参数;

这种情况很简单直观,在Pipeline中清晰定义了每一个计算步骤,然后在my_param_grid 中明确定义这几个计算步骤需要被搜索的参数、范围、轮数。

如下示例,Pipeline中明确定义了第1计算步骤 reduce_dim(自定义的字符串)用PCA()方法,第2计算步骤 classify(自定义的字符串)用LinearSVC()方法。

然后在my_param_grid1 中清晰指出了要搜索的参数是reduce_dim__n_components和classify__C,他们分别表示了PCA()的n_components参数和LinearSVC()的C参数。
my_param_grid2 与 my_param_grid1本质完全相同,只是多设置了一轮新的搜索。

# 定义Pipeline对象(这里每个计算步骤都是我们实际要搜索的方法,PCA()和LinearSVC())
pipe = Pipeline([('reduce_dim', PCA(iterated_power=7)),
                 ('classify', LinearSVC(dual=False, max_iter=10000))])

# # 针对Pipeline对象的每个计算步骤,设置参数搜索范围
 my_param_grid1 = {'reduce_dim__n_components': [2, 4, 8],
                  'classify__C': [1, 10, 100, 1000]}  # dict (单轮搜索)

my_param_grid2 = [{'reduce_dim__n_components': [2, 4, 8],
                  'classify__C': [1, 10, 100, 1000]},
                 {'reduce_dim__n_components': [13, 20, 26],
                  'reduce_dim__n_oversamples': [5, 10],
                  'classify__C': [50, 100]}]  # dict list (多轮搜索)

Cas2: Pipeline的每个计算步骤搜索多种方法的一种或多种参数;

与Cas1不同,Cas2在Pipeline对应的每个步骤可以搜索多种方法,此时在Pipeline中定义的计算步骤只相当于做了一个占位符,而在my_param_grid 中为每个计算步骤设置了多种方法选择,以及对应的需要被搜索的参数、范围、轮数。

如下示例,Pipeline中的第1计算步骤 reduce_dim 可以是'passthrough' 或 PCA(iterated_power=7) 或 [PCA(iterated_power=7), NMF()]...,前面说了,可以直接将其视为为占位符;第2计算步骤 classify 用LinearSVC()方法,当然这里也可以用多个方法组成的list(但因为他是最后的估计器,因此不能用'passthrough',否则报错)。

然后在my_param_grid1 中清晰指出了:
对于reduce_dim步骤,真正要搜索的方法是[PCA(iterated_power=10), NMF(), FastICA()]三种,且针对这三种方法要搜索参数是'n_components(reduce_dim__n_components)'(需要注意的是,待搜索参数,必须是这些方法都有的参数,否则会报错)。
my_param_grid2 与 my_param_grid1本质完全相同,只是针对reduce_dim步骤还要搜索SelectKBest(chi2)方法的k参数,因为这个参数是PCA()和NMF()所没有的,因此要单独拿出来搜索。同时针对classify步骤,要搜索[SVC(), LinearSVC()]两种方法的C参数。

# 定义Pipeline对象(这里每个计算步骤无论是:'passthrough'、PCA(iterated_power=7)还是[PCA(iterated_power=7), NMF()],都是占个位置而已)
pipe = Pipeline([('reduce_dim', 'passthrough' 或 PCA(iterated_power=7) 或 [PCA(iterated_power=7), NMF()]),
                 ('classify',  LinearSVC(dual=False, max_iter=10000))])

# 针对Pipeline对象的每个计算步骤,真正设置搜索方法和对应搜索参数、范围、轮数。
my_param_grid1 = {'reduce_dim': [PCA(iterated_power=10), NMF(), FastICA()],
                 'reduce_dim__n_components': [2, 4, 8],
                 'classify__C': [1, 10, 100, 1000]}  # dict

my_param_grid = [{'reduce_dim': [PCA(iterated_power=10), NMF(), FastICA()],
                  'reduce_dim__n_components': [2, 4, 8],
                  'classify__C': [1, 10, 100, 1000]},
                 {'reduce_dim': [SelectKBest(chi2)],
                  'reduce_dim__k': [2, 4, 8],
                  'classify': [SVC(), LinearSVC()],
                  'classify__C': [1, 10, 100, 1000]}]

注意

my_param_grid 中所有的dict的'key'的定义,由三部分组成,以‘reduce_dim__n_components’为例说明:
(1)第一部分,pipe对象中的‘key’:reduce_dim
(2)第二部分,两个短下划线:__
(3)第三部分,reduce_dim对应的方法(这里是PCA)的输入参数名称:n_components

如果没有太多的超参数需要调优,并且 pipeline 运行时间不长,请使用 GridSearchCV;
对于较大的搜索空间和训练缓慢的模型,请使用 HalvingGridSearchCV;
对于非常大的搜索空间和训练缓慢的模型,请使用 HalvingRandomSearchCV。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容