調(diào)參必備--Grid Search網(wǎng)格搜索

求關(guān)注

關(guān)注小編的公眾號(hào)淌友,一起來(lái)交流學(xué)習(xí)吧悯蝉!

什么是Grid Search 網(wǎng)格搜索?

Grid Search:一種調(diào)參手段挺峡;窮舉搜索:在所有候選的參數(shù)選擇中葵孤,通過(guò)循環(huán)遍歷,嘗試每一種可能性橱赠,表現(xiàn)最好的參數(shù)就是最終的結(jié)果尤仍。其原理就像是在數(shù)組里找最大值。(為什么叫網(wǎng)格搜索狭姨?以有兩個(gè)參數(shù)的模型為例宰啦,參數(shù)a有3種可能,參數(shù)b有4種可能饼拍,把所有可能性列出來(lái)绑莺,可以表示成一個(gè)3*4的表格,其中每個(gè)cell就是一個(gè)網(wǎng)格惕耕,循環(huán)過(guò)程就像是在每個(gè)網(wǎng)格里遍歷、搜索诫肠,所以叫g(shù)rid search)

parameters table

Simple Grid Search:簡(jiǎn)單的網(wǎng)格搜索

以2個(gè)參數(shù)的調(diào)優(yōu)過(guò)程為例:

from sklearn.datasets import load_iris
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split

iris = load_iris()
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=0)
print("Size of training set:{} size of testing set:{}".format(X_train.shape[0],X_test.shape[0]))

####   grid search start
best_score = 0
for gamma in [0.001,0.01,0.1,1,10,100]:
    for C in [0.001,0.01,0.1,1,10,100]:
        svm = SVC(gamma=gamma,C=C)#對(duì)于每種參數(shù)可能的組合司澎,進(jìn)行一次訓(xùn)練;
        svm.fit(X_train,y_train)
        score = svm.score(X_test,y_test)
        if score > best_score:#找到表現(xiàn)最好的參數(shù)
            best_score = score
            best_parameters = {'gamma':gamma,'C':C}
####   grid search end

print("Best score:{:.2f}".format(best_score))
print("Best parameters:{}".format(best_parameters))

輸出:

Size of training set:112 size of testing set:38
Best score:0.973684
Best parameters:{'gamma': 0.001, 'C': 100}

存在的問(wèn)題:

原始數(shù)據(jù)集劃分成訓(xùn)練集和測(cè)試集以后栋豫,其中測(cè)試集除了用作調(diào)整參數(shù)挤安,也用來(lái)測(cè)量模型的好壞;這樣做導(dǎo)致最終的評(píng)分結(jié)果比實(shí)際效果要好丧鸯。(因?yàn)闇y(cè)試集在調(diào)參過(guò)程中蛤铜,送到了模型里,而我們的目的是將訓(xùn)練模型應(yīng)用在unseen data上);

解決方法:

對(duì)訓(xùn)練集再進(jìn)行一次劃分围肥,分成訓(xùn)練集和驗(yàn)證集剿干,這樣劃分的結(jié)果就是:原始數(shù)據(jù)劃分為3份,分別為:訓(xùn)練集穆刻、驗(yàn)證集和測(cè)試集置尔;其中訓(xùn)練集用來(lái)模型訓(xùn)練,驗(yàn)證集用來(lái)調(diào)整參數(shù)氢伟,而測(cè)試集用來(lái)衡量模型表現(xiàn)好壞榜轿。


three parts
X_trainval,X_test,y_trainval,y_test = train_test_split(iris.data,iris.target,random_state=0)
X_train,X_val,y_train,y_val = train_test_split(X_trainval,y_trainval,random_state=1)
print("Size of training set:{} size of validation set:{} size of teseting set:{}".format(X_train.shape[0],X_val.shape[0],X_test.shape[0]))

best_score = 0.0
for gamma in [0.001,0.01,0.1,1,10,100]:
    for C in [0.001,0.01,0.1,1,10,100]:
        svm = SVC(gamma=gamma,C=C)
        svm.fit(X_train,y_train)
        score = svm.score(X_val,y_val)
        if score > best_score:
            best_score = score
            best_parameters = {'gamma':gamma,'C':C}
svm = SVC(**best_parameters) #使用最佳參數(shù),構(gòu)建新的模型
svm.fit(X_trainval,y_trainval) #使用訓(xùn)練集和驗(yàn)證集進(jìn)行訓(xùn)練朵锣,more data always results in good performance.
test_score = svm.score(X_test,y_test) # evaluation模型評(píng)估
print("Best score on validation set:{:.2f}".format(best_score))
print("Best parameters:{}".format(best_parameters))
print("Best score on test set:{:.2f}".format(test_score))

輸出:

Size of training set:84 size of validation set:28 size of teseting set:38
Best score on validation set:0.96
Best parameters:{'gamma': 0.001, 'C': 10}
Best score on test set:0.92
然而谬盐,這種間的的grid search方法,其最終的表現(xiàn)好壞與初始數(shù)據(jù)的劃分結(jié)果有很大的關(guān)系诚些,為了處理這種情況飞傀,我們采用交叉驗(yàn)證的方式來(lái)減少偶然性。

Grid Search with Cross Validation

from sklearn.model_selection import cross_val_score

