天天看點

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

本文是機器學習sklearn的系列文章之一,下面是前緒文章:

機器學習sklearn系列之決策樹: 飄哥:機器學習sklearn系列之決策樹

機器學習sklearn之随機森林(第一部分):飄哥:機器學習sklearn之随機森林

随機森林的調參

前面學到了很多參數和屬性,我們來看看調參基本思想,市面上的書基本上是周遊了各種算法編寫了各種案例,講解了各種算法的原理和用途,但是對實踐中的調參寫的非常少,原因可以想象,一是因為調參方式是跟資料的規模相關,沒有辦法一概而論,是以書也很難寫出來一定要怎麼樣。二是沒有好的調參的辦法,主要還是基于經驗。

學習曲線和交叉驗證,還有網格搜尋是可以幫助調參數。網格搜尋(Grid Search)名字非常大氣,但是用簡答的話來說就是你手動的給出一個模型中你想要改動的所用的參數,程式自動的幫你使用窮舉法來将所用的參數都運作一遍

,找到一個最佳模型,資料規模特别大,要跑個三天三夜。 工作中高手調參更多依賴于經驗。他們比别人強的地方是他們正确的調參思路和方法,以及對評估名額的了解,還有對資料的經驗和感覺,以及他們的時間,精力,以及他們的洪荒之力不斷的去嘗試。

我們也許無法學到高手們多年累積的經驗,但我們可以學他們對模型評估名額的了解和調參思路。這兩個我們是可以學到的,下面我講講什麼是正确的調參思路。

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

模型調參,第1步是找目标:我們要做什麼?一般來說這個目标是提升模型的某個評估名額,

比如對随機森林來說,我就是想要提升模型在未知資料上的準确率,(由score或oob_score_來衡量)就是讓它在測試集上準去率高,找準了這個目标,我們就需要思考:模型在未知資料上的準确率受什麼因素影響?我們都知道他是accuracy 在機器學習中,它是什麼東西影響了他呢,在機器學習中我們有一個專門用來衡量模型,在未知名額上的準确率的名額叫做泛化誤差叫做泛化誤差(Genelization error)

1. 泛化誤差

當模型在未知資料上表現很糟糕的時候,我們就說模型的泛化程度不夠,泛化誤差很大,模型的效果不好,意思就是在測試上表現不好。它是受到模型的結構影響,我們來看一下下面的這張圖:

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

它準确地描繪了泛化誤差與模型複雜度的關系,當模型太複雜,模型就會過拟合,泛化能力就不夠,是以泛化誤差大。當模型太簡單,學習能力不夠,模型就會欠拟合,拟合能力就不夠,是以誤差也會大。隻有當模型的複雜度剛剛好這個模型既不是太複雜,我的訓練集也不是太簡單,就是也沒有學習的太草率的時候,我們在能在中間找到一個最佳模型的複雜度。這個最佳模型複雜度能引導我們找到泛化誤差的最低點,我們的目标就是找到泛化誤差最小的這一個點。

那你說模型的複雜度跟我們的參數有什麼關系呢?

我們是要講調參對不對?對于樹模型還有樹的內建模型來說,樹越茂盛,深度越深,枝葉越多,模型就越複雜,是以樹模型是天生位于上圖右上角的模型(意思是最大深度越深,就越靠近圖的右邊,最大深度越淺越靠近圖的左邊,樹模型天生就很複雜,天生就容易過拟合),随機森林是以樹模型為基礎,是以随機森林也是位于上圖的右上角,是天生複雜度高的模型。随機森林的參數,都是向着一個目标去:減少模型的複雜度,把模型往圖像的左邊移動,防止過拟合。讓他的泛化誤差慢慢慢慢的降下來到達最優點, 當然了,調參沒有絕對,也有天生處于圖像左邊的随機森林,是以調參之前,我們要先判斷,模型現在究竟處于圖像的哪一邊。

調參是沒有絕對的,也有天生就處于左邊的這種随機森林,是以調參之前我們要先判斷你這模型究竟在圖上的哪一邊。

上圖的背後,泛化誤差和模型複雜度的背後的原理其實叫做偏差方差困境。

原理十分複雜,無論你翻開哪一本書,你都會看見一頁半到兩頁的數學推導和論證,然後還有很多你不認識的數學符号,可能每個字你都能看懂,但是連在一起就完全不懂了文字解釋,在下一節偏差vs方差中,我用最簡單易懂的語言為大家解釋了泛化誤差背後的原理,大家選讀,當然如果你能夠了解當然是更好,這裡面詳細的解釋了複雜度和我們的總泛化誤差形成這樣的一種聯系的,那如果你不了解或者說你不想去糾結那麼多沒關系,那我給你總結了,我們通過上圖需要記住的4點:

1)模型太複雜或者太簡單,都會讓泛化誤差高,準确率很低,我們追求的是位于中間的平衡點

2)模型太複雜就會過拟合,模型太簡單就會欠拟合(模型太複雜右上角就會過拟合,如果模型太簡單,左下角就會欠拟合)

3)對樹模型和樹的內建模型來說,樹的深度越深,枝葉越多,模型越複雜

4)樹模型和樹的內建模型的目标,都是減少模型複雜度,把模型往圖像的左邊移動

