我發現大多數的機器學習相關的書都是遍歷各類算法和案例,爲你們講解各類各樣算法的原理和用途,但卻對調參探究甚少。這中間有許多緣由,其一是由於,調參的方式老是根據數據的情況而定,因此沒有辦法一律而論;其二是由於,其實你們也都沒有特別好的辦法。算法
經過畫學習曲線,或者網格搜索,咱們可以探索到調參邊緣(代價多是訓練一次模型要跑三天三夜),可是在現實中,高手調參恐怕仍是多依賴於經驗,而這些經驗,來源於:1)很是正確的調參思路和方法,2)對模型評估指標的理解,3)對數據的感受和經驗,4)用洪荒之力去不斷地嘗試。機器學習
咱們也許沒法學到高手們多年累積的經驗,但咱們能夠學習他們對模型評估指標的理解和調參的思路。性能
那咱們首先來說講正確的調參思路。模型調參,第一步是要找準目標:咱們要作什麼?通常來講,這個目標是提高某個模型評估指標,好比對於隨機森林來講,咱們想要提高的是模型在未知數據上的準確率(由score或oob_score_來衡量)。找準了這個目標,咱們就須要思考:模型在未知數據上的準確率受什麼因素影響?在機器學習中,咱們用來衡量模型在未知數據上的準確率的指標,叫作泛化偏差(Genelization error)。學習
泛化偏差測試
當模型在未知數據(測試集或者袋外數據)上表現糟糕時,咱們說模型的泛化程度不夠,泛化偏差大,模型的效果很差。泛化偏差受到模型的結構(複雜度)影響。看下面這張圖,它準確地描繪了泛化偏差與模型複雜度的關係,當模型太複雜,模型就會過擬合,泛化能力就不夠,因此泛化偏差大。當模型太簡單,模型就會欠擬合,擬合能力就不夠,因此偏差也會大。只有當模型的複雜度剛恰好的纔可以達到泛化偏差最小的目標。spa
那模型的複雜度與咱們的參數有什麼關係呢?對樹模型來講,樹越茂盛,深度越深,枝葉越多,模型就越複雜。因此樹模型是天生位於圖的右上角的模型,隨機森林是以樹模型爲基礎,因此隨機森林也是天生複雜度高的模型。隨機森林的參數,都是向着一個目標去:減小模型的複雜度,把模型往圖像的左邊移動,防止過擬合。固然了,調參沒有絕對,也有天生處於圖像左邊的隨機森林,因此調參以前,咱們要先判斷,模型如今究竟處於圖像的哪一邊。blog
泛化偏差的背後實際上是「誤差-方差困境」,原理十分複雜,不管你翻開哪一本書,你都會看見長篇的數學論證和每一個字都能看懂可是連在一塊兒就看不懂的文字解釋。在下一節誤差vs方差中,我用最簡單易懂的語言爲你們解釋了泛化偏差背後的原理,你們選讀。那咱們只須要記住這四點:排序
1)模型太複雜或者太簡單,都會讓泛化偏差高,咱們追求的是位於中間的平衡點數學
2)模型太複雜就會過擬合,模型太簡單就會欠擬合it
3)對樹模型和樹的集成模型來講,樹的深度越深,枝葉越多,模型越複雜
4)樹模型和樹的集成模型的目標,都是減小模型複雜度,把模型往圖像的左邊移動
那具體每一個參數,都如何影響咱們的複雜度和模型呢?咱們一直以來調參,都是在學習曲線上輪流找最優值,盼望可以將準確率修正到一個比較高的水平。然而咱們如今瞭解了隨機森林的調參方向:下降複雜度,咱們就能夠將那些對複雜度影響巨大的參數挑選出來,研究他們的單調性,而後專一調整那些能最大限度讓複雜度下降的參數。對於那些不單調的參數,或者反而會讓複雜度升高的參數,咱們就視狀況使用,大多時候甚至能夠退避。基於經驗,我對各個參數對模型的影響程度作了一個排序。在咱們調參的時候,你們能夠參考這個順序。
參數 | 對模型在未知數據上的評估性能的影響 | 影響程度 |
---|---|---|
n_estimators | 提高至平穩,n_estimators↑,不影響單個模型的複雜度 | ⭐⭐⭐⭐ |
max_depth | 有增有減,默認最大深度,即最高複雜度,向複雜度下降的方向調參max_depth↓,模型更簡單,且向圖像的左邊移動 | ⭐⭐⭐ |
min_samples_leaf | 有增有減,默認最小限制1,即最高複雜度,向複雜度下降的方向調參min_samples_leaf↑,模型更簡單,且向圖像的左邊移動 | ⭐⭐ |
min_samples_split | 有增有減,默認最小限制2,即最高複雜度,向複雜度下降的方向調參min_samples_split↑,模型更簡單,且向圖像的左邊移動 | ⭐⭐ |
max_features | 有增有減,默認auto,是特徵總數的開平方,位於中間複雜度,既能夠向複雜度升高的方向,也能夠向複雜度下降的方向調參 max_features↓, 模型更簡單,圖像左移 max_features↑,模型更復雜,圖像右移 max_features是惟一的,既可以讓模型更簡單,也可以讓模型更復雜的參數, 因此在調整這個參數的時候,須要考慮咱們調參的方向 |
⭐ |
criterion | 有增有減,通常使用gini | 看具體狀況 |
有了以上的知識儲備,咱們如今也可以經過參數的變化來了解,模型何時到達了極限,當複雜度已經不能再下降的時候,咱們就沒必要再調整了,由於調整大型數據的參數是一件很是費時費力的事。除了學習曲線和網格搜索,咱們如今有了基於對模型和正確的調參思路的「推測」能力,這可以讓咱們的調參能力更上一層樓。
誤差 vs 方差
一個集成模型(f)在未知數據集(D)上的泛化偏差E(f;D),由方差(var),誤差(bais)和噪聲(ε)共同決定。
關鍵概念:誤差與方差 |
---|
觀察下面的圖像,每一個點就是集成算法中的一個基評估器產生的預測值。紅色虛線表明着這些預測值的均值,而藍色的線表明着數據原本的面貌。 誤差:模型的預測值與真實值之間的差別,即每個紅點到藍線的距離。在集成算法中,每一個基評估器都會有本身的誤差,集成評估器的誤差是全部基評估器誤差的均值。模型越精確,誤差越低。 方差:反映的是模型每一次輸出結果與模型預測值的平均水平之間的偏差,即每個紅點到紅色虛線的距離,衡量模型的穩定性。模型越穩定,方差越低。 |
其中誤差衡量模型是否預測得準確,誤差越小,模型越「準」;而方差衡量模型每次預測的結果是否接近,便是說方差越小,模型越「穩」;噪聲是機器學習沒法干涉的部分,爲了讓世界美好一點,咱們就不去研究了。一個好的模型,要對大多數未知數據都預測得」準「又」穩「。便是說,當誤差和方差都很低的時候,模型的泛化偏差就小,在未知數據上的準確率就高。
誤差大 | 誤差小 | |
---|---|---|
方差大 | 模型不適合這個數據 換模型 | 過擬合 模型很複雜 對某些數據集預測很準確 對某些數據集預測很糟糕 |
方差小 | 欠擬合 模型相對簡單 預測很穩定 但對全部的數據預測都不太準確 | 泛化偏差小,咱們的目標 |
一般來講,方差和誤差有一個很大,泛化偏差都會很大。然而,方差和誤差是此消彼長的,不可能同時達到最小值。這個要怎麼理解呢?來看看下面這張圖:
從圖上能夠看出,模型複雜度大的時候,方差高,誤差低。誤差低,就是要求模型要預測得「準」。模型就會更努力去學習更多信息,會具體於訓練數據,這會致使,模型在一部分數據上表現很好,在另外一部分數據上表現卻很糟糕。模型泛化性差,在不一樣數據上表現不穩定,因此方差就大。而要儘可能學習訓練集,模型的創建必然更多細節,複雜程度必然上升。因此,複雜度高,方差高,總泛化偏差高。
相對的,複雜度低的時候,方差低,誤差高。方差低,要求模型預測得「穩」,泛化性更強,那對於模型來講,它就不須要對數據進行一個太深的學習,只須要創建一個比較簡單,斷定比較寬泛的模型就能夠了。結果就是,模型沒法在某一類或者某一組數據上達成很高的準確度,因此誤差就會大。因此,複雜度低,誤差高,總泛化偏差高。
咱們調參的目標是,達到方差和誤差的完美平衡!雖然方差和誤差不能同時達到最小值,但他們組成的泛化偏差卻能夠有一個最低點,而咱們就是要尋找這個最低點。對複雜度大的模型,要下降方差,對相對簡單的模型,要下降誤差。隨機森林的基評估器都擁有較低的誤差和較高的方差,由於決策樹自己是預測比較」準「,比較容易過擬合的模型,裝袋法自己也要求基分類器的準確率必需要有50%以上。因此以隨機森林爲表明的裝袋法的訓練過程旨在下降方差,即下降模型複雜度,因此隨機森林參數的默認設定都是假設模型自己在泛化偏差最低點的右邊。
因此,咱們在下降複雜度的時候,本質實際上是在下降隨機森林的方差,隨機森林全部的參數,也都是朝着下降方差的目標去。有了這一層理解,咱們對複雜度和泛化偏差的理解就更上一層樓了,對於咱們調參,也有了更大的幫助。
關於方差-誤差的更多內容,你們能夠參考周志華的《機器學習》。