不同的超引數的值對於模型的效能有不同的影響,我們需要找到的就是使得模型效能最佳的超引數。
網格搜尋的思想非常簡單,比如你有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...