我發現大多數的機器學習相關的書都是遍歷各種算法和案例,為大家講解各種各樣算法的原理和用途,但卻對調參探究甚少。這中間有許多原因,其一是因為,調參的方式總是根據數據的狀況而定,所以沒有辦法一概而論;其二是因為,其實大家也都沒有特別好的辦法。
通過畫學習曲線,或者網格搜索,我們能夠探索到調參邊緣(代價可能是訓練一次模型要跑三天三夜),但是在現實中,高手調參恐怕還是多依賴於經驗,而這些經驗,來源於:1)非常正確的調參思路和方法,2)對模型評估指標的理解,3)對數據的感覺和經驗,4)用洪荒之力去不斷地嘗試。
我們也許無法學到高手們多年累積的經驗,但我們可以學習他們對模型評估指標的理解和調參的思路。
那我們首先來講講正確的調參思路。模型調參,第一步是要找准目標:我們要做什么?一般來說,這個目標是提升某個模型評估指標,比如對於隨機森林來說,我們想要提升的是模型在未知數據上的准確率(由score或oob_score_來衡量)。找准了這個目標,我們就需要思考:模型在未知數據上的准確率受什么因素影響?在機器學習中,我們用來衡量模型在未知數據上的准確率的指標,叫做泛化誤差(Genelization error)。
-
泛化誤差
當模型在未知數據(測試集或者袋外數據)上表現糟糕時,我們說模型的泛化程度不夠,泛化誤差大,模型的效果不好。泛化誤差受到模型的結構(復雜度)影響。看下面這張圖,它准確地描繪了泛化誤差與模型復雜度的關系,當模型太復雜,模型就會過擬合,泛化能力就不夠,所以泛化誤差大。當模型太簡單,模型就會欠擬合,擬合能力就不夠,所以誤差也會大。只有當模型的復雜度剛剛好的才能夠達到泛化誤差最小的目標。
那模型的復雜度與我們的參數有什么關系呢?對樹模型來說,樹越茂盛,深度越深,枝葉越多,模型就越復雜。所以樹模型是天生位於圖的右上角的模型,隨機森林是以樹模型為基礎,所以隨機森林也是天生復雜度高的模型。隨機森林的參數,都是向着一個目標去:減少模型的復雜度,把模型往圖像的左邊移動,防止過擬合。當然了,調參沒有絕對,也有天生處於圖像左邊的隨機森林,所以調參之前,我們要先判斷,模型現在究竟處於圖像的哪一邊。
泛化誤差的背后其實是“偏差-方差困境”,原理十分復雜,無論你翻開哪一本書,你都會看見長篇的數學論證和每個字都能看懂但是連在一起就看不懂的文字解釋。在下一節偏差vs方差中,我用最簡單易懂的語言為大家解釋了泛化誤差背后的原理,大家選讀。那我們只需要記住這四點:
1)模型太復雜或者太簡單,都會讓泛化誤差高,我們追求的是位於中間的平衡點
2)模型太復雜就會過擬合,模型太簡單就會欠擬合
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%以上。所以以隨機森林為代表的裝袋法的訓練過程旨在降低方差,即降低模型復雜度,所以隨機森林參數的默認設定都是假設模型本身在泛化誤差最低點的右邊。
所以,我們在降低復雜度的時候,本質其實是在降低隨機森林的方差,隨機森林所有的參數,也都是朝着降低方差的目標去。有了這一層理解,我們對復雜度和泛化誤差的理解就更上一層樓了,對於我們調參,也有了更大的幫助。
關於方差-偏差的更多內容,大家可以參考周志華的《機器學習》。