來源 | AI小白入門
作者 | 文傑
編輯 | yuquanle
完整代碼見:原文鏈接
本文介紹了結合集成學習思想的隨機森林算法。首先介紹了集成學習中兩種經典的集成思想Bagging和Boosting。然後介紹了Bagging的兩個關鍵點:1)樣本有放回隨機採樣,2)特徵隨機選擇。最後介紹了Bagging的代表學習算法隨機森林,從方差和偏差的角度分析了Bagging爲什麼能集成以及隨機森林爲什麼能防止過擬合。
集成學習
集成學習通過構建多個學習器採用加權的方式來完成學習任務,類似於”三個臭皮匠頂個諸葛亮”的思想。當然多個學習器之間需要滿足一定的條件,一般來講,多個學習器同屬於一種模型,比如決策樹,線性模型,而不會交叉用多種模型。
爲了保證集成學習的有效性,多個弱分類器之間應該滿足兩個條件:
-
準確性:個體學習器要有一定的準確性,這樣纔能有好的效果。
-
多樣性:學習器之間要有一些差異,因爲完全相同的幾個學習器集成起來後幾乎不會有提升。
目前,集成學習主要分爲Bagging和Boosting兩種方式,前者通過Booststrap Aggregation的重採樣得到多組訓練集,並行的訓練基學習器。而後者是一種提升的思想,基學習器是串行執行的,下一個學習器會基於上一個學習的經驗進行調整,學習器前後有依賴關係,多個學習器最終組合得到強學習器。
隨機森林
隨機森林是集成學習中Bagging方式的代表,其相對於決策樹而已,有一個很重要的優點:防止過擬合。
隨機森林主要通過以下兩點來防止過擬合,這與深度學習中的Dropout(隨機的丟失一些樣本和特徵)技術非常相似:
-
樣本選擇隨機:Bootstrap Sampling
-
特徵選擇隨機:基學習器決策樹的特徵選擇
Bootstrap Sampling
Bootstrap Sampling是一種統計學上的抽樣方法,該方法是這樣執行的:對於有個樣本的數據集,進行次有放回採樣得到數據集 ,這樣與的大小一致。有放回採樣使得中有的樣本重複出現,有的樣本則沒有出現,簡單估計一下,某個樣本在次採樣中始終沒被採到的概率爲,取極限:
即中的樣本大概有%機率出現在中,採樣出個Bootstrap 樣本集 ,對這個樣本集分別訓練一個基學習器 ,結合這些基學習器共同作出決策。
決策時,在分類任務中通常採用投票法,若兩個類別票數一樣,最簡單的做法是隨機選擇一個;而迴歸任務則一般使用平均法。整個流程如下所示:
基學習器
早期的Bagging方法是每個基學習器都是一個決策樹,完全按照決策樹的規則建樹。
隨機森林則在Bagging的基礎繼續採用特徵隨機,每個基學習器只對在個特徵構成的子集下進行建樹,一般取。這樣構建的決策樹相對於完整的決策樹是一個“淺決策樹”,這樣就構成了特徵的隨機性。
隨機森林過程
- 假設我們設定訓練集中的樣本個數爲,然後通過Bootstrap Sampling來獲得個有重複的樣本集;
- 針對每個樣本集獨立訓練,對於有個特徵的數據集,隨機選擇(k<d)個特徵構成特徵選擇集。然後在樣本集,特徵集上構建決策樹。值是保持不變的, 隨機選取特徵增加樹的獨立性,每棵決策樹都最大可能地進行生長而不進行剪枝;
- 通過對所有的決策樹進行加權來預測新的數據(在分類時採用多數投票,在迴歸時採用平均)。
到此,隨機森林基本介紹完,但是依然存在問題,隨機森林爲什麼能防止過擬合,隨機森林適合什麼樣的場景?
Bias and Variance
從Bias和Variance的角度分析,Bagging對樣本的重採樣得到個訓練集,對於每個訓練集訓練一個基學習器,因爲基學習器相同,因此各個學習器有近似的Bais和Variance(學習器並不一定獨立)。
假設每個學習器的權重相同即。每個學習器的損失用表示,那麼隨機森林的損失可表示爲:
所以Bagging後的Bias和單個基學習器的接近,並不能顯著降低bias。若各基學習器獨立,因爲每個學習器的權重是,所以引入的方差爲,那麼隨機森林的Variance可表示爲:
可以看出,Bagging通過降低Variance來防止過擬合,嚴格來說每個學習器之間不嚴格獨立,所以Variance的降低會小於B倍。
隨機森林優缺點
優點:
- 正如上文所述,隨機森林在解決分類與迴歸兩種類型的問題有很大的優勢;
- 隨機森林抗過擬合能力比較強;
- 隨機森林能處理很高維度的數據(也就是很多特徵的數據),並且不用做特徵選擇,因爲建樹時會隨機選擇一些特徵作爲待選特徵子集 ;
- 訓練速度快,容易做成並行化方法(訓練時,樹與樹之間是相互獨立的) ;
- 隨機森林可以做類似於GBDT那樣的特徵組合;
- 在對缺失數據進行估計時,由於隨機丟失特徵,隨機森林依然十分有效;
- 當存在分類不平衡的情況時,隨機森林能夠提供平衡數據集誤差的有效方法,比如對於 10:1 的數據,將多數數據分爲 10份,做 10個 1:1 的單模型然後 Bagging 起來即可。
缺點:
- 隨機森林在解決迴歸問題時,並沒有像它在分類中表現的那麼好。因爲它並不能給出一個連續的輸出。當進行迴歸時,隨機森林不能夠做出超越訓練集數據範圍的預測,這可能導致在某些特定噪聲的數據進行建模時出現過度擬合。(PS:隨機森林已經被證明在某些噪音較大的分類或者回歸問題上會過擬合)。
- 對於許多統計建模者來說,隨機森林給人的感覺就像一個黑盒子,你無法控制模型內部的運行。只能在不同的參數和隨機種子之間進行嘗試。
- 可能有很多相似的決策樹,掩蓋了真實的結果。
- 對於小數據或者低維數據(特徵較少的數據),可能不能產生很好的分類。(處理高維數據,處理特徵遺失數據,處理不平衡數據是隨機森林的長處)。
代碼實戰
int createBinTree(bitree_R &t,const Data &data, const int &deep, const int &epsilon)
{
if(!(t=(bitnode_R *)malloc(sizeof(bitnode_R)))) exit(-1);
split_R sp=chooseBestSplit(data,deep,epsilon,10);
cout<<"index="<<sp.bestIndex<<endl;
t->feature=sp.bestIndex;
t->meanValue=sp.value;
//t->data=data;
if(t->feature==-1)
{
t->left=NULL;
t->right=NULL;
//t->data=data;
cout<<"feat-1"<<endl;
return 0;
}
else
{
cout<<"feature="<<t->feature<<" value="<<t->meanValue<<endl;
twoSubData_R twosubdata=binSplitDataSet(data,sp.bestIndex,sp.value);
createBinTree((t->left),twosubdata.left,deep,epsilon);
createBinTree((t->right),twosubdata.right,deep,epsilon);
}
return 0;
}
更多AI、NLP乾貨資源請關注公衆號:AI小白入門(ID: StudyForAI):