隨機森林和GBDT算法的基礎是決策樹
而建立決策樹的算法由很多,ID3,C4.5,CART等,
- ID3:
ID3算法的基本流程是:首先找出最有判別力的屬性,把樣例分成多個子集,每個子集又選擇最有判別力的屬性進行劃分,一直進行到所有子集僅包含同一類型的數據為止。最后得到一棵決策樹。
而這個最有判別力的就是信息增益,我們用熵(entropy)這個概念來表示數據的不確定性
其中P(Ui)即是P(ui)是類別i出現概率,而計算整個屬性的信息增益則是:
具體表示為代碼:
''' 數據是一組特征值加一個lable'''
def entropy(class_probabilities):
return sum(-p * math.log(p, 2)
for p in class_probabilities
if p)
def class_probabilities(labels):
total_count = len(labels)
return [count / total_count
for count in Counter(labels).values()
]
def data_entropy(labeled_data):
labels = [label for _, label in labeled_data]
probabilities = class_probabilities(labels)
return entropy(probabilities)
def partition_entropy(subsets):
"""find the entropy from this partition of data into subsets"""
total_count = sum(len(subset) for subset in subsets)
return sum( data_entropy(subset) * len(subset) / total_count
for subset in subsets )
然后根據取數據的信息增益最大的作為數的root節點,將其他屬性進行分支,若該分支中存在不同lable,則遞歸計算最大信息增益。
c4.5是ID3的一種改進,既能處理標稱型數據,又能連續型數據。為了處理連續型數據,該算法在相應的節點使用一個屬性的閾值,利用閾值將樣本劃分成兩部分,還有就是可以處理缺失某屬性的數據,屬性值缺失的樣本在計算熵增益時被忽略。再就是分類完成后進行剪枝。
不同于c4.5和ID3:
- CART本質是對特征空間進行二元劃分
- 剪枝:在CART過程中第二個關鍵的思想是用獨立的驗證數據集對訓練集生長的樹進行剪枝。
隨機森林
隨機森林是一種統計學習理論,其隨機有兩個方面:首先在訓練的每一輪中,都是對原始樣本集有放回的抽取固定數目的樣本點,形成k 個互不相同的樣本集。第二個點是:對于每一個決策樹的建立是從總的屬性中隨機抽取一定量的屬性作為分裂屬性集,這樣對于k個樹分類器均是不相同的。由隨機生成的k個決策樹組成了隨機森林。
對于每一個決策樹來說,其分裂屬性是不斷地選取具有最大信息增益的屬性進行排列。整個隨機森林建立后,最終的分類標準采用投票機制得到可能性最高的結果。
隨機森林是一個最近比較火的算法,它有很多的優點
- 在數據集上表現良好
- 在當前的很多數據集上,相對其他算法有著很大的優勢
- 它能夠處理很高維度(feature很多)的數據,并且不用做特征選擇
- 在訓練完后,它能夠給出哪些feature比較重要
- 在創建隨機森林的時候,對generlization error使用的是無偏估計
- 訓練速度快
- 在訓練過程中,能夠檢測到feature間的互相影響
- 容易做成并行化方法
我們采用sklearn的RandomForestClassifier實際例子在我的上一篇文章中
在建立每一棵決策樹的過程中,有兩點需要注意 - 采樣與完全分裂。首先是兩個隨機采樣的過程,random forest對輸入的數據要進行行、列的采樣。對于行采樣,采用有放回的方式,也就是在采樣得到的樣本集合中,可能有重復的樣本。假設輸入樣本為N個,那么采樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。然后進行列采樣,從M個feature中,選擇m個(m << M)。之后就是對采樣之后的數據使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要么是無法繼續分裂的,要么里面的所有樣本的都是指向的同一個分類。一般很多的決策樹算法都一個重要的步驟 - 剪枝,但是這里不這樣干,由于之前的兩個隨機采樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。
按這種算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻隨機森林算法:每一棵決策樹就是一個精通于某一個窄領域的專家(因為我們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入數據),可以用不同的角度去看待它,最終由各個專家,投票(vote)得到結果。
需要注意的是,隨機森林中的單個決策樹是沒有意義的。
GBDT
GBRT(Gradient Boost Regression Tree)是一個應用很廣泛的算法,可以用來做分類、回歸。在很多的數據上都有不錯的效果。我們下次接著共同學習。