sklearn快速入门教程:(四)模型自动调参
上個(gè)教程中我們已經(jīng)看到在sklearn中調(diào)用機(jī)器學(xué)習(xí)模型其實(shí)非常簡(jiǎn)單。但要獲得較好的預(yù)測(cè)效果則需要選取合適的超參數(shù)。在實(shí)際的項(xiàng)目中其實(shí)也有不少參數(shù)是由工程師借助其經(jīng)驗(yàn)手動(dòng)調(diào)整的,但在許多場(chǎng)景下這種方式仍然是很難行得通的。sklearn提供了十分簡(jiǎn)單易用的調(diào)參方法,可以輕松地實(shí)現(xiàn)對(duì)各類模型的調(diào)參。但調(diào)參的機(jī)制中涉及的概念相對(duì)較多,因此本文需要羅列一些必要的原理。
一、 調(diào)參的基本思想–交叉驗(yàn)證(Cross Validation)
根據(jù)上篇教程的內(nèi)容我們?nèi)菀紫氲?#xff0c;調(diào)參的根本目的實(shí)際上就是要找到一組合適的超參數(shù),使得模型具有列好的效果,而更專業(yè)的說(shuō)法則是希望讓模型得到更好的泛化性能(可以簡(jiǎn)單理解為樣本外的預(yù)測(cè)效果)。目前使用最為廣泛的調(diào)參方法之一便是交叉驗(yàn)證,它的思路非常簡(jiǎn)單:
- 將樣本拆分為 kkk 個(gè)子集,用其中 k?1k-1k?1個(gè)子集的數(shù)據(jù)訓(xùn)練模型,再在剩下的一個(gè)子集上驗(yàn)證模型的性能。當(dāng)所有子集都被作為測(cè)試集輪完一圈之后,計(jì)算模型在所有子集上的平均性能。
- 對(duì)每一組超參數(shù)對(duì)應(yīng)模型執(zhí)行上述操作,選出平均性能最好的一組參數(shù)作為最優(yōu)參數(shù)。
sklearn官方文檔中給出了這樣一張圖很清楚地描述了這個(gè)過(guò)程(k-fold cross validation)。
至于為何要這樣做,其理論相對(duì)較深,建議初學(xué)時(shí)不要太過(guò)于糾結(jié),先用會(huì)即可(因?yàn)樯婕拜^深的統(tǒng)計(jì)學(xué)知識(shí))。其根本目的即是尋找出一組最優(yōu)超參數(shù),使其在各種樣本組合下的平均性能都能達(dá)到最優(yōu),從而認(rèn)為這組參數(shù)能夠使得模型具有最強(qiáng)的泛化性能。
二、 實(shí)現(xiàn)交叉驗(yàn)證需要考慮哪些細(xì)節(jié)
上述描述其實(shí)已經(jīng)給出了k?k-k?折交叉驗(yàn)證的基本實(shí)現(xiàn)思路,但這里還有兩個(gè)細(xì)節(jié)的問(wèn)題沒(méi)有討論:
- 子集應(yīng)該如何劃分?
- 備選的參數(shù)組合應(yīng)該如何生成?
- 評(píng)價(jià)模型性能的指標(biāo)選什么?
實(shí)際上這兩個(gè)問(wèn)題非常復(fù)雜,子集劃分可以有許多種方式:
- k-fold: 隨機(jī)將訓(xùn)練集劃分為kkk個(gè)
- leave-one-out: 將子集劃分為nnn 個(gè),即每個(gè)子集只有一個(gè)樣本
- hold-out: 將nnn個(gè)樣本中的mmm個(gè)隨機(jī)挑出作為測(cè)試集(當(dāng)然也可以指定測(cè)試集)
備選參數(shù)的選擇也有多種方式:
- grid-search: 即給出每個(gè)超參數(shù)的備選范圍,對(duì)所有組合進(jìn)行窮舉
- random search: 以某種方式生成多種超參數(shù)的組合,窮舉所有隨機(jī)生成的結(jié)果
至于模型的評(píng)價(jià)指標(biāo),也是層出不窮:
- 分類問(wèn)題:分類精度、平衡精度、平均精度等
- 回歸問(wèn)題:最大誤差、均方誤差、均方根誤差等
這些選擇,通常也只能根據(jù)具體問(wèn)題結(jié)合經(jīng)驗(yàn)進(jìn)行選擇。(這的確也是一件很麻煩的事情 )。
三、 sklearn中的實(shí)現(xiàn)方式(以GridSearchCV和SVR為例)
GridSearchCV即網(wǎng)格搜索的交叉驗(yàn)證法,這是最為常用的方法之一。在sklearn的官方文檔中給出了該方法詳細(xì)的輸入?yún)?shù)和說(shuō)明,而通常我們只需要考慮以下幾個(gè)參數(shù)即可:
| estimator | 被調(diào)參的模型,即上一教程中提到的各類模型的class,比如tree,RandomForestRegressor等具體模型,以對(duì)象實(shí)例的形式傳遞。 |
| param_grid | 被調(diào)參數(shù)的grid,以字典形式傳遞。 |
| scoring | 模型評(píng)價(jià)指標(biāo),給出具體指標(biāo)的名稱字符串即可,如'accuracy','neg_mean_squared_error'等。 |
| cv | 這個(gè)變量比較復(fù)雜。一般來(lái)說(shuō)我們直接取整數(shù)即可,也就是k-fold中的k即可。特別地當(dāng)k等于樣本個(gè)數(shù)時(shí),它就是留一法。 |
為方便起見(jiàn)我們先用官方給出的示例代碼做一些說(shuō)明:
>>> from sklearn import svm, datasets >>> from sklearn.model_selection import GridSearchCV >>> iris = datasets.load_iris() >>> parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]} >>> svc = svm.SVC() >>> clf = GridSearchCV(svc, parameters) >>> clf.fit(iris.data, iris.target) GridSearchCV(estimator=SVC(),param_grid={'C': [1, 10], 'kernel': ('linear', 'rbf')}) >>> sorted(clf.cv_results_.keys()) ['mean_fit_time', 'mean_score_time', 'mean_test_score',...'param_C', 'param_kernel', 'params',...'rank_test_score', 'split0_test_score',...'split2_test_score', ...'std_fit_time', 'std_score_time', 'std_test_score']這里面需要特別說(shuō)明有幾個(gè)問(wèn)題:
(1)參數(shù)網(wǎng)格的設(shè)定(第4行)
變量parameters即是param_grid的值。可以看到它是以==字典(dict)==的形式給出的。一般在寫程序的時(shí)候如果參數(shù)較多,我們其實(shí)更喜歡看這樣的寫法:
parameters = {'kernel':('linear', 'rbf'), 'C':[1, 10]}這里就需要回顧一下python的基本數(shù)據(jù)結(jié)構(gòu)。字典類型的本質(zhì)其實(shí)就是典型的key-value結(jié)構(gòu)。在花括號(hào)中每一個(gè)逗號(hào)分隔的就是字典的一條記錄,這條記錄中冒號(hào)左邊是key的名稱,用單引號(hào),冒號(hào)右邊則是value。注意這里非常非常舒服的一點(diǎn)是這個(gè)value可以是任意的合法類型。那么這樣一來(lái),我們只需要考慮每個(gè)參數(shù)的取值范圍即可,非常方便。
在設(shè)好了這樣的GridSearchCV中我們只需要將這樣的一個(gè)字典傳入,函數(shù)將自動(dòng)根據(jù)設(shè)定的范圍對(duì)每種組合進(jìn)行窮舉。比如上面這段代碼實(shí)際上給出的是這樣的一種組合:
kernel = 'linear', C = 1 kernel = 'linear', C = 10 kernel = 'rbf', C = 1 kernel = 'rbf', C = 10試想如果我們有非常多的超參數(shù)需要調(diào)(比如隨機(jī)森林就有非常多的超參數(shù)),如果自己動(dòng)手寫循環(huán)那么一個(gè)參數(shù)就是一個(gè)循環(huán),非常麻煩。而sklearn則給我們提供了一種非常簡(jiǎn)單的實(shí)現(xiàn)方式。
(2)返回類型
GridSearchCV從最后一行代碼中可以看到,返回值的類型其實(shí)很復(fù)雜,內(nèi)容特別多。而這里我們首先關(guān)注的就是兩個(gè)東西:
- 最優(yōu)參數(shù) best_params_:它是以字典的形式存儲(chǔ),比如上述代碼運(yùn)行完成后,可以直接通過(guò)clf.best_params_來(lái)查看具體的最優(yōu)參數(shù),并且保留了原參數(shù)名。
- **最優(yōu)模型 **best_estimator_ : best_estimator_就是在整個(gè)過(guò)程中表現(xiàn)最好的那一個(gè)模型(平均性能最優(yōu))。它的本質(zhì)就是sklearn中的estimator,再說(shuō)得直接一點(diǎn),如果被調(diào)的模型是SVR,那么它就是SVR;如果被調(diào)的是tree那么它就是tree。根據(jù)我們前面所講,如果想要用它來(lái)進(jìn)行預(yù)測(cè),則直接對(duì)它進(jìn)行操作即可,即調(diào)用clf.best_estimator.predict(X)。
上述兩個(gè)參數(shù)是與我們最直接關(guān)心的,當(dāng)然還有更多的詳細(xì)參數(shù),這些內(nèi)容在具體問(wèn)題中對(duì)應(yīng)讀取查看就可以了。
另外,我們之前提到過(guò)除了GridSearchCV之外還有另外的隨機(jī)調(diào)參方法,它叫做RandomizedSearchCV,而這里隨了對(duì)隨機(jī)方法的指定以外,基本用法和其它參數(shù)的設(shè)定也幾乎一模一樣。
四、 其它問(wèn)題
(1)并行計(jì)算
并行計(jì)算是sklearn中的另一個(gè)亮點(diǎn),它對(duì)一些能夠并行的方法提前進(jìn)行了封裝,在使用的時(shí)候只需要簡(jiǎn)單一個(gè)參數(shù)即可。在GridSearchCV中,只需要在輸入?yún)?shù)中設(shè)定n_jobs大于等于2即可,這個(gè)參數(shù)即是代表需要用來(lái)并行的核心數(shù)量。比如:
# 使用兩個(gè)核心并行 clf = GridSearchCV(svc, parameters, n_jobs =2) # 使用全部的核心并行 clf = GridSearchCV(svc, parameters, n_jobs =-1)另外特別要注意的一點(diǎn)是,sklearn的并行沒(méi)有任何對(duì)硬件的保護(hù)機(jī)制。簡(jiǎn)單地說(shuō)就是它會(huì)盡一切可能壓榨CPU的效率,在能超頻的時(shí)候它一點(diǎn)也不會(huì)客氣。這在用大量級(jí)的數(shù)據(jù)集,網(wǎng)格較密和核心較多的時(shí)候要特別小心。因?yàn)槌l的代價(jià)就是CPU的溫度會(huì)瞬間飆升,至于會(huì)不會(huì)引起硬件的其它問(wèn)題目前還沒(méi)遇到,但一定要慎用。
(2)自定義調(diào)參
從常理上講,sklearn本身是開源的,源碼實(shí)際上可以進(jìn)行修改。不過(guò)sklearn本身也提供了一些方便的接口供用戶進(jìn)行自定義。比如上面提到的評(píng)價(jià)指標(biāo),sklearn就提供了詳細(xì)的文檔供開發(fā)者參考。比如:
自定義指標(biāo):https://scikit-learn.org/stable/modules/model_evaluation.html#scoring
使用多指標(biāo):https://scikit-learn.org/stable/modules/grid_search.html#multimetric-grid-search
當(dāng)然,集合的劃分等問(wèn)題也可以自定義,可以參考:
CV Splitter: https://scikit-learn.org/stable/glossary.html#term-cv-splitter
五、小結(jié)
那么到這里,從如何調(diào)用sklearn的基本庫(kù)到如何進(jìn)行自動(dòng)調(diào)參就全部講解完畢。學(xué)到這一步相信許多同學(xué)已經(jīng)可能在標(biāo)準(zhǔn)數(shù)據(jù)集和一些自己的數(shù)據(jù)集上調(diào)出較好的模型了。更多的內(nèi)容待后續(xù)繼續(xù)講解。
- sklearn快速入門教程:(一)準(zhǔn)備工作
- klearn快速入門教程:(二)線性回歸
- sklearn快速入門教程:(三)機(jī)器學(xué)習(xí)的通用模式及實(shí)現(xiàn)方法
- sklearn快速入門教程:(五)集成學(xué)習(xí)
總結(jié)
以上是生活随笔為你收集整理的sklearn快速入门教程:(四)模型自动调参的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: sklearn快速入门教程:(三)机器学
- 下一篇: sklearn快速入门教程:(五)集成学