机器学习算法 - 随机森林之决策树初探(1)
隨機森林是基于集體智慧的一個機器學習算法,也是目前最好的機器學習算法之一。
隨機森林實際是一堆決策樹的組合(正如其名,樹多了就是森林了)。在用于分類一個新變量時,相關的檢測數據提交給構建好的每個分類樹。每個樹給出一個分類結果,最終選擇被最多的分類樹支持的分類結果。回歸則是不同樹預測出的值的均值。
要理解隨機森林,我們先學習下決策樹。
決策樹 - 把你做選擇的過程呈現出來
決策樹是一個很直觀的跟我們日常做選擇的思維方式很相近的一個算法。
如果有一個數據集如下:
data <- data.frame(x=c(0,0.5,1.1,1.8,1.9,2,2.5,3,3.6,3.7), color=c(rep('blue',5),rep('green',5))) data## x color ## 1 0.0 blue ## 2 0.5 blue ## 3 1.1 blue ## 4 1.8 blue ## 5 1.9 blue ## 6 2.0 green ## 7 2.5 green ## 8 3.0 green ## 9 3.6 green ## 10 3.7 green那么假如加入一個新的點,其x值為1,那么該點對應的最可能的顏色是什么?
根據上面的數據找規律,如果x<2.0則對應的點顏色為blue,如果x>=2.0則對應的點顏色為green。這就構成了一個只有一個決策節點的簡單決策樹。
決策樹常用來回答這樣的問題:給定一個帶標簽的數據集(標簽這里對應我們的color列),怎么來對新加入的數據集進行分類?
如果數據集再復雜一些,如下,
data <- data.frame(x=c(0,0.5,1.1,1.8,1.9,2,2.5,3,3.6,3.7),y=c(1,0.5,1.5,2.1,2.8,2,2.2,3,3.3,3.5),color=c(rep('blue',3),rep('red',2),rep('green',5)))data## x y color ## 1 0.0 1.0 blue ## 2 0.5 0.5 blue ## 3 1.1 1.5 blue ## 4 1.8 2.1 red ## 5 1.9 2.8 red ## 6 2.0 2.0 green ## 7 2.5 2.2 green ## 8 3.0 3.0 green ## 9 3.6 3.3 green ## 10 3.7 3.5 green如果x>=2.0則對應的點顏色為green。
如果x<2.0則對應的點顏色可能為blue,也可能為red。
這時就需要再加一個新的決策節點,利用變量y的信息。
這就是決策樹,也是我們日常推理問題的一般方式。
訓練決策樹 - 確定決策樹的根節點
第一個任務是確定決策樹的根節點:選擇哪個變量和對應閾值選擇多少能給數據做出最好的區分。
比如上面的例子,我們可以先處理變量x,選擇閾值為2 (為什么選2,是不是有比2更合適閾值,我們后續再說),則可獲得如下分類:
我們也可以先處理變量y,選擇閾值為2,則可獲得如下分類:
那實際需要選擇哪個呢?
實際我們是希望每個選擇的變量和閾值能把不同的類分的越開越好;上面選擇變量x分組時,Green完全分成一組;下面選擇y分組時,Blue完全分成一組。怎么評價呢?
這時就需要一個評價指標,常用的指標有Gini inpurity和Information gain。
Gini Impurity
在數據集中隨機選擇一個數據點,并隨機分配給它一個數據集中存在的標簽,分配錯誤的概率即為Gini impurity。
我們先看第一套數據集,10個數據點,5個blue,5個green。從中隨機選一個數據點,再隨機選一個分類標簽作為這個數據點的標簽,分類錯誤的概率是多少?如下表,錯誤概率為0.25+0.25=0.5(看下面的計算過程)。
probility <- data.frame(Event=c("Pick Blue, Classify Blue","Pick Blue, Classify Green","Pick Green, Classify Blue","Pick Green, Classify Green"), Probability=c(5/10 * 5/10, 5/10 * 5/10, 5/10 * 5/10, 5/10 * 5/10),Type=c("Blue" == "Blue","Blue" == "Green","Green" == "Blue","Green" == "Green")) probility## Event Probability Type ## 1 Pick Blue, Classify Blue 0.25 TRUE ## 2 Pick Blue, Classify Green 0.25 FALSE ## 3 Pick Green, Classify Blue 0.25 FALSE ## 4 Pick Green, Classify Green 0.25 TRUE我們再看第二套數據集,10個數據點,2個red,3個blue,5個green。從中隨機選一個數據點,再隨機選一個分類標簽作為這個數據點的標簽,分類錯誤的概率是多少?0.62。
probility <- data.frame(Event=c("Pick Blue, Classify Blue","Pick Blue, Classify Green","Pick Blue, Classify Red","Pick Green, Classify Blue","Pick Green, Classify Green","Pick Green, Classify Red","Pick Red, Classify Blue","Pick Red, Classify Green","Pick Red, Classify Red"),Probability=c(3/10 * 3/10, 3/10 * 5/10, 3/10 * 2/10, 5/10 * 3/10, 5/10 * 5/10, 5/10 * 2/10,2/10 * 3/10, 2/10 * 5/10, 2/10 * 2/10),Type=c("Blue" == "Blue","Blue" == "Green","Blue" == "Red","Green" == "Blue","Green" == "Green","Green" == "Red","Red" == "Blue","Red" == "Green","Red" == "Red")) probility## Event Probability Type ## 1 Pick Blue, Classify Blue 0.09 TRUE ## 2 Pick Blue, Classify Green 0.15 FALSE ## 3 Pick Blue, Classify Red 0.06 FALSE ## 4 Pick Green, Classify Blue 0.15 FALSE ## 5 Pick Green, Classify Green 0.25 TRUE ## 6 Pick Green, Classify Red 0.10 FALSE ## 7 Pick Red, Classify Blue 0.06 FALSE ## 8 Pick Red, Classify Green 0.10 FALSE ## 9 Pick Red, Classify Red 0.04 TRUEWrong_probability = sum(probility[!probility$Type,"Probability"]) Wrong_probability## [1] 0.62Gini Impurity計算公式:
假如我們的數據點共有C個類,p(i)是從中隨機拿到一個類為i的數據,Gini Impurity計算公式為:
$$ G = \sum_{i=1}^{C} p(i)*(1-p(i)) $$?
對第一套數據集,10個數據點,5個blue,5個green。從中隨機選一個數據點,再隨機選一個分類標簽作為這個數據點的標簽,分類錯誤的概率是多少?錯誤概率為0.25+0.25=0.5。
對第二套數據集,10個數據點,2個red,3個blue,5個green。
從中隨機選一個數據點,再隨機選一個分類標簽作為這個數據點的標簽,分類錯誤的概率是多少?0.62。
決策樹分類后的Gini Impurity
對第一套數據集來講,按照x<2分成兩個分支,各個分支都只包含一個分類數據,各自的Gini IMpurity值為0。
這是一個完美的決策樹,把Gini Impurity為0.5的數據集分類為2個Gini Impurity為0的數據集。Gini Impurity==?0是能獲得的最好的分類結果。
第二套數據集,我們有兩種確定根節點的方式,哪一個更優呢?
我們可以先處理變量x,選擇閾值為2,則可獲得如下分類:
每個分支的Gini Impurity可以如下計算:
當前決策的Gini impurity需要對各個分支包含的數據點的比例進行加權,即
我們也可以先處理變量y,選擇閾值為2,則可獲得如下分類:
每個分支的Gini Impurity可以如下計算:
當前決策的Gini impurity需要對各個分支包含的數據點的比例進行加權,即
兩個數值比較0.24<0.29,選擇x作為第一個分類節點是我們第二套數據第一步決策樹的最佳選擇。
前面手算單個變量、單個分組不算麻煩,也是個學習的過程。后續如果有更多變量和閾值時,再手算就不合適了。下一篇我們通過暴力方式自寫函數訓練決策樹。
當前計算的結果,可以作為正對照,確定后續函數結果的準確性。(NBT:你想成為計算生物學家?)
參考:
https://victorzhou.com/blog/intro-to-random-forests/
https://victorzhou.com/blog/gini-impurity/
https://stats.stackexchange.com/questions/192310/is-random-forest-suitable-for-very-small-data-sets
https://towardsdatascience.com/understanding-random-forest-58381e0602d2
https://www.stat.berkeley.edu/~breiman/RandomForests/reg_philosophy.html
https://medium.com/@williamkoehrsen/random-forest-simple-explanation-377895a60d2d
往期精品(點擊圖片直達文字對應教程)
后臺回復“生信寶典福利第一波”或點擊閱讀原文獲取教程合集
?
(請備注姓名-學校/企業-職務等)
總結
以上是生活随笔為你收集整理的机器学习算法 - 随机森林之决策树初探(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: R统计绘图 - 热图简化
- 下一篇: 50T内存?百万机时?头一次见这么耗费内