一、具體例子見(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。