機器學習十大演算法---8. 隨機森林演算法
在學習隨機森林之前我們想你學習以下整合學習(ensemble)的內容。
--隨機森林簡介
隨機森林顧名思義,是用隨機的方式建立一個森林,森林裡面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類演算法),然後看看哪一類被選擇最多,就預測這個樣本為那一類。
在建立每一棵決策樹的過程中,有兩點需要注意 - 取樣與完全分裂。首先是兩個隨機取樣的過程,random forest對輸入的資料要進行行、列的取樣。對於行取樣,採用有放回的方式,也就是在取樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為N個,那麼取樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。然後進行列取樣,從M 個feature中,選擇m個(m << M)。之後就是對取樣之後的資料使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裡面的所有樣本的都是指向的同一 個分類。一般很多的決策樹演算法都一個重要的步驟 - 剪枝
按這種演算法得到的隨機森林中的每一棵都是很弱的,但是大家組合起來就很厲害了。我覺得可以這樣比喻隨機森林演算法:每一棵決策樹就是一個精通於某一個窄領域 的專家(因為我們從M個feature中選擇m讓每一棵決策樹進行學習),這樣在隨機森林中就有了很多個精通不同領域的專家,對一個新的問題(新的輸入數 據),可以用不同的角度去看待它,最終由各個專家,投票得到結果。
-- 隨機森林基本原理
隨機森林通過自助法(bootstrap)重取樣技術,從原始訓練樣本集N中有放回地重複隨機抽取k個樣本生成新的訓練樣本集合,然後根據自助樣本集生成k個分類樹組成隨機森林,新資料的分類結果按分類樹投票多少形成的分數而定。其實質是對決策樹演算法的一種改進,將多個決策樹合併在一起,每棵樹的建立依賴於一個獨立抽取的樣品,森林中的每棵樹具有相同的分佈,分類誤差取決於每一棵樹的分類能力和它們之間的相關性。特徵選擇採用隨機的方法去分裂每一個節點,然後比較不同情況下產生的誤差。能夠檢測到的內在估計誤差、分類能力和相關性決定選擇特徵的數目。單棵樹的分類能力可能很小,但在隨機產生大量的決策樹後,一個測試樣品可以通過每一棵樹的分類結果經統計後選擇最可能的分類。
--隨機森林有三個主要的超引數調整:
結點規模:隨機森林不像決策樹,每一棵樹葉結點所包含的觀察樣本數量可能十分少。該超引數的目標是生成樹的時候儘可能保持小偏差。
樹的數量:在實踐中選擇數百棵樹一般是比較好的選擇。
預測器取樣的數量:一般來說,如果我們一共有 D 個預測器,那麼我們可以在迴歸任務中使用 D/3 個預測器數作為取樣數,在分類任務中使用 D^(1/2) 個預測器作為抽樣。
--隨機森林的優點:
a. 在資料集上表現良好,兩個隨機性的引入,使得隨機森林不容易陷入過擬合
b. 在當前的很多資料集上,相對其他演算法有著很大的優勢,兩個隨機性的引入,使得隨機森林具有很好的抗噪聲能力
c. 它能夠處理很高維度(feature很多)的資料,並且不用做特徵選擇,對資料集的適應能力強:既能處理離散型資料,也能處理連續型資料,資料集無需規範化
d. 可生成一個Proximities=(pij)矩陣,用於度量樣本之間的相似性: pij=aij/N, aij表示樣本i和j出現在隨機森林中同一個葉子結點的次數,N隨機森林中樹的顆數
e. 在建立隨機森林的時候,對generlization error使用的是無偏估計
f. 訓練速度快,可以得到變數重要性排序(兩種:基於OOB誤分率的增加量和基於分裂時的GINI下降量
g. 在訓練過程中,能夠檢測到feature間的互相影響
h. 容易做成並行化方法
i. 實現比較簡單
--隨機森林的侷限性
當我們需要推斷超出範圍的獨立變數或非獨立變數,隨機森林做得並不好,我們最好使用如 MARS 那樣的演算法。
隨機森林演算法在訓練和預測時都比較慢。
如果需要區分的類別十分多,隨機森林的表現並不會很好。
-- 隨機森林應用範圍
隨機森林主要應用於迴歸和分類。本文主要探討基於隨機森林的分類問題。隨機森林和使用決策樹作為基本分類器的(bagging)有些類似。以決策樹為基本模型的bagging在每次bootstrap放回抽樣之後,產生一棵決策樹,抽多少樣本就生成多少棵樹,在生成這些樹的時候沒有進行更多的干預。而隨機森林也是進行bootstrap抽樣,但它與bagging的區別是:在生成每棵樹的時候,每個節點變數都僅僅在隨機選出的少數變數中產生。因此,不但樣本是隨機的,連每個節點變數(Features)的產生都是隨機的。
許多研究表明, 組合分類器比單一分類器的分類效果好,隨機森林(random forest)是一種利用多個分類樹對資料進行判別與分類的方法,它在對資料進行分類的同時,還可以給出各個變數(基因)的重要性評分,評估各個變數在分類中所起的作用。
-- 隨機森林模型的注意點
設有N個樣本,每個樣本有M個features,決策樹們其實都是隨機地接受n個樣本(對行隨機取樣)的m個feature(對列進行隨機取樣),每顆決策樹的m個feature相同。每顆決策樹其實都是對特定的資料進行學習歸納出分類方法,而隨機取樣可以保證有重複樣本被不同決策樹分類,這樣就可以對不同決策樹的分類能力做個評價。
---隨機森林實現過程
隨機森林中的每一棵分類樹為二叉樹,其生成遵循自頂向下的遞迴分裂原則,即從根節點開始依次對訓練集進行劃分;在二叉樹中,根節點包含全部訓練資料, 按照節點純度最小原則,分裂為左節點和右節點,它們分別包含訓練資料的一個子集,按照同樣的規則節點繼續分裂,直到滿足分支停止規則而停止生長。若節點n上的分類資料全部來自於同一類別,則此節點的純度I(n)=0,
純度度量方法是Gini準則,即假設P(Xj)是節點n上屬於Xj 類樣本個數佔訓練。
具體實現過程如下:
(1)原始訓練集為N,應用bootstrap法有放回地隨機抽取k個新的自助樣本集,並由此構建k棵分類樹,每次未被抽到的樣本組成了k個袋外資料;
(2)設有mall個變數,則在每一棵樹的每個節點處隨機抽取mtry個變數(mtry n mall),然後在mtry中選擇一個最具有分類能力的變數,變數分類的閾值通過檢查每一個分類點確定;
(3)每棵樹最大限度地生長, 不做任何修剪;
(4)將生成的多棵分類樹組成隨機森林,用隨機森林分類器對新的資料進行判別與分類,分類結果按樹分類器的投票多少而定。
程式碼練習:
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['is_train'] = np.random.uniform(0, 1, len(df)) <= .75
df['species'] = pd.Categorical(iris.target, iris.target_names)
df.head()
train, test = df[df['is_train']==True], df[df['is_train']==False]
features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['species'])
clf.fit(train[features], y)
preds = iris.target_names[clf.predict(test[features])]
pd.crosstab(test['species'], preds, rownames=['actual'], colnames=['preds'])
參考資料:
隨機森林案例實現:
http://www.cnblogs.com/zdz8207/p/DeepLearning-rfa-python.html
隨機森林原理:
https://www.cnblogs.com/maybe2030/p/4585705.html#_label6
http://blog.csdn.net/a819825294/article/details/51177435
http://backnode.github.io/pages/2015/04/23/random-forest.html