日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

sklearn快速入门教程:(四)模型自动调参

發(fā)布時(shí)間:2025/4/16 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sklearn快速入门教程:(四)模型自动调参 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

上個(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ù)即可:

參數(shù)名稱說(shuō)明
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í)
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的sklearn快速入门教程:(四)模型自动调参的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。