機器學習 模型超引數調優之網格搜尋與隨機搜尋

2021-10-22 09:09:29 字數 3998 閱讀 8242

不同的超引數的值對於模型的效能有不同的影響,我們需要找到的就是使得模型效能最佳的超引數。

網格搜尋的思想非常簡單,比如你有2個超引數需要去選擇,那你就把所有的超引數選擇列出來分別做排列組合。舉個例子: ?=0.01,0.1,1.0 和 ?=0.01,0.1,1.0 ,你可以做乙個排列組合,即: ,然後針對每組超引數分別建立乙個模型,然後選擇測試誤差最小的那組超引數。換句話說,我們需要從超引數空間中尋找最優的超引數,很像乙個網格中找到乙個最優的節點,因此叫網格搜尋

import numpy as np

from sklearn.svm import svr # 引入svr類

from sklearn.pipeline import make_pipeline # 引入管道簡化學習流程

from sklearn.preprocessing import standardscaler # 由於svr基於距離計算,引入對資料進行標準化的類

from sklearn.model_selection import gridsearchcv # 引入網格搜尋調優

from sklearn.model_selection import cross_val_score # 引入k折交叉驗證

from sklearn import datasets

boston = datasets.load_boston(

)# 返回乙個類似於字典的類

x = boston.data

y = boston.target

features = boston.feature_names

pipe_svr = make_pipeline(standardscaler(),

svr())

score1 = cross_val_score(estimator=pipe_svr,

x=x,

y=y,

scoring=

'r2'

, cv=10)

# 10折交叉驗證

print

("cv accuracy: %.3f +/- %.3f"%(

(np.mean(score1)

), np.std(score1)

))

from sklearn.svm import svr  # 引入svr類

from sklearn.pipeline import make_pipeline, pipeline # 引入管道簡化學習流程

from sklearn.preprocessing import standardscaler # 由於svr基於距離計算,引入對資料進行標準化的類

from sklearn.model_selection import gridsearchcv # 引入網格搜尋調優

from sklearn.model_selection import cross_val_score # 引入k折交叉驗證

from sklearn import datasets

boston = datasets.load_boston(

)# 返回乙個類似於字典的類

x = boston.data

y = boston.target

features = boston.feature_names

pipe_svr = pipeline([(

"standardscaler"

, standardscaler())

,("svr"

, svr())

])param_range =

[0.0001

,0.001

,0.01

,0.1

,1.0

,10.0

,100.0

,1000.0

]# 管道與網格搜尋結合

param_grid =[,

# 注意__是指兩個下劃線,乙個下劃線會報錯的

]gs = gridsearchcv(estimator=pipe_svr,

param_grid=param_grid,

scoring=

'r2'

, cv=10)

# 10折交叉驗證

gs = gs.fit(x, y)

print

("網格搜尋最優得分:"

, gs.best_score_)

print

("網格搜尋最優引數組合:\n"

, gs.best_params_)

網格搜尋最優得分: 0.6081303070817127

網格搜尋最優引數組合:

網格搜尋相當於暴力地從引數空間中每個都嘗試一遍,然後選擇最優的那組引數,這樣的方法顯然是不夠高效的,因為隨著引數類別個數的增加,需要嘗試的次數呈指數級增長。有沒有一種更加高效的調優方式呢?那就是使用隨機搜尋的方式,這種方式不僅僅高校,而且實驗證明,隨機搜尋法結果比稀疏化網格法稍好(有時候也會極差,需要權衡)。引數的隨機搜尋中的每個引數都是從可能的引數值的分布中取樣的。與網格搜尋相比,這有兩個主要優點:

from sklearn.svm import svr  # 引入svr類

from sklearn.pipeline import make_pipeline, pipeline # 引入管道簡化學習流程

from sklearn.preprocessing import standardscaler # 由於svr基於距離計算,引入對資料進行標準化的類

from sklearn import datasets

from sklearn.model_selection import randomizedsearchcv

from scipy.stats import uniform # 引入均勻分布設定引數

boston = datasets.load_boston(

)# 返回乙個類似於字典的類

x = boston.data

y = boston.target

features = boston.feature_names

pipe_svr = pipeline([(

"standardscaler"

, standardscaler())

,("svr"

, svr())

])# 利用引數loc和scale,可以得到[loc, loc + scale]上的均勻分布,在uniform中loc是最小值,scale是最大值。

distributions =

dict

(svr__c=uniform(loc=

1.0, scale=4)

,# 構建連續引數的分布

svr__kernel=

["linear"

,"rbf"],

# 離散引數的集合

svr__gamma=uniform(loc=

0, scale=4)

)rs = randomizedsearchcv(estimator=pipe_svr,

param_distributions=distributions,

scoring=

'r2'

, cv=10)

# 10折交叉驗證

rs = rs.fit(x, y)

print

("隨機搜尋最優得分:"

, rs.best_score_)

print

("隨機搜尋最優引數組合:\n"

, rs.best_params_)

隨機搜尋最優得分: 0.2988221516140073

隨機搜尋最優引數組合:

資料量小使用網格搜尋,當時間代價比較大時,可以多次使用隨機搜尋。

參考:機器學習基礎

模型評估之超引數調優

百面機器學習 通過查詢搜尋範圍內的所有的點來確定最優值。這種搜尋方案十分消耗計算資源和時間。在實際應用中,一般先使用較廣的搜尋範圍和較大的步長,來尋找全域性最優值可能的位置 然後會逐漸縮小搜尋範圍和步長,來尋找更精確的最優值。但由於目標函式一般都是非凸的,所以很可能會錯過全域性最優值。與網格搜尋類似...

機器學習之模型選擇與調優

交叉驗證 將拿到的訓練資料,分為訓練和驗證集。以下圖為例 將資料分成5份,其中乙份作為驗證集。然後經過5次 組 的測試,每次都更換不同的驗證集。即得到5組模型的結果,取平均值作為最終結果。又稱5折交叉驗證。五折交叉驗證,就是分成5份,三份訓練,乙份驗證,乙份測試 我們之前知道資料分為訓練集和測試集,...

機器學習 模型選擇與調優交叉驗證和網格搜尋

1 交叉驗證cross validation 為了讓被評估的模型更加準確可信 將訓練資料分為訓練集和驗證集,分幾等份就是幾折驗證 2 網格搜尋grid search 超引數 很多引數需要手動指定 每組超引數都採用交叉驗證來進行評估 from sklearn.neighbors import knei...