【任務一 隨機森林算法梳理】
- 集成學習概念
集成學習簡單理解就是指採用多個分類器對數據集進行預測,從而提高整體分類器的泛化能力。換個角度考慮,訓練完成之後就可以看成是單獨的一個”假設”(或模型),只是該”假設”不一定是在原”假設”空間裏的。因此,Ensemble方法具有更多的靈活性。理論上來說,Ensemble方法也比單一模型更容易過擬合。但是,實際中有一些方法(尤其是Bagging)也傾向於避免過擬合
集成學習有三個流派:
- boosting流派,它的特點是各個弱學習器之間有依賴關係;
包括了常用的應用:Adaboost、GBDT、xgboost等。
- bagging流派,它的特點是各個弱學習器之間沒有依賴關係,可以並行擬合;
全稱爲Bootstrap aggregating,裝袋法。
- stacking流派, 組合學習器的概念,基本的步驟如下:
1.劃分訓練數據集爲兩個不相交的集合。
2. 在第一個集合上訓練多個學習器。
3. 在第二個集合上測試這幾個學習器
4. 把第三步得到的預測結果作爲輸入,把正確的迴應作爲輸出,訓練一個高層學習器,
- 個體學習器概念
個體學習器的基本內容是,子分類器,基於當前數據而建立的簡單弱分類器。
- boosting bagging
- Boosting:
Boosting是一種用來提高弱分類算法準確度的方法,這種方法通過構造一個預測函數系列,然後以一定的方式將他們組合成一個預測函數。
Boosting:
- 是一種用來提高弱分類算法準確度的方法,這種方法通過構造一個預測函數系列,然後以一定的方式將他們組合成一個預測函數。
- 是一種框架算法,主要是通過對樣本集的操作獲得樣本子集,然後用弱分類算法在樣本子集上訓練生成一系列的基分類器。
- 可以用來提高其他弱分類算法的識別率,也就是將其他的弱分類算法作爲基分類算法放於Boosting 框架中,通過Boosting框架對訓練樣本集的操作,得到不同的訓練樣本子集,用該樣本子集去訓練生成基分類器;
- 每得到一個樣本集就用該基分類算法在該樣本集上產生一個基分類器,這樣在給定訓練輪數 n 後,就可產生 n 個基分類器,然後Boosting框架算法將這 n個基分類器進行加權融合,產生一個最後的結果分類器,在這 n個基分類器中,每個單個的分類器的識別率不一定很高,但他們聯合後的結果有很高的識別率,這樣便提高了該弱分類算法的識別率。
- 在產生單個的基分類器時可用相同的分類算法,也可用不同的分類算法,這些算法一般是不穩定的弱分類算法,如神經網絡(BP) ,決策樹(C4.5)等。
- 基本思想:
原理:尋找多個識別率不是很高的弱分類算法比尋找一個識別率很高的強分類算法要容易得多,比如AdaBoost 算法的任務就是完成將容易找到的識別率不高的弱分類算法提升爲識別率很高的強分類算法,這也是 AdaBoost 算法的核心指導思想所在;
如果算法完成了這個任務,那麼在分類時,只要找到一個比隨機猜測略好的弱分類算法,就可以將其提升爲強分類算法,而不必直接去找通常情況下很難獲得的強分類算法。通過產生多分類器最後聯合的方法提升弱分類算法,讓它變爲強的分類算法,也就是給定一個弱的學習算法和訓練集,在訓練集的不同子集上,多次調用弱學習算法,最終按加權方式聯合多次弱學習算法的預測結果得到最終學習結果。包含以下2 點:
1、樣本的權重
- AdaBoost 通過對樣本集的操作來訓練產生不同的分類器,他是通過更新分佈權值向量來改變樣本權重的,也就是提高分錯樣本的權重,重點對分錯樣本進行訓練。
- (1) 沒有先驗知識的情況下,初始的分佈應爲等概分佈,也就是訓練集如果有 n個樣本,每個樣本的分佈概率爲1/ n。
- (2)每次循環後提高錯誤樣本的分佈概率,分錯的樣本在訓練集中所佔權重增大,使得下一次循環的基分類器
- 能夠集中力量對這些錯誤樣本進行判斷。弱分類器的權重最後的強分類器是通過多個基分類器聯合得到的,因此在最後聯合時各個基分類器所起的作用對聯合結果有很大的影響,因爲不同基分類器的識別率不同,他的作用就應該不同,這裏通過權值體現它的作用,因此識別率越高的基分類器權重越高,識別率越低的基分類器權重越低。權值計算如下:
2、基分類器的錯誤率:
- e = ∑( ht ( x i) ≠yi) Di (1)
基分類器的權重:Wt = F( e) ,由基分類器的錯誤率計算他的權重。
從偏差和方差的角度上進行考慮:
boosting從優化角度來看,是用forward-stagewise這種貪心法去最小化損失函數。
例如,常見的AdaBoost即等價於用這種方法最小化exponential loss:。所謂forward-stagewise,就是在迭代的第n步,求解新的子模型f(x)及步長a(或者叫組合係數),來最小化,這裏
是前n-1步得到的子模型的和。
因此boosting是在sequential地最小化損失函數,其bias自然逐步下降。
但由於是採取這種sequential、adaptive的策略,各子模型之間是強相關的,於是子模型之和並不能顯著降低variance。
所以說boosting主要還是靠降低bias來提升預測精度。
樣本選擇上:
Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。
樣例權重:
Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。
預測函數:
Boosting:每個弱分類器都有相應的權重,對於分類誤差小的分類器會有更大的權重。
並行計算:
Boosting:各個預測函數只能順序生成,因爲後一個模型參數需要前一輪模型的結果。
- Bagging:
Bagging是一種用來提高學習算法準確度的方法,這種方法通過構造一個預測函數系列,然後以一定的方式將它們組合成一個預測函數。
Bagging要求“不穩定”(不穩定是指數據集的小的變動能夠使得分類結果的顯著的變動)的分類方法。比如:決策樹,神經網絡算法。
基本思想:
1.給定一個弱學習算法,和一個訓練集;
2.單個弱學習算法準確率不高;
3.將該學習算法使用多次,得出預測函數序列,進行投票;
4.最後結果準確率將得到提高.
從偏差和方差的角度上進行考慮:
Bagging對樣本重採樣,對每一重採樣得到的子樣本集訓練一個模型,最後取平均。
由於子樣本集的相似性以及使用的是同種模型,因此各模型有近似相等的bias和variance(事實上,各模型的分佈也近似相同,但不獨立)。
由於,所以bagging後的bias和單個子模型的接近,一般來說不能顯著降低bias。
另一方面,若各子模型獨立,則有,此時可以顯著降低variance。若各子模型完全相同,則,此時不會降低variance。
bagging方法得到的各子模型是有一定相關性的,屬於上面兩個極端狀況的中間態,因此可以一定程度降低variance。
爲了進一步降低variance,Random forest通過隨機選取變量子集做擬合的方式de-correlated了各子模型(樹),使得variance進一步降低。
(用公式可以一目瞭然:設有i.d.的n個隨機變量,方差記爲,兩兩變量之間的相關性爲,則的方差爲,bagging降低的是第二項,random forest是同時降低兩項。
樣本選擇上:
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。
樣例權重:
Bagging:使用均勻取樣,每個樣例的權重相等;
預測函數:
Bagging:所有預測函數的權重相等。
並行計算:
Bagging:各個預測函數可以並行生成
4. 結合策略(平均法,投票法,學習法)
- 結合策略優點:
1.提高泛化性能
2.降低進入局部最小點的風險
3.擴大假設空間
- 平均法:包括了簡單平均、加權平均
適用範圍:
- 規模大的集成,學習的權重較多,加權平均法易導致過擬合
- 個體學習器性能相差較大時宜使用加權平均法,相近用簡單平均法。
- 投票法:
1.絕對多數投票法:某標記超過半數;
2.相對多數投票法:預測爲得票最多的標記,若同時有多個標記的票最高,則從中隨機選取一個。
3.加權投票法:提供了預測結果,與加權平均法類似。
- 學習法
Stacking:先從初始數據集中訓練出初級學習器,然後“生成”一個新數據集用於訓練次級學習器。在新數據集中,初級學習器的輸出被當做樣例輸入特徵,初始樣本的標記仍被當做樣例標記。
- 隨機森林思想
1、什麼是隨機森林?
隨機森林就是用隨機的方式建立一個森林,在森林裏有很多決策樹組成,並且每一棵決策樹之間是沒有關聯的。當有一個新樣本的時候,我們讓森林的每一棵決策樹分別進行判斷,看看這個樣本屬於哪一類,然後用投票的方式,哪一類被選擇的多,作爲最終的分類結果。在迴歸問題中,隨機森林輸出所有決策樹輸出的平均值。
(1)隨機森林既可以用於分類,也可以用於迴歸。
(2)它是一種降維手段,用於處理缺失值和異常值。
(3)它是集成學習的重要方法。
2、兩個隨機抽取
(1)樣本有放回隨機抽取固定數目
(2)構建決策樹時,特徵隨機抽取
解釋:兩個隨機性的引入對隨機森林的分類性能至關重要。由於它們的引入,使得隨機森林不容易陷入過擬合,並且具有很好得抗噪能力(比如:對缺省值不敏感)
3、隨機森林算法是如何工作的?
在隨機森林中,每一個決策樹“種植”和“生長”的四個步驟:
(1)假設我們設定訓練集中的樣本個數爲N,然後通過有重置的重複多次抽樣獲得這N個樣本,這樣的抽樣結果將作爲我們生成決策樹的訓練集;
(2)如果有M個輸入變量,每個節點都將隨機選擇m(m<M)個特定的變量,然後運用這m個變量來確定最佳的分裂點。在決策樹的生成過程中,m的值是保持不變的;
(3)每棵決策樹都最大可能地進行生長而不進行剪枝;
(4)通過對所有的決策樹進行加總來預測新的數據(在分類時採用多數投票,在迴歸時採用平均)。
4、隨機森林的優缺點
優點:
(1)在分類和迴歸都表現良好
(2)對高維數據的處理能力強,可以處理成千上萬的輸入變量,是一個非常不錯的降維方法
(3)能夠輸出特徵的重要程度
(4)有效的處理缺省值
5、重要參數
隨機森林分類效果(錯誤率)與兩個因素有關:
(1)森林中任意兩棵樹的相關性:相關性越大,錯誤率越大;
(2)森林中每棵樹的分類能力:每棵樹的分類能力越強,整個森林的錯誤率越低。
減小特徵選擇個數m,樹的相關性和分類能力也會相應的降低;增大m,兩者也會隨之增大。所以關鍵問題是如何選擇最優的m(或者是範圍),這也是隨機森林唯一的一個參數。在學習如何選擇參數前首先介紹oob的概念。
6、oob:袋外錯誤率
爲了選擇最優的m,這裏需要利用的是袋外錯誤率oob(out-of-bag error)。我們知道,在構建每個決策樹的時候,採用的是隨機又放回的抽取,所以對於每棵樹來說,都有一些樣本實力沒有參與樹的生成,所以這些樣本成爲袋外樣本,即oob。所以我們需要做一下oob估計:
(1)對每個樣本,計算它作爲oob樣本的樹對它的分類情況
(2)多數投票作爲該樣本的分類結果
(3)用誤分個數佔樣本總數的比率作爲隨機森林的oob誤分率
oob誤分率是隨機森林泛化誤差的一個無偏估計,它的結果近似於需要大量計算的k折交叉驗證。所以沒有必要對它進行交叉驗證或者用一個獨立的測試集來獲得誤差的一個無偏估計。它可以在內部進行評估,也就是說在生成的過程中就可以對誤差建立一個無偏估計。
當我們知道了oob的計算方法,我們可以通過選取不同的m,計算oob error,找出oob error最小時對應的m的值。這和交叉驗證的思想非常的相似。
7、RF特徵重要性的度量方法
(1)對於每一棵決策樹,計算其oob error_0
(2)選取一個特徵,隨機對特徵加入噪聲干擾,再次計算oob error_1
(3)特徵的重要性=∑(oob error_1-oob error_0)/隨機森林中決策樹的個數
(4)對隨機森林中的特徵變量按照特徵重要性降序排序。
(5)然後重複以上步驟,直到選出m個特徵。
解釋:用這個公式來度量特徵重要性,原因是:給某個特徵隨機的加入噪聲後,如果oob error增大,說明這個特徵對樣本分類的結果影響比較大,說明重要程度比較高。
8、RF特徵選擇
首先特徵選擇的目標有兩個:
1:找到與分類結果高度相關的特徵變量。
2:選擇出數目較少的特徵變量並且能夠充分的預測應變量的結果。
特徵選擇的步驟:
(1)對於每一棵決策樹,計算其oob error
(2)隨機的修改OOB中的每個特徵xi的值,計算oob error_2,再次計算重要性
(3)按照特徵的重要性排序,然後剔除後面不重要的特徵
(4)然後重複以上步驟,直到選出m個特徵。
6. 隨機森林的推廣
我認爲隨機森林的一種推廣方式包括了獨立森林IForest。
7. 優缺點
優點:
- 可以處理高維數據,不同進行特徵選擇(特徵子集是隨機選擇)
- 模型的泛化能力較強
- 訓練模型時速度快,成並行化方式,即樹之間相互獨立
- 模型可以處理不平衡數據,平衡誤差
- 最終訓練結果,可以對特種額排序,選擇比較重要的特徵
- 隨機森林有袋外數據(OOB),因此不需要單獨劃分交叉驗證集
- 對缺失值、異常值不敏感
- 模型訓練結果準確度高
- 相對Bagging能夠收斂於更小的泛化誤差
缺點:
- 當數據噪聲比較大時,會產生過擬合現象
- 對有不同取值的屬性的數據,取值劃分較多的屬性會對隨機森林產生更大的影響
- sklearn參數2
- 函數本身調用以及參數:
class sklearn.ensemble.RandomForestClassifier(n_estimators=10, crite-rion=’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, bootstrap=True,
oob_score=False, n_jobs=1, ran-dom_state=None, verbose=0,
warm_start=False, class_weight=None)
- 參數
其中關於決策樹的參數:
- criterion: ”gini” or “entropy”(default=”gini”)是計算屬性的gini(基尼不純度)還是entropy(信息增益),來選擇最合適的節點。
- splitter: ”best” or “random”(default=”best”)隨機選擇屬性還是選擇不純度最大的屬性,建議用默認。
- max_features: 選擇最適屬性時劃分的特徵不能超過此值。當爲整數時,即最大特徵數;當爲小數時,訓練集特徵數*小數;
- if “auto”, then max_features=sqrt(n_features).
- If “sqrt”, thenmax_features=sqrt(n_features).
- If “log2”, thenmax_features=log2(n_features).
- If None, then max_features=n_features.
- max_depth: (default=None)設置樹的最大深度,默認爲None,這樣建樹時,會使每一個葉節點只有一個類別,或是達到min_samples_split。
- min_samples_split:根據屬性劃分節點時,每個劃分最少的樣本數。
- min_samples_leaf:葉子節點最少的樣本數。
- max_leaf_nodes: (default=None)葉子樹的最大樣本數。
- min_weight_fraction_leaf: (default=0) 葉子節點所需要的最小權值
- verbose:(default=0) 是否顯示任務進程
關於隨機森林特有的參數:
- n_estimators=10:決策樹的個數,越多越好,但是性能就會越差,至少100左右(具體數字忘記從哪裏來的了)可以達到可接受的性能和誤差率。
- bootstrap=True:是否有放回的採樣。
- oob_score=False:oob(out of band,帶外)數據,即:在某次決策樹訓練中沒有被bootstrap選中的數據。多單個模型的參數訓練,我們知道可以用cross validation(cv)來進行,但是特別消耗時間,而且對於隨機森林這種情況也沒有大的必要,所以就用這個數據對決策樹模型進行驗證,算是一個簡單的交叉驗證。性能消耗小,但是效果不錯。
- n_jobs=1:並行job個數。這個在ensemble算法中非常重要,尤其是bagging(而非boosting,因爲boosting的每次迭代之間有影響,所以很難進行並行化),因爲可以並行從而提高性能。1=不併行;n:n個並行;-1:CPU有多少core,就啓動多少job
- warm_start=False:熱啓動,決定是否使用上次調用該類的結果然後增加新的。
- class_weight=None:各個label的權重。
9.應用場景
可以用來做分類,也可以做迴歸。
參考文獻(鏈接):
http://dataunion.org/20769.html
https://blog.csdn.net/u012102306/article/details/52228516
https://blog.csdn.net/weixin_38111819/article/details/79405984
https://blog.csdn.net/loveitlovelife/article/details/79398745?utm_source=blogxgwz9
https://blog.csdn.net/vfgbv/article/details/79403528