對於模型調參,第一步是要找準目標:我們要做什麼?一般來說,這個目標是提公升某個模型評估指標,比如對於隨機森林來說,我們想要提公升的是模型在未知資料上的準確率(由score或oob_score_來衡量)。找準了這個目標,我們就需要思考:模型在未知資料上的準確率受什麼因素影響?在機器學習中,我們用來衡量模型在未知資料上的準確率的指標,叫泛化誤差
當模型在未知資料(測試集或者袋外資料)上表現糟糕時,我們說模型的泛化程度不夠,泛化誤差大,模型的效果不好。泛化誤差受到模型的結構(複雜度)影響。看下面這張圖,它準確地描繪了泛化誤差與模型複雜度的關係,當模型太複雜,模型就會過擬合,泛化能力就不夠,所以泛化誤差大。當模型太簡單,模型就會欠擬合,擬合能力不夠,所以誤差也會大。只有當複雜度剛剛好時才能達到我們的泛化誤差最小的目標。
對於隨機森林而言:
1)模型太複雜或者太簡單,都會讓泛化誤差高,我們追求的是位於中間的平衡點
2)模型太複雜就會過擬合,模型太簡單就會欠擬合
3)對樹模型和樹的整合模型來說,樹的深度越深,枝葉越多,模型越複雜
4)樹模型和樹的整合模型的目標,都是減少模型複雜度,把模型往影象的左邊移動
乙個整合模型(f)在未知資料集(d)上的泛化誤差e(f;d),由方差(var),偏差(bais)和雜訊(ε)共同決定。
偏差:模型的**值與真實值之間的差異,即每乙個紅點到藍線的距離。在整合演算法中,每個基評估器都會有自己的偏差,整合評估器的偏差是所有基評估器偏差的均值。模型越精確,偏差越低。
方差:反映的是模型每一次輸出結果與模型**值的平均水平之間的誤差,即每乙個紅點到紅色虛線的距離,衡量模型的穩定性。模型越穩定,方差越低。
其中偏差衡量模型是否**得準確,偏差越小,模型越「準」;而方差衡量模型每次**的結果是否接近,即是說方差越小,模型越「穩」;雜訊是機器學習無法干涉的部分,當偏差和方差都很低的時候,模型的泛化誤差就小,在未知資料上的準確性就很高。
我們可以使用網格搜尋,我們將使用網格搜尋對引數乙個個進行調整
gridsearchcv網格搜尋
gridsearchcv的名字其實可以拆分為兩部分,gridsearch和cv,即網格搜尋和交叉驗證。這兩個名字都非常好理解。網格搜尋,搜尋的是引數,即在指定的引數範圍內,按步長依次調整引數,利用調整的引數訓練學習器,從所有的引數中找到在驗證集上精度最高的引數,這其實是乙個訓練和比較的過程。 gridsearchcv可以保證在指定的引數範圍內找到精度最高的引數,但是這也是網格搜尋的缺陷所在,他要求遍歷所有可能引數的組合,在面對大資料集和多引數的情況下,非常耗時。
grid search:一種調參手段;窮舉搜尋:在所有候選的引數選擇中,通過迴圈遍歷,嘗試每一種可能性,表現最好的引數就是最終的結果。其原理就像是在陣列裡找到最大值。這種方法的主要缺點是比較耗時!
所以網格搜尋適用於三四個(或者更少)的超引數(當超引數的數量增長時,網格搜尋的計算複雜度會呈現指數增長,這時候則使用隨機搜尋),使用者列出乙個較小的超引數值域,這些超引數至於的笛卡爾積(排列組合)為一組組超引數。網格搜尋演算法使用每組超引數訓練模型並挑選驗證集誤差最小的超引數組合。
from sklearn.model_selection import gridsearchcv
param_grid =[,
,] forest_reg=randomforestregressor(
)grid_search = gridsearchcv(forest_reg, param_grid, cv=
5, scoring=
'neg_mean_squared_error'
)grid_search.fit(housing_prepared,housing_labels)
sklearn 根據param_grid的值,首先會評估3×4=12種n_estimators和max_features的組合方式,接下來在會在bootstrap=false的情況下(預設該值為true),評估2×3=6種12種n_estimators和max_features的組合方式,所以最終會有12+6=18種不同的超引數組合方式,而每一種組合方式要在訓練集上訓練5次, 所以一共要訓練18×5=90 次,當訓練結束後,你可以通過best_params_獲得最好的組合方式。
>>
>grid_search.best_params_
>
>>
>grid_search.best_estimator_
>randomforestregressor(bootstrap=
true
, criterion=『mse』,max_depth=
none
,max_features=
8, max_leaf_nodes=
none
,min_impurity_decrease=
0.0,min_impurity_split=
none
, min_samples_leaf=
1,min_samples_split=
2,min_weight_fraction_leaf=
0.0,n_estimators=
30, n_jobs=
1,oob_score=
false
,random_state=
none
,verbose=
0, warm_start=
false
)
機器學習中調參的基本思想
我發現大多數的機器學習相關的書都是遍歷各種演算法和案例,為大家講解各種各樣演算法的原理和用途,但卻對調參 甚少。這中間有許多原因,其一是因為,調參的方式總是根據資料的狀況而定,所以沒有辦法一概而論 其二是因為,其實大家也都沒有特別好的辦法。通過畫學習曲線,或者網格搜尋,我們能夠探索到調參邊緣 代價可...
機器學習中調參的基本思想
我發現大多數的機器學習相關的書都是遍歷各種演算法和案例,為大家講解各種各樣演算法的原理和用途,但卻對調參 甚少。這中間有許多原因,其一是因為,調參的方式總是根據資料的狀況而定,所以沒有辦法一概而論 其二是因為,其實大家也都沒有特別好的辦法。通過畫學習曲線,或者網格搜尋,我們能夠探索到調參邊緣 代價可...
機器學習 調參
在實際調整引數之前,我們先要搞清楚兩個事情 1.調參的目的是什麼?2.調參調的東西具體是什麼?第乙個問題 調參的目的是什麼?調參的最終目的是要使訓練之後的模型檢測物體更精確,向程式的方向更靠近一步的話,就是使得損失函式 例如ssd中的loss 盡量小 因為利用訓練集訓練出來的模型質量在訓練過程中只能...