⑴ RandomForest隨機森林演算法
https://blog.csdn.net/qq_16633405/article/details/61200502
http://blog.itpub.net/12199764/viewspace-1572056/
https://blog.csdn.net/colourful_sky/article/details/82082854
隨機森林中隨機是核心,通過隨機的選擇樣本、特徵,降低了決策樹之間的相關性。隨機森林中的隨機主要有兩層意思,一是隨機在原始訓練數據中有放回的選取等量的數據作為訓練樣本,二是在建立決策樹時,隨機的選特徵中選取一部分特徵建立決策樹。這兩種隨機使得各個決策樹之間的相關性小,進一步提高模型的准確性。
隨機森林未用到決策樹的剪枝,那怎樣控制模型的過擬合呢?主要通過控制 樹的深度(max_depth),結點停止分裂的最小樣本數(min_size)等參數。隨機森林還可以處理缺失值。
假設訓練集中n個樣本,每個樣本有d個特徵,需要訓練一個包含T棵數的隨機森林,具體的演算法流程如下所示:
1、對於T棵決策樹,分別重復如下操作:a、使用Bootstrap抽樣,從訓練集D獲得大小為n的訓練集D; b、從d個特徵中隨機選取m(m
2、如果是回歸問題,則最後的輸出是 每個樹輸出的均值;
3、如果是分類問題,則根據投票原則,確定最終的類別。
每棵樹的生成都是隨機的,至於隨機選取的特徵數,如何決定隨機選取的特徵數的大小呢,主要有兩種方法,一種是交叉驗證,另外一種的經驗性設置 m= log_2 d +1。
1、分類間隔:分類間隔是指森林中正確分類樣本的決策樹的比例減去錯誤分類的決策樹的比例,通過平均每個樣本的分類間隔得到隨機森林的分類間隔。對於分類間隔,當然是越大越好,大的分類間隔說明模型的分類效果比較穩定,泛化效果好。
2、袋外誤差:對於每棵樹都有一部分樣本而沒有被抽取到,這樣的樣本就被稱為袋外樣本,隨機森林對袋外樣本的預測錯誤率被稱為袋外誤差(Out-Of-Bag Error,OOB)。計算方式如下所示:
(1)對於每個樣本,計算把該樣本作為袋外樣本的分類情況;
(2)以投票的方式確定該樣本的分類結果;
(3)將誤分類樣本個數占總數的比率作為隨機森林的袋外誤差。
3、變數重要程度刻畫:其實變數重要程度刻畫不能算是模型性能評估裡面,因為有的實際應用中需要查看這么多的特徵中到底那一部分特徵是相對重要的特徵,這個時候變數的重要程度的刻畫就顯得尤為重要了。其計算方式主要有一下兩種方式:
(1)通過計算特徵的平均信息增益大小得出;
(2)通過計算每個特徵對模型准確率的影響,通過打亂樣本中某一特徵的特徵值順序,產生新樣本,將新樣本放入建立好的隨機森林模型計算準確率。相對於不重要的特徵,即使打亂了順序也不會對結果產生很大的影響,對於重要的特徵,會對結果產生很大的影響的。
優點 :
1、對於大部分的數據,它的分類效果比較好。
2、能處理高維特徵,不容易產生過擬合,模型訓練速度比較快,特別是對於大數據而言。
3、在決定類別時,它可以評估變數的重要性。
4、對數據集的適應能力強:既能處理離散型數據,也能處理連續型數據,數據集無需規范化。
缺點 :
1、隨機森林容易產生過擬合,特別是在數據集相對小或者是低維數據集的時候。
2、 計算速度比單個的決策樹慢。
3、 當我們需要推斷超出范圍的獨立變數或非獨立變數,隨機森林做得並不好。
分類問題
回歸問題
常用方法 :參考 https://blog.csdn.net/w952470866/article/details/78987265
predict_proba(x):給出帶有概率值的結果。每個點在所有label(類別)的概率和為1。
predict(x):預測X的結果。內部還是調用的predict_proba(),根據概率的結果看哪個類型的預測值最高就是哪個類型。
predict_log_proba(x):和predict_proba基本上一樣,只是把結果給做了log()處理。
fit(X, y, sample_weight=None): 從訓練數據集(X,y)上建立一個決策樹森林。x為訓練樣本,y為目標值(分類中的類標簽,回歸中的實數)。
參數
和GBDT對比,GBDT的框架參數比較多,重要的有最大迭代器個數,步長和子采樣比例,調參起來比較費力。但是RandomForest則比較簡單,這是因為bagging框架里的各個弱學習器之間是沒有依賴關系的,這減小的調參的難度。換句話說,達到同樣的調參效果,RandomForest調參時間要比GBDT少一些。
Bagging框架參數 :
n_estimators:最大的弱學習器個數(建立隨機森林分類器(樹)的個數)。太小容易欠擬合,太大又容易過擬合,一般選擇一個適中的數值。增大可以降低整體模型的方差,提升模型的准確度,且不會對子模型的偏差和方差有任何影響。由於降低的是整體模型方差公式的第二項,故准確度的提高有一個上限。在實際應用中,可以在1至200之間取值;
n_jobs:引擎允許使用處理器的數量。 若值為1則只能使用一個處理器, 值為-1則表示沒有限制。設置n_jobs可以加快模型計算速度;
oob_score:是否採用袋外誤差來評估模型的好壞,默認為 False,推薦設置為True,因為袋外分數反應了一個模型擬合後的泛化能力;
CART決策樹參數 :
max_features: RF劃分時考慮的最大特徵數。可以使用很多種類型的值,默認是"None",意味著劃分時考慮所有的特徵數;如果是"log2"意味著劃分時最多考慮log2N個特徵;如果是"sqrt"或者"auto"意味著劃分時最多考慮N−−√N個特徵。如果是整數,代表考慮的特徵絕對數。如果是浮點數,代表考慮特徵百分比,即考慮(百分比xN)取整後的特徵數,其中N為樣本總特徵數。一般來說,如果樣本特徵數不多,比如小於50,我們用默認的"None"就可以了,如果特徵數非常多,我們可以靈活使用剛才描述的其他取值來控制劃分時考慮的最大特徵數,以控制決策樹的生成時間。
max_depth: 決策樹最大深度。默認為"None",決策樹在建立子樹的時候不會限制子樹的深度這樣建樹時,會使每一個葉節點只有一個類別,或是達到min_samples_split。一般來說,數據少或者特徵少的時候可以不管這個值。如果模型樣本量多,特徵也多的情況下,推薦限制這個最大深度,具體的取值取決於數據的分布。常用的可以取值10-100之間。
min_samples_split: 內部節點再劃分所需最小樣本數,默認2。這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。 默認是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
min_samples_leaf:葉子節點最少樣本數。 這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
min_weight_fraction_leaf:葉子節點最小的樣本權重和。這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。 默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。
max_leaf_nodes: 最大葉子節點數。通過限制最大葉子節點數,可以防止過擬合,默認是"None」,即不限制最大的葉子節點數。如果加了限制,演算法會建立在最大葉子節點數內最優的決策樹。如果特徵不多,可以不考慮這個值,但是如果特徵分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
min_impurity_split: 節點劃分最小不純度。這個值限制了決策樹的增長,如果某節點的不純度(基於基尼系數,均方差)小於這個閾值,則該節點不再生成子節點,即為葉子節點 。一般不推薦改動默認值1e-7。
上面的決策樹參數中最重要的包括最大特徵數 max_features , 最大深度 max_depth , 內部節點再劃分所需最小樣本數 min_samples_split 和葉子節點最少樣本數 min_samples_leaf 。
參數調優 :隨機森林參數的調優在數據分析和挖掘中也佔有一定的地位,學會好的調優方法能夠達到事半功倍的效果。調優參考 https://blog.csdn.net/cherdw/article/details/54971771
⑵ 分類演算法 - 隨機森林
上次我寫了決策樹演算法,決策樹可以解決分類問題,也有CART演算法可以解決回歸問題,而隨機森林也和決策樹非常類似,採用了CART演算法來生成決策樹,因此既可以解決分類問題,也可以解決回歸問題。從名字中可以看出,隨機森林是用隨機的方式構建的一個森林,而這個森林是由很多的相互不關聯的決策樹組成。實時上隨機森林從本質上屬於機器學習的一個很重要的分支叫做集成學習。集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最後結合成單預測,因此優於任何一個單分類的做出預測。
所以理論上,隨機森林的表現一般要優於單一的決策樹,因為隨機森林的結果是通過多個決策樹結果投票來決定最後的結果。簡單來說,隨機森林中每個決策樹都有一個自己的結果,隨機森林通過統計每個決策樹的結果,選擇投票數最多的結果作為其最終結果。我覺得中國一句諺語很形象的表達了隨機森林的運作模式,就是「三個臭皮匠,頂個諸葛亮」。
我有一批100條的數據,通過顏色、長度、甜度、生長地方和水果類別,那麼我要預測在某種顏色、長度、甜度和生長地方的水果究竟是什麼水果,隨機森林要怎麼做呢?
這里的抽樣是指的在這批水果中,有放回地抽樣,比如我要生成3個決策樹來預測水果種類,那麼每棵樹要抽樣50條數據來生成,每棵樹抽取數據後數據要放回,下一棵樹抽取數據仍然要從100條數據裡面抽取。這種方法就叫做 bootstrap重采樣技術 。
每棵樹利用抽取的樣本生成一棵樹,值得注意的是,由於採用的是CART演算法,因此生成的是二叉樹,並且可以處理連續性數據。如果每個樣本的特徵維度為M,像以上提到的數據,樣本特徵維度5,指定一個常數m<<M,隨機地從5個特徵中選取m個特徵子集 (這一點非常重要,這也是隨機森林的隨機這個名字的來源,因此這樣才能保證生成的決策樹不同) ,每次樹進行分裂時,從這m個特徵中選擇最優的,並且每棵決策樹都最大可能地進行生長而不進行剪枝。
此時,一顆茂盛的決策樹就生成了。
根據3顆決策樹的結果,如果是連續型的數據最終需要求均值獲得結果,如果是分類型的數據最後求眾數獲得結果。
1)正如上文所述,隨機森林演算法能解決分類與回歸兩種類型的問題,並在這兩個方面都有相當好的估計表現
2)隨機森林對於高維數據集的處理能力令人興奮,它可以處理成千上萬的輸入變數,並確定最重要的變數,因此被認為是一個不錯的降維方法。此外,該模型能夠輸出變數的重要性程度,這是一個非常便利的功能
3)在對缺失數據進行估計時,隨機森林是一個十分有效的方法。就算存在大量的數據缺失,隨機森林也能較好地保持精確性
4)當存在分類不平衡的情況時,隨機森林能夠提供平衡數據集誤差的有效方法
5)模型的上述性能可以被擴展運用到未標記的數據集中,用於引導無監督聚類、數據透視和異常檢測
6)隨機森林演算法中包含了對輸入數據的重復自抽樣過程,即所謂的bootstrap抽樣。這樣一來,數據集中大約三分之一將沒有用於模型的訓練而是用於測試,這樣的數據被稱為out of bag samples,通過這些樣本估計的誤差被稱為out of bag error。研究表明,這種out of bag方法的與測試集規模同訓練集一致的估計方法有著相同的精確程度,因此在隨機森林中我們無需再對測試集進行另外的設置。
1)隨機森林在解決回歸問題時並沒有像它在分類中表現的那麼好,這是因為它並不能給出一個連續型的輸出。當進行回歸時,隨機森林不能夠作出超越訓練集數據范圍的預測,這可能導致在對某些還有特定雜訊的數據進行建模時出現過度擬合。
2)對於許多統計建模者來說,隨機森林給人的感覺像是一個黑盒子——你幾乎無法控制模型內部的運行,只能在不同的參數和隨機種子之間進行嘗試。
⑶ 隨機森林演算法梳理
全稱Bootstrap Aggregation的集成演算法。每個基學習器都會對訓練集進行 有放回抽樣得到子訓練集 ,比較著名的采樣法為 0.632 自助法。每個基學習器 基於不同子訓練集進行訓練,並綜合所有基學習器的預測值得到最終的預測結果 。 Bagging 常用的綜合方法是投票法,票數最多的類別為預測類別 。
Boosting 訓練過程為階梯狀, 基模型的訓練是有順序的,每個基模型都會在前一個基模型學習的基礎上進行學習,最終綜合所有基模型的預測值產生最終的預測結果,用的比較多的綜合方式為加權法 。
Stacking 是 先用全部數據訓練好基模型,然後每個基模型都對每個訓練樣本進行的預測,其預測值將作為訓練樣本的特徵值,最終會得到新的訓練樣本,然後基於新的訓練樣本進行訓練得到模型,然後得到最終預測結果。
那麼,為什麼集成學習會好於單個學習器呢?原因可能有三:
訓練樣本可能無法選擇出最好的單個學習器,由於沒法選擇出最好的學習器,所以乾脆結合起來一起用;
假設能找到最好的學習器,但由於演算法運算的限制無法找到最優解,只能找到次優解,採用集成學習可以彌補演算法的不足;
可能演算法無法得到最優解,而集成學習能夠得到近似解。比如說最優解是一條對角線,而單個決策樹得到的結果只能是平行於坐標軸的,但是集成學習可以去擬合這條對角線。
不是所有集成學習框架中的基模型都是弱模型。Bagging 和 Stacking 中的基模型為強模型(偏差低,方差高),而Boosting 中的基模型為弱模型(偏差高,方差低)。
對於 Bagging 來說,每個基模型的權重等於 1/m 且期望近似相等,故我們可以得到:
通過上式我們可以看到:
在此我們知道了為什麼 Bagging 中的基模型一定要為強模型,如果 Bagging 使用弱模型則會導致整體模型的偏差提高,而准確度降低。Random Forest 是經典的基於 Bagging 框架的模型,並在此基礎上通過引入特徵采樣和樣本采樣來降低基模型間的相關性,在公式中顯著降低方差公式中的第二項,略微升高第一項,從而使得整體降低模型整體方差。
對於 Boosting 來說,由於基模型共用同一套訓練集,所以基模型間具有強相關性,故模型間的相關系數近似等於 1,針對 Boosting 化簡公式為:
通過觀察整體方差的表達式我們容易發現:
基於 Boosting 框架的 Gradient Boosting Decision Tree 模型中基模型也為樹模型,同 Random Forrest,我們也可以對特徵進行隨機抽樣來使基模型間的相關性降低,從而達到減少方差的效果。
️那麼這里有一個小小的疑問,Bagging 和 Boosting 到底用的是什麼模型呢?
隨機森林就是通過集成學習的思想將多棵樹集成的一種演算法,它的基本單元是決策樹,而它的本質屬於集成學習方法。隨機森林的名稱中有兩個關鍵詞,一個是「隨機」,一個就是「森林」。「森林」我們很好理解,一棵叫做樹,那麼成百上千棵就可以叫做森林了,這也是隨機森林的主要思想--集成思想的體現。然而,bagging的代價是不用單棵決策樹來做預測,具體哪個變數起到重要作用變得未知,所以bagging改進了預測准確率但損失了解釋性。
「森林」容易理解,就是由很多「樹」組成,那麼「隨機」體現在什麼方面呢?
(1)訓練集隨機的選取:如果訓練集大小為N,對於每棵樹而言,隨機且有放回地從訓練集中的抽取N個訓練樣本(這種采樣方式稱為bootstrap sample方法),作為該樹的訓練集;這樣保證了每顆樹的訓練集都不同,從而構建的樹也不同
(2)特徵的隨機選取:從M個特徵中選取m個特徵,這樣可以避免某個特徵與分類結果具有強相關性,如果所有特徵都選取,那麼所有的樹都會很相似,那樣就不夠「隨機」了
另外還有一點,隨機森林法構建樹的時候不需要做額外的剪枝操作。個人理解:因為前兩個「隨機」操作,以及多顆樹的建立,已經避免了過擬合現象,所以這種情況下,我們只需要讓每棵樹在它自己的領域內做到最好就可以了。
隨機森林演算法的預測性能與兩個因素有關:
(1)森林中任意兩棵樹的相關性,相關性越強,則總體性能越容易差
(2)森林中每棵樹的預測性能,每棵樹越好,則總體性能越好
其實可以理解為要求「好而不同」。然而特徵數m的選擇越大,則相關性與個體性能都比較好,特徵數m選擇越小,則相關性與個體性能都更小,所以m的選擇影響著隨機森林的預測性能。
在包括N個樣本的數據集中,採用有放回的抽樣方式選擇N個樣本,構成中間數據集,然後在這個中間數據集的所有特徵中隨機選擇幾個特徵,作為最終的數據集。以上述方式構建多個數據集;一般回歸問題選用全部特徵,分類問題選擇全部特徵個數的平方根個特徵
利用CART為每個數據集建立一個完全分裂、沒有經過剪枝的決策樹,最終得到多棵CART決策樹;
根據得到的每一個決策樹的結果來計算新數據的預測值。
由於RF在實際應用中的良好特性,基於RF,有很多變種演算法,應用也很廣泛,不光可以用於分類回歸,還可以用於特徵轉換,異常點檢測等。下面對於這些RF家族的演算法中有代表性的做一個總結。
extra trees是RF的一個變種, 原理幾乎和RF一模一樣,有區別有:
對於每個決策樹的訓練集,RF採用的是 隨機采樣bootstrap來選擇采樣集作為每個決策樹的訓練集 ,而extra trees一般不採用隨機采樣,即 每個決策樹採用原始訓練集。
在選定了劃分特徵後,RF的決策樹會基於基尼系數,均方差之類的原則,選擇一個最優的特徵值劃分點,這和傳統的決策樹相同。但是extra trees比較的激進,他會隨機的選擇一個特徵值來劃分決策樹。
從第二點可以看出, 由於隨機選擇了特徵值的劃分點位,而不是最優點位,這樣會導致生成的決策樹的規模一般會大於RF所生成的決策樹。 也就是說,模型的方差相對於RF進一步減少,但是偏倚相對於RF進一步增大。在某些時候,extra trees的泛化能力比RF更好。
Totally Random Trees Embedding(以下簡稱 TRTE)是一種 非監督學習的數據轉化方法。它將低維的數據集映射到高維 ,從而讓映射到高維的數據更好的運用於分類回歸模型。我們知道,在支持向量機中運用了核方法來將低維的數據集映射到高維,此處TRTE提供了另外一種方法。
TRTE在數據轉化的過程也使用了類似於RF的方法,建立T個決策樹來擬合數據。當決策樹建立完畢以後,數據集里的每個數據在T個決策樹中葉子節點的位置也定下來了。比如我們有3顆決策樹,每個決策樹有5個葉子節點,某個數據特徵x劃分到第一個決策樹的第2個葉子節點,第二個決策樹的第3個葉子節點,第三個決策樹的第5個葉子節點。則x映射後的特徵編碼為(0,1,0,0,0, 0,0,1,0,0, 0,0,0,0,1), 有15維的高維特徵。這里特徵維度之間加上空格是為了強調三顆決策樹各自的子編碼。
映射到高維特徵後,可以繼續使用監督學習的各種分類回歸演算法了。
Isolation Forest(以下簡稱IForest)是一種 異常點檢測的方法。 它也使用了類似於RF的方法來檢測異常點。
對於在T個決策樹的樣本集,IForest也會對訓練集進行隨機采樣,但是采樣個數不需要和RF一樣,對於RF,需要采樣到采樣集樣本個數等於訓練集個數。但是IForest不需要采樣這么多,一般來說,采樣個數要遠遠小於訓練集個數?為什麼呢?因為我們的目的是異常點檢測,只需要部分的樣本我們一般就可以將異常點區別出來了。
對於每一個決策樹的建立, IForest採用隨機選擇一個劃分特徵,對劃分特徵隨機選擇一個劃分閾值。這點也和RF不同。
另外,IForest一般會選擇一個比較小的最大決策樹深度max_depth,原因同樣本採集,用少量的異常點檢測一般不需要這么大規模的決策樹。
對於異常點的判斷,則是將測試樣本點x擬合到T顆決策樹。計算在每顆決策樹上該樣本的葉子節點的深度ht(x),從而可以計算出平均高度h(x)。此時我們用下面的公式計算樣本點x的異常概率:
其中,m為樣本個數。c(m)的表達式為:
s(x,m)的取值范圍是[0,1],取值越接近於1,則是異常點的概率也越大。
RF的主要優點有:
訓練可以 高度並行化 ,對於大數據時代的大樣本訓練速度有優勢。
由於可以隨機選擇決策樹節點劃分特徵,這樣在 樣本特徵維度很高的時候,仍然能高效的訓練模型。
在訓練後,可以給出各個特徵對於輸出的重要性
由於採用了隨機采樣,訓練出的模型的 方差小,泛化能力強。
相對於Boosting系列的Adaboost和GBDT, RF實現比較簡單 。
對部分特徵缺失不敏感。
缺點:
在某些噪音比較大的樣本集上, RF模型容易陷入過擬合。
取值劃分比較多的特徵容易對RF的決策產生更大的影響,從而影響擬合的模型的效果。
數據維度相對低(幾十維),同時對准確性有較高要求時。
因為不需要很多參數調整就可以達到不錯的效果,基本上不知道用什麼方法的時候都可以先試一下隨機森林。
sklearn.ensemble.RandomForestClassifier(n_estimators=100, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)
⑷ 隨機森林演算法是什麼
隨機森林是一種比較新的機器學習模型。
經典的機器學習模型是神經網路,有半個多世紀的歷史了。神經網路預測精確,但是計算量很大。上世紀八十年代Breiman等人發明分類樹的演算法(Breiman et al. 1984),通過反復二分數據進行分類或回歸,計算量大大降低。
2001年Breiman把分類樹組合成隨機森林(Breiman 2001a),即在變數(列)的使用和數據(行)的使用上進行隨機化,生成很多分類樹,再匯總分類樹的結果。隨機森林在運算量沒有顯著提高的前提下提高了預測精度。
隨機森林對多元共線性不敏感,結果對缺失數據和非平衡的數據比較穩健,可以很好地預測多達幾千個解釋變數的作用(Breiman 2001b),被譽為當前最好的演算法之一(Iverson et al. 2008)。
隨機森林優點:
隨機森林是一個最近比較火的演算法,它有很多的優點:
a、在數據集上表現良好,兩個隨機性的引入,使得隨機森林不容易陷入過擬合。
b、在當前的很多數據集上,相對其他演算法有著很大的優勢,兩個隨機性的引入,使得隨機森林具有很好的抗雜訊能力。
c、它能夠處理很高維度(feature很多)的數據,並且不用做特徵選擇,對數據集的適應能力強:既能處理離散型數據,也能處理連續型數據,數據集無需規范化。