best_score = 0.0
for gamma in [0.001,0.01,0.1,1,10,100]:
    for C in [0.001,0.01,0.1,1,10,100]:
        svm = SVC(gamma=gamma,C=C)
        scores = cross_val_score(svm,X_trainval,y_trainval,cv=5) #5折交叉驗(yàn)證
        score = scores.mean() #取平均數(shù)
        if score > best_score:
            best_score = score
            best_parameters = {"gamma":gamma,"C":C}
svm = SVC(**best_parameters)
svm.fit(X_trainval,y_trainval)
test_score = svm.score(X_test,y_test)
print("Best score on validation set:{:.2f}".format(best_score))
print("Best parameters:{}".format(best_parameters))
print("Score on testing set:{:.2f}".format(test_score))

輸出:

Best score on validation set:0.97
Best parameters:{'gamma': 0.01, 'C': 100}
Score on testing set:0.97

交叉驗(yàn)證經(jīng)常與網(wǎng)格搜索進(jìn)行結(jié)合泣刹,作為參數(shù)評(píng)價(jià)的一種方法助析,這種方法叫做grid search with cross validation。sklearn因此設(shè)計(jì)了一個(gè)這樣的類GridSearchCV椅您,這個(gè)類實(shí)現(xiàn)了fit外冀,predict,score等方法掀泳,被當(dāng)做了一個(gè)estimator雪隧,使用fit方法,該過(guò)程中:(1)搜索到最佳參數(shù)员舵;(2)實(shí)例化了一個(gè)最佳參數(shù)的estimator脑沿;

from sklearn.model_selection import GridSearchCV

#把要調(diào)整的參數(shù)以及其候選值 列出來(lái);
param_grid = {"gamma":[0.001,0.01,0.1,1,10,100],
             "C":[0.001,0.01,0.1,1,10,100]}
print("Parameters:{}".format(param_grid))

grid_search = GridSearchCV(SVC(),param_grid,cv=5) #實(shí)例化一個(gè)GridSearchCV類
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,random_state=10)
grid_search.fit(X_train,y_train) #訓(xùn)練马僻,找到最優(yōu)的參數(shù)庄拇,同時(shí)使用最優(yōu)的參數(shù)實(shí)例化一個(gè)新的SVC estimator。
print("Test set score:{:.2f}".format(grid_search.score(X_test,y_test)))
print("Best parameters:{}".format(grid_search.best_params_))
print("Best score on train set:{:.2f}".format(grid_search.best_score_))

輸出:

Parameters:{'gamma': [0.001, 0.01, 0.1, 1, 10, 100], 'C': [0.001, 0.01, 0.1, 1, 10, 100]}
Test set score:0.97
Best parameters:{'C': 10, 'gamma': 0.1}
Best score on train set:0.98
Grid Search 調(diào)參方法存在的共性弊端就是:耗時(shí)韭邓;參數(shù)越多措近,候選值越多,耗費(fèi)時(shí)間越長(zhǎng)女淑!所以瞭郑,一般情況下,先定一個(gè)大范圍鸭你,然后再細(xì)化屈张。
GridSearchCV參數(shù)調(diào)優(yōu)過(guò)程

總而言之擒权,言而總之

  • Grid Search:一種調(diào)優(yōu)方法,在參數(shù)列表中進(jìn)行窮舉搜索,對(duì)每種情況進(jìn)行訓(xùn)練,找到最優(yōu)的參數(shù)梯捕;由此可知,這種方法的主要缺點(diǎn)是 比較耗時(shí)纳鼎!
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裳凸,隨后出現(xiàn)的幾起案子贱鄙,更是在濱河造成了極大的恐慌,老刑警劉巖姨谷,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逗宁,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡梦湘,警方通過(guò)查閱死者的電腦和手機(jī)瞎颗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捌议,“玉大人哼拔,你說(shuō)我怎么就攤上這事“曷” “怎么了倦逐?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宫补。 經(jīng)常有香客問(wèn)我檬姥,道長(zhǎng),這世上最難降的妖魔是什么粉怕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任健民,我火速辦了婚禮,結(jié)果婚禮上贫贝,老公的妹妹穿的比我還像新娘秉犹。我一直安慰自己,他們只是感情好稚晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布凤优。 她就那樣靜靜地躺著,像睡著了一般蜈彼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俺驶,一...
    開(kāi)封第一講書(shū)人閱讀 49,749評(píng)論 1 289
  • 那天幸逆,我揣著相機(jī)與錄音棍辕,去河邊找鬼。 笑死还绘,一個(gè)胖子當(dāng)著我的面吹牛楚昭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拍顷,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼抚太,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了昔案?” 一聲冷哼從身側(cè)響起尿贫,我...
    開(kāi)封第一講書(shū)人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踏揣,沒(méi)想到半個(gè)月后庆亡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捞稿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年又谋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娱局。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡彰亥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出衰齐,到底是詐尸還是另有隱情任斋,我是刑警寧澤,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布娇斩,位于F島的核電站仁卷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏犬第。R本人自食惡果不足惜锦积,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望歉嗓。 院中可真熱鬧丰介,春花似錦、人聲如沸鉴分。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)志珍。三九已至橙垢,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伦糯,已是汗流浹背柜某。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工嗽元, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人喂击。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓剂癌,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親翰绊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子佩谷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容