那具體每個參數,都如何影響我們的複雜度和模型呢?我們一直以來調參,都是在學習曲線上輪流找最優值,我們盼望能夠将準确率修正到一個比較高的水準。調來調去,這樣我們有了一個很明确的方向,然而我們現在了解了随機森林的調參方向:降低複雜度,就是剪枝,我們就可以将那些對複雜度影響巨大的參數挑選出來,研究他們的單調性,然後專注調整那些能最大限度讓複雜度降低的參數,是不是就可以把我們的這個準确率最大限度的調上去了?

對于那些不單調的參數,或者反而會讓複雜度升高的參數,我們就視情況使用,大多時候甚至可以不調了,因為它會讓複雜度升高,。基于經驗,我對各個參數對模型的影響程度做了一個排序。在我們調參的時候,大家可以參考這個順序。影響程度的星星越多代表他對模型的影響越大,要調的時候優先選擇影響程度更大的。

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

大家有了這個表哪怕你不是非常了解什麼複雜度之類,照着這個表慢慢的去調,你也能夠調出一個很好的模型。

我也說了當n_estimateors能将我們的精确性提升到平穩,當n_estimateors越來越大的時候,它不影響單個模型的複雜度,你盡情的調,隻要你的電腦能算出來,隻要你的計算是OK的,盡情的調n_estimateors是可以越大越好,而且它對樹的影響程度非常的大,他可以讓我們的泛化誤差非常快速的減下來。

Max_depth最大深度,預設是讓數無盡的生長的也就是說天生就是最高複雜度,向複雜度降低的方向挑戰是怎麼樣?讓最大深度降低,模型更簡單,它就像圖像的左邊移動了,它就移動到上圖的左邊了。

Min_samples_leaf和min_samples_split是一樣的,他們的預設最小限制是1,也是預設最高複雜度,我規定你葉節點裡面至少要有一片葉子你才能夠存在,這不就相當于是說随便分,你都可以存在這個意思嗎?就是會漲到極限,是以這兩個參數也是最開始就預設是最高複雜度的。他們的複雜度也是降低的方向調參,這個參數越大,模型越簡單,這兩個參數越大,模型會向左邊移動

Max_features會有一點點不一樣,因為它的預設值是auto,auto是什麼,特征總數的開平方的值,它是位于中間複雜度,不是說你隻可以使用兩個特征,也不是說你可以使用全部的特征,他沒有讓樹長到最大也沒有限制在最小,他是屬于中間的某個位置,是以他的調參方向既可以往複雜度升高的方向調,也可以往複雜度降低的方向去調。Max_features往下的時候模型會更簡單,圖像往左移,Max_features往上的時候模型會更複雜,圖像往右移動,這個參數對模型的影響程度比較低比較低,但是它是唯一能夠讓樹更簡單,也能讓樹更複雜的參數。是以在調這個參數的時候,我們需要考慮我們調參的方向。

Criteion有增有減,用基尼系數,他是看具體情況,有的時候如同神來之筆橋的特别好,有的時候放上去了一點用都沒有。

有了以上的知識儲備,我們現在也能夠通過參數的變化來了解,模型什麼時候到達了極限,當複雜度已經不能再降低的時候,我們就不必再調整了,不管你有多少參數備用,你都不需要調了,因為調整大型資料的參數是一件非常費時費力的事。除了學習曲線和網格搜尋,我們現在有了一套基于對模型的正确的調參思路的了解,和調參思路的“推測”能力,我知道吧這個參數放進去,我知道調參是上升還是下降,這能夠讓我們的調參能力更上一層樓。

注:對于大型資料集,

max_leaf_nodes

可以嘗試從1000來建構,先輸入1000,每100個葉子一個區間,再逐漸縮小範圍

對于

min_samples_split

min_samples_leaf

,一般是從他們的最小值開始向上增加10或20,面對高次元高樣本量資料,如果不放心,也可以直接+50,對于大型資料,可能需要200~300的範圍,如果調整的時候發現準确率無論如何都上不來,那可以放心大膽調一個很大的資料,大力限制模型的複雜度

2. 偏差 vs 方差

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

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

關鍵概念:偏差與方差觀察下面的圖像,每個點就是內建算法中的一個基評估器産生的預測值。紅色虛線代表着這些預測值的均值,而藍色的線代表着資料本來的面貌。

偏差:模型的預測值與真實值之間的差異,即每一個紅點到藍線的距離。在內建算法中,每個基評估器都會有自己的偏差,內建評估器的偏差是所有基評估器偏差的均值。模型越精确,偏差越低。

方差:反映的是模型每一次輸出結果與模型預測值的平均水準之間的誤差,即每一個紅點到紅色虛線的距離,衡量模型的穩定性。模型越穩定,方差越低。

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

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

偏差大偏差小方差大模型不适合這個資料

換模型過拟合

模型很複雜

對某些資料集預測很準确

對某些資料集預測很糟糕方差小欠拟合

模型相對簡單

預測很穩定

但對所有的資料預測都不太準确泛化誤差小,我們的目标

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

sklearn 随機森林_機器學習sklearn之随機森林(第二部分:随機森林的調參)

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

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

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

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

關于方差-偏差的更多内容,大家可以參考周志華的《機器學習》。(重點:需要數學基礎,數學基礎,數學基礎,重要的事情說三遍)。