機器學習中調參的基本思想

2022-08-05 17:48:12 字數 4204 閱讀 7239

我發現大多數的機器學習相關的書都是遍歷各種演算法和案例,為大家講解各種各樣演算法的原理和用途,但卻對調參**甚少。這中間有許多原因,其一是因為,調參的方式總是根據資料的狀況而定,所以沒有辦法一概而論;其二是因為,其實大家也都沒有特別好的辦法。

通過畫學習曲線,或者網格搜尋,我們能夠探索到調參邊緣(代價可能是訓練一次模型要跑三天三夜),但是在現實中,高手調參恐怕還是多依賴於經驗,而這些經驗,**於: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

看具體情況

有了以上的知識儲備,我們現在也能夠通過引數的變化來了解,模型什麼時候到達了極限,當複雜度已經不能再降低的時候,我們就不必再調整了,因為調整大型資料的引數是一件非常費時費力的事。除了學習曲線和網格搜尋,我們現在有了基於對模型和正確的調參思路的“推測”能力,這能夠讓我們的調參能力更上一層樓。

一個整合模型(f)在未知資料集(d)上的泛化誤差e(f;d),由方差(var),偏差(bais)和噪聲(ε)共同決定。

關鍵概念:偏差與方差

觀察下面的影象,每個點就是整合演算法中的一個基評估器產生的**值。紅色虛線代表著這些**值的均值,而藍色的線代表著資料本來的面貌。偏差:模型的**值與真實值之間的差異,即每一個紅點到藍線的距離。在整合演算法中,每個基評估器都會有自己的偏差,整合評估器的偏差是所有基評估器偏差的均值。模型越精確,偏差越低。方差:反映的是模型每一次輸出結果與模型**值的平均水平之間的誤差,即每一個紅點到紅色虛線的距離,衡量模型的穩定性。模型越穩定,方差越低。

其中偏差衡量模型是否**得準確,偏差越小,模型越“準”;而方差衡量模型每次**的結果是否接近,即是說方差越小,模型越“穩”;噪聲是機器學習無法干涉的部分,為了讓世界美好一點,我們就不去研究了。一個好的模型,要對大多數未知資料都**得”準“又”穩“。即是說,當偏差和方差都很低的時候,模型的泛化誤差就小,在未知資料上的準確率就高。

偏差大偏差小

方差大

模型不適合這個資料換模型

過擬合模型很複雜對某些資料集**很準確對某些資料集**很糟糕

方差小

欠擬合模型相對簡單**很穩定但對所有的資料**都不太準確

泛化誤差小,我們的目標

通常來說,方差和偏差有一個很大,泛化誤差都會很大。然而,方差和偏差是此消彼長的,不可能同時達到最小值。這個要怎麼理解呢?來看看下面這張圖:

從圖上可以看出,模型複雜度大的時候,方差高,偏差低。偏差低,就是要求模型要**得“準”。模型就會更努力去學習更多資訊,會具體於訓練資料,這會導致,模型在一部分資料上表現很好,在另一部分資料上表現卻很糟糕。模型泛化性差,在不同資料上表現不穩定,所以方差就大。而要儘量學習訓練集,模型的建立必然更多細節,複雜程度必然上升。所以,複雜度高,方差高,總泛化誤差高。

相對的,複雜度低的時候,方差低,偏差高。方差低,要求模型**得“穩”,泛化性更強,那對於模型來說,它就不需要對資料進行一個太深的學習,只需要建立一個比較簡單,判定比較寬泛的模型就可以了。結果就是,模型無法在某一類或者某一組資料上達成很高的準確度,所以偏差就會大。所以,複雜度低,偏差高,總泛化誤差高。

我們調參的目標是,達到方差和偏差的完美平衡!雖然方差和偏差不能同時達到最小值,但他們組成的泛化誤差卻可以有一個最低點,而我們就是要尋找這個最低點。對複雜度大的模型,要降低方差,對相對簡單的模型,要降低偏差。隨機森林的基評估器都擁有較低的偏差和較高的方差,因為決策樹本身是**比較”準“,比較容易過擬合的模型,裝袋法本身也要求基分類器的準確率必須要有50%以上。所以以隨機森林為代表的裝袋法的訓練過程旨在降低方差,即降低模型複雜度,所以隨機森林引數的預設設定都是假設模型本身在泛化誤差最低點的右邊

所以,我們在降低複雜度的時候,本質其實是在降低隨機森林的方差,隨機森林所有的引數,也都是朝著降低方差的目標去。有了這一層理解,我們對複雜度和泛化誤差的理解就更上一層樓了,對於我們調參,也有了更大的幫助。

樹鏈剖分的基本思想

一 樹鏈剖分的作用 通常是求樹上u到v的路徑節點之和 這個問題很容易可以想到設f i 表示根節點到i節點的節點之和 t lca u v 然後可以把u v劃分為u t t v t 則有結論 u v f u f v 2 f t t,這樣就可以求出來了 但是加上u到v的路徑上的節點值的修改的話,就必須用樹...

資料庫Sharding的基本思想和切分策略

本文著重介紹sharding的基本思想和理論上的切分策略,關於更加細緻的實施策略和參考事例請參考我的另一篇博文 資料庫分庫分表 shardi...

資料庫Sharding的基本思想和切分策略

本文著重介紹sharding的基本思想和理論上的切分策略,關於更加細緻的實施策略和參考事例請參考我的另一篇博文 資料庫分庫分表 shardi...