前言
信息是用來消除隨機不確定性的東西。 ------香農(nóng)
隨機森林的特點這里就不說了,它就相當(dāng)于機器學(xué)習(xí)領(lǐng)域的Leatherman(多面手),你幾乎可以把任何東西扔進去,它基本上都是可供使用的。在估計推斷映射方面特別好用,以致都不需要像SVM那樣做很多參數(shù)的調(diào)試。
而想要了解隨機森林,首先要了解決策樹:
1)信息、熵以及信息增益的概念
這三個基本概念是決策樹的根本,是決策樹利用特征來分類時,確定特征選取順序的依據(jù)。理解了它們,決策樹也就了解了大概。
假設(shè)我們有一個數(shù)據(jù)集 S,每個數(shù)據(jù)元素都標(biāo)明了所屬的類別,即元素屬于有限類別C 1 ,…, C n 中的一種。如果所有數(shù)據(jù)點都屬于同一類別,那么也就不存在不確定性了,這就屬于我們喜聞樂見的低熵情形。如果數(shù)據(jù)點均勻地分布在各個類別中,那么不確定性就較大,這時我們說具有較大的熵。從數(shù)學(xué)的角度來講,如果 p i 表示 c i 類別中的數(shù)據(jù)所占的比例,那么可以把熵定義為:
2)決策樹
決策樹是一種樹形結(jié)構(gòu),其中每個內(nèi)部節(jié)點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節(jié)點代表一種類別。常見的決策樹算法有C4.5、ID3和CART。
3)集成學(xué)習(xí)
集成學(xué)習(xí)通過建立幾個模型組合的來解決單一預(yù)測問題。它的工作原理是生成多個分類器/模型,各自獨立地學(xué)習(xí)和作出預(yù)測。這些預(yù)測最后結(jié)合成單預(yù)測,因此優(yōu)于任何一個單分類的做出預(yù)測。
隨機森林是集成學(xué)習(xí)的一個子類,它依靠于決策樹的投票選擇來決定最后的分類結(jié)果。
我們直接將其寫成函數(shù):
def entropy(class_probabilities):
return sum(-p * math.log(p, 2) for p in class_probabilities if p)
def partition_entropy(subsets):
total_count = sum(len(subset) for subset in subsets)
return sum( data_entropy(subset) * len(subset) / total_count
for subset in subsets )
def group_by(items, key_fn):
groups = defaultdict(list)
for item in items:
key = key_fn(item)
groups[key].append(item)
return groups
def partition_by(inputs, attribute):
return group_by(inputs, lambda x: x[0][attribute])
def partition_entropy_by(inputs,attribute):
partitions = partition_by(inputs, attribute)
return partition_entropy(partitions.values())
id3根據(jù)信息增益,運用自頂向下的貪心策略建立決策樹。信息增益用于度量某個屬性對樣本集合分類的好壞程度,下面給出代碼
def classify(tree, input):
if tree in [True, False]:
return tree
attribute, subtree_dict = tree
subtree_key = input.get(attribute)
if subtree_key not in subtree_dict:
subtree_key = None
subtree = subtree_dict[subtree_key]
return classify(subtree, input)
def build_tree_id3(inputs, split_candidates=None):
if split_candidates is None:
split_candidates = inputs[0][0].keys()
num_inputs = len(inputs)
num_trues = len([label for item, label in inputs if label])
num_falses = num_inputs - num_trues
if num_trues == 0:
return False
if num_falses == 0:
return True
if not split_candidates:
return num_trues >= num_falses
best_attribute = min(split_candidates,
key=partial(partition_entropy_by, inputs))
partitions = partition_by(inputs, best_attribute)
new_candidates = [a for a in split_candidates
if a != best_attribute]
subtrees = { attribute : build_tree_id3(subset, new_candidates)
for attribute, subset in partitions.iteritems()
}
subtrees[None] = num_trues > num_falses
return (best_attribute, subtrees)
到這里,我們的決策樹就構(gòu)建完成了,接下來我們看看隨機森林的構(gòu)建
隨機森林的生成
首先介紹Bootstraping,即自助法(bagging):它是一種隨機有放回的抽樣方法(可能抽到重復(fù)的樣本)。
從這里我們可以知道:每棵樹的訓(xùn)練集都是不同的,而且里面包含重復(fù)的訓(xùn)練樣本。
- Bagging是并行式集成學(xué)習(xí)代表方法。基于“自助采樣法”(bootstrap sampling)。自助采樣法機制:給定包含m個樣本的數(shù)據(jù)集,我們先隨機取出一個樣本放入采樣集中,再把該樣本放回初始數(shù)據(jù)集,使得下一次采樣時該樣本還會被采到。這樣,經(jīng)過m次樣本采集,我們得到包含m個樣本的采樣集。采樣集中,有的樣本出現(xiàn)過很多次,有的沒有出現(xiàn)過。Bagging機制:我們采樣出T個含m個樣本的采樣集。然后基于每個采樣集訓(xùn)練出一個學(xué)習(xí)器,再將學(xué)習(xí)器進行結(jié)合。對分類任務(wù)使用投票法,對回歸任務(wù)采用平均值法。
# 如果已經(jīng)存在了幾個足夠的劃分候選項, 就查看全部
if len(split_candidates) <= self.num_split_candidates:
sampled_split_candidates = split_candidates
# 否則選取一個隨機樣本
else:
sampled_split_candidates = random.sample(split_candidates,
self.num_split_candidates)
# 現(xiàn)在僅從這些候選項中選擇最佳屬性
best_attribute = min(sampled_split_candidates,
key=partial(partition_entropy_by, inputs))
partitions = partition_by(inputs, best_attribute
- Boosting是一族可以將若學(xué)習(xí)器提升為強學(xué)習(xí)器的算法,代表算法為AdaBoost。該算法的工作機制:先從初始訓(xùn)練集訓(xùn)練出一個基學(xué)習(xí)器,再根據(jù)基學(xué)習(xí)器的表現(xiàn)對訓(xùn)練樣本分布進行調(diào)整,使得先前基學(xué)習(xí)器做錯的訓(xùn)練樣本在后續(xù)受到更多關(guān)注,然后基于調(diào)整后的樣本分布來訓(xùn)練下一個基學(xué)習(xí)器。如此反復(fù)進行,直至學(xué)習(xí)器數(shù)目達到事先指定的值T,最終將這T個基學(xué)習(xí)器進行加權(quán)結(jié)合。Boosting我是參考的這個說實話,數(shù)學(xué)公式真的沒怎么看懂。
GBDT算法
GBDT是一個應(yīng)用很廣泛的算法,可以用來做分類、回歸。在很多的數(shù)據(jù)上都有不錯的效果。
而Gradient Boost與傳統(tǒng)的Boost的區(qū)別是,每一次的計算是為了減少上一次的殘差(residual),而為了消除殘差,我們可以在殘差減少的梯度(Gradient)方向上建立一個新的模型。所以說,在Gradient Boost中,每個新的模型的簡歷是為了使得之前模型的殘差往梯度方向減少,與傳統(tǒng)Boost對正確、錯誤的樣本進行加權(quán)有著很大的區(qū)別。
對于大量的數(shù)學(xué)推到,我是看不懂,推薦這個,講的算通俗易懂的。
根據(jù)實際測試(就是直接調(diào)用sklearn等庫對一些應(yīng)用其他回歸算法的數(shù)據(jù)應(yīng)用GBDT準(zhǔn)確性很高~這個真的算神器!)