探索的終點將是開始時的起點。 –艾略特
文章內容目錄:
- 一、隨機森林算法簡介
- 隨機森林算法背景
- 隨機森林算法思想
- 隨機森林算法的特點
- 隨機森林算法的應用
- 二、隨機森林的相關知識
- 信息、熵以及信息增益的概念
- 決策樹
- 集成學習
- 三、隨機森林Python實現
- 四、參考內容
一、隨機森林的那些事兒~
1、背景
Leo Breiman和Adele Cutler發展出推論出隨機森林的算法。 而 "Random Forests" 是他們的商標。
這個術語是1995年由貝爾實驗室的Tin Kam Ho所提出的隨機決策森林(random decision forests)而來的。
這個方法則是結合 Breimans 的 "Bootstrap aggregating" 想法和 Ho 的"random subspace method"" 以建造決策樹的集合。
上世紀八十年代Breiman等人發明分類樹的算法(Breiman et al. 1984),通過反覆二分數據進行分類或迴歸,計算量大大降低。2001年Breiman把分類樹組合成隨機森林(Breiman 2001a),即在變量(列)的使用和數據(行)的使用上進行隨機化,生成很多分類樹,再彙總分類樹的結果。隨機森林在運算量沒有顯著提高的前提下提高了預測精度。隨機森林對多元公線性不敏感,結果對缺失數據和非平衡的數據比較穩健,可以很好地預測多達幾千個解釋變量的作用(Breiman 2001b),被譽爲當前最好的算法之一(Iverson et al. 2008)。
2、思想
隨機森林系列算法爲集成學習同質個體學習器間不存在強依賴關係(即一系列個體學習器可以並行生成)的代表算法
同質個體學習器:所有的個體學習器是一個種類的,比如都是決策樹個體學習器,都是神經網絡個體學習器
隨機森林,見名思意,很多樹用隨機方式組成一個森林。成百上千顆樹也就構成了森林,這也是隨機森林的主要思想–集成思想的體現。{集成學習思想:對於訓練集數據,通過訓練若干個個體學習器,通過一定的結合策略,形成一個強學習器。}
其中,隨機採用,隨機且又放回;森林中的很多樹爲決策樹
每棵決策樹都是一個分類器(分類問題),對於一個輸入樣本,N棵樹分別進行判斷,會有N個分類結果。隨機森林集成了所有的分類投票結果,將投票次數最多的類別爲預測結果,這就是一種最簡單的 Bagging 思想。
3、隨機森林算法特點
- a. 極好的準確率
- b. 很好的應用於大數據集
- c. 具有很好的抗噪聲能力
- d.對數據集的適應能力強:既能處理離散型數據,也能處理連續型數據
- e. 能夠處理很高維度(feature很多)的數據,並且不用做特徵選擇
- f. 在創建隨機森林時,對內部生成誤差是一種無偏估計
- g. 在訓練過程中,能夠檢測到feature間的互相影響
- h. 對於缺省值問題也能夠獲得很好得結果
- i. ……
4、實際應用
美國政府用隨機森林算法 預測 恐怖分子
相同思路可以預測歹徒、不法分子等(畢竟人命,正確率再高也有一定風險);
常用於,預測疾病的風險和病患者的易感性;
市場營銷中,用於市場營銷模擬的建模,統計客戶來源,保留和流失;等。
二、隨機森林的相關知識
隨機森林看起來是很好理解,但是要完全搞明白它的工作原理,需要很多機器學習方面相關的基礎知識。在本文中,我們簡單談一下,而不逐一進行贅述,如果有同學不太瞭解相關的知識,可以參閱其他博友的一些相關博文或者文獻。
1、信息、熵以及信息增益的概念
這三個基本概念是決策樹的根本,是決策樹利用特徵來分類時,確定特徵選取順序的依據。理解了它們,決策樹你也就瞭解了大概。
引用香農的話來說,信息是用來消除隨機不確定性的東西。當然這句話雖然經典,但是還是很難去搞明白這種東西到底是個什麼樣,可能在不同的地方來說,指的東西又不一樣。對於機器學習中的決策樹而言,如果帶分類的事物集合可以劃分爲多個類別當中,則某個類(xi)的信息可以定義如下:
I(x)用來表示隨機變量的信息,p(xi)指是當xi發生時的概率。
熵是用來度量不確定性的,當熵越大,X=xi的不確定性越大,反之越小。對於機器學習中的分類問題而言,熵越大即這個類別的不確定性更大,反之越小。
信息增益在決策樹算法中是用來選擇特徵的指標,信息增益越大,則這個特徵的選擇性越好。
這方面的內容不再細述,感興趣的同學可以看 信息&熵&信息增益 這篇博文。
2、決策樹
決策樹是一種樹形結構,其中每個內部節點表示一個屬性上的測試,每個分支代表一個測試輸出,每個葉節點代表一種類別。常見的決策樹算法有C4.5、ID3和CART。
3、集成學習
集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最後結合成單預測,因此優於任何一個單分類的做出預測。
隨機森林是集成學習的一個子類,它依靠於決策樹的投票選擇來決定最後的分類結果。你可以在這找到用python實現集成學習的文檔:Scikit。
附:集成學習框架
三、隨機森林Python實現
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import pandas as pd
import numpy as np
'''
鳶尾花數據集及元數據,
data:150個 元素,每個元素四個數值;
target:花卉類別,
0:Setosa 1:Versicolour 2:Virginica
'''
iris = load_iris() #加載鳶尾花全部數據
df = pd.DataFrame(iris.data, columns=iris.feature_names) #轉換類型
df['data_train'] = np.random.uniform(0, 1, len(df)) <= .75 #產生150個[0,1)的數,並與0.75做判斷
df['data_class'] = pd.Categorical.from_codes(iris.target, iris.target_names) #種類
head = df.head() #前五行
print(head) #輸出看看效果
train, test = df[df['data_train']==True], df[df['data_train']==False] #train is true;test is flase
features = df.columns[:4]
clf = RandomForestClassifier(n_jobs=2)
y, _ = pd.factorize(train['data_class'])
clf = clf.fit(train[features], y)
preds = iris.target_names[clf.predict(test[features])]
pre = clf.predict(test[features])
cross = pd.crosstab(test['data_class'], preds, rownames=['actual'], colnames=['preds'])
print(cross)
數據head:
sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
data_train data_class
0 True setosa
1 True setosa
2 True setosa
3 True setosa
4 True setosa
結果:
preds setosa versicolor virginica
actual
setosa 13 0 0
versicolor 0 16 1
virginica 0 0 11