GridSearchCV()和RandomizedSearchCV()參數(shù)搜索

一、具體例子見(jupyter notebook):

E:\cgx硬盤\★Python and AI\(cgx★★)scikit learn 學(xué)習(xí)筆記\sklearn_cgx\GridSearchCV和RandomizedSearchCV參數(shù)搜索\GridSearchCV_and_RandomizedSearchCV.ipynb

二、使用方法簡(jiǎn)介

sklearn中主要提供了兩種搜索模型超參數(shù)的方法:

  • 網(wǎng)格搜索GridSearchCV:窮舉所有參數(shù)組合,能確保找到的是最佳參數(shù)組合,但速度慢;
  • 隨機(jī)搜索RandomizedSearchCV:隨機(jī)采樣參數(shù)組合,速度快,但可能找不到的不是最優(yōu)參數(shù)組合。

可以在搜索最佳參數(shù)的同時(shí)自動(dòng)訓(xùn)練得到最佳模型,也可以在得到最佳參數(shù)后自己重新訓(xùn)練最佳模型!

本文以GridSearchCV為例進(jìn)行說(shuō)明(隨機(jī)搜索類似)

(1)GridSearchCV() 主要輸入?yún)?shù):

參數(shù) 描述
estimator 要搜索超參數(shù)的分類器對(duì)象(例如SVC()),并且可以指定傳入除需要確定最佳參數(shù)之外的其他參數(shù)。每一個(gè)分類器都需要一個(gè)scoring參數(shù),或者score方法;
param_grid 待搜索的參數(shù)組合,字典或字典list類型(之所以可以用‘字典list’,其意義在于可以對(duì)同一個(gè)(或一組)參數(shù)多次設(shè)置搜索范圍,見后面例子)。(注意:字典的key必須和estimator里的參數(shù)名字相同,比如estimator用的是svc,要搜索svc的參數(shù)gamma,那么param_grid里的key就必須用gamma;如果用了管道(pipeline),管道里用戶給svc取的名稱是’svc_cgx’,那么param_grid里的key就應(yīng)該是:svc_cgx__gamma,注意用“__(兩個(gè))”來(lái)分隔。)
n_jobs 搜索時(shí)的并發(fā)數(shù)(內(nèi)核使用數(shù))。=1 只用1個(gè)cpu(默認(rèn));=2 用2個(gè)cpu;=-1 用所有cpu。
refit 默認(rèn)為True,在搜索參數(shù)結(jié)束后,用最佳參數(shù)結(jié)果再次fit一遍全部數(shù)據(jù)集,得到最佳參數(shù)與最佳模型。(這樣用戶就可以直接用.predict(X_new)進(jìn)行預(yù)測(cè)了,不需要再根據(jù)搜索到的最佳參數(shù)重新訓(xùn)練一遍模型
cv 交叉驗(yàn)證折數(shù),比如cv=5,則搜索的時(shí)候每個(gè)參數(shù)組合的模型性能是由5折交叉驗(yàn)證算出來(lái)的均值。
scoring 搜索時(shí)模型性能的評(píng)價(jià)準(zhǔn)則,默認(rèn)為None,None則使用estimator的默認(rèn)評(píng)價(jià)準(zhǔn)備。也可以自己設(shè)置,比如scoring=‘roc_auc’。
verbose 日志冗長(zhǎng)度,int:冗長(zhǎng)度,0:不輸出訓(xùn)練過(guò)程,1:偶爾輸出,>1:對(duì)每個(gè)子模型都輸出。

用一個(gè)例子來(lái)說(shuō)明param_grid這個(gè)參數(shù)為什么可以是:字典或字典list?

# #我們選擇 svm.SVC()算法作為估計(jì)器,該算法其中有4個(gè)輸入?yún)?shù):kernel、C 、degree和 gamma
my_estimator = svm.SVC(probability=True)

# 下面是構(gòu)建待搜索參數(shù)my_param_grid,其結(jié)構(gòu)是一個(gè)“字典”或“字典list”:其中字典的key為真實(shí)的參數(shù)名稱,value是該參數(shù)的待搜索范圍。
my_param_grid = {'kernel':['linear','poly','rbf'], 'C':[1,10,100,1000], 'degree':[2,3], 'gamma':[1,0.1, 0.01, 0.001]}  # dict
my_param_grid = [{'kernel':['linear'], 'C':[1,10,100,1000]},
                 {'kernel':['poly'], 'C':[1,10],'degree':[2,3]},
                 {'kernel':['rbf'], 'C':[1,10,100,1000], 'gamma':[1,0.1, 0.01, 0.001]}]  # dict list
# 定義網(wǎng)格搜索對(duì)象
grid = GridSearchCV(estimator=my_estimator, 
                    param_grid=my_param_grid, 
                    refit=True, 
                    cv=10, 
                    n_jobs=-1, 
                    scoring='accuracy') 
# 開始網(wǎng)格搜索
grid.fit(X, y)

上例中,待搜索參數(shù)的估計(jì)器是svm.SVC(),該估計(jì)器其中有4個(gè)參數(shù)是kernel、C 、degree和 gamma,我們準(zhǔn)備搜索這四個(gè)參數(shù)的最佳值,最佳值。
我們?cè)诙xmy_param_grid時(shí),用了兩種方法:
(1)第一種是一個(gè)dict,其中kernel有['linear','poly','rbf'] 3個(gè)選擇,C有[1,10,100,1000] 4個(gè)選擇,degree有[2,3] 2個(gè)選擇,gamma有[1,0.1, 0.01, 0.001] 4個(gè)選擇。因此總共有:3×4×2×4=96種情況,共耗時(shí)4.92s。
(2)第二種是一個(gè)dict的list,與第一種不同的是,內(nèi)含有3個(gè)dict,其中每個(gè)dict可以分別對(duì)不同的參數(shù)進(jìn)行搜索范圍選擇。因此總共有:1×4+1×2×2+1×4×4=24種情況,共耗時(shí)0.286s。
由此可見,第二種方法更靈活,效率更高,推薦使用!

(2)GridSearchCV() 主要輸出屬性:

屬性 描述
.best_score_ 最佳模型.best_estimator的平均交叉驗(yàn)證分?jǐn)?shù);
.best_params_ 返回dict,包含了.best_estimator的最佳參數(shù);
.best_estimator_ 在獲取的最佳參數(shù).best_params_基礎(chǔ)上重新訓(xùn)練的最佳模型,其前提是:輸入?yún)?shù)refit = True;
.n_splits int,交叉驗(yàn)證拆分的數(shù)量(折疊/迭代);
.cv_results_ 保存每次搜索的詳細(xì)信息,通常與pandas一起利用表格形式輸出:pd.DataFrame.from_dict(my_grid.cv_results_)

(3)GridSearchCV() 主要輸出方法:

方法 描述
. fit(X, y) 根據(jù)訓(xùn)練數(shù)據(jù)對(duì)目標(biāo)參數(shù)進(jìn)行網(wǎng)格搜索
.predict(X_new) 直接利用最佳參數(shù)訓(xùn)練好的模型對(duì)新樣本進(jìn)行預(yù)測(cè),其前提是:輸入?yún)?shù)refit = True;
.score(X_test, y_test) 測(cè)試數(shù)據(jù)在最佳模型上的分?jǐn)?shù),其前提是:輸入?yún)?shù)refit = True;
.get_params(deep=True/False) 返回dict,包含了詳細(xì)的網(wǎng)格搜索參數(shù)。

三、高階使用方法

Pipline的結(jié)合使用,見:
http://www.itdecent.cn/writer#/notebooks/52233537/notes/117135513

四、其他

我在看其他博客的時(shí)候,別人有提到說(shuō):“網(wǎng)格搜索這個(gè)方法適合于小數(shù)據(jù)集,一旦數(shù)據(jù)的量級(jí)上去了,就很難得出結(jié)果。這個(gè)時(shí)候可以使用一個(gè)快速調(diào)優(yōu)的方法——坐標(biāo)下降:拿當(dāng)前對(duì)模型影響最大的參數(shù)調(diào)優(yōu),直到最優(yōu)化;再拿下一個(gè)影響最大的參數(shù)調(diào)優(yōu),如此下去,直到所有的參數(shù)調(diào)整完畢。這個(gè)方法的缺點(diǎn)就是可能會(huì)調(diào)到局部最優(yōu)而不是全局最優(yōu),但是省時(shí)間省力。

如果沒(méi)有太多的超參數(shù)需要調(diào)優(yōu),并且 pipeline 運(yùn)行時(shí)間不長(zhǎng),請(qǐng)使用 GridSearchCV;
對(duì)于較大的搜索空間和訓(xùn)練緩慢的模型,請(qǐng)使用 HalvingGridSearchCV;
對(duì)于非常大的搜索空間和訓(xùn)練緩慢的模型,請(qǐng)使用 HalvingRandomSearchCV。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容