隨機森林是一個高度靈活的機器學習方法,擁有廣泛的應用前景,從市場營銷到醫療保健保險。 既可以用來做市場營銷模擬的建模,統計客戶來源,保留和流失。也可用來預測疾病的風險和病患者的易感性。
隨機森林是一個可做能夠回歸和分類。 它具備處理大數據的特性,而且它有助於估計或變量是非常重要的基礎數據建模。
這是一篇關於使用Python來實現隨機森林文章。
什么是隨機森林?
隨機 森林 是 幾乎 任何 預測 問題 (甚至 非直線 部分) 的固有 選擇 。 它是 一個 相對較 新 的 機器 學習 的 策略 ( 在90 年代產生於 貝爾 實驗室 ) 和 它 可以 幾乎用於 任何方面 。 它 屬於 機器 學習 算法 一大類----- 集成學習 方法 。
集成學習
集成學習通過建立幾個模型組合的來解決單一預測問題。它的工作原理是生成多個分類器/模型,各自獨立地學習和作出預測。這些預測最后結合成單預測,因此優於任何一個單分類的做出預測。
隨機森林是集成學習的一個子類,由於它依靠於策率樹的合並。你可以在這找到用python實現集成學習的文檔:Scikit 學習文檔。
隨機決策樹
我們 知道 隨機 森林 是 其他 的模型 聚合, 但 它 聚合 了什么 類型 模型 ? 你 可能 已經 從 其 名稱 、 隨機 森林 聚合 分類(或 回歸) 的 樹 中猜到。 決策 樹 是 由 一 系列 的 決策的組合, 可 用於 分類 觀察 數據集 。
隨機森林
算法引入了一個隨機森林來 自動 創建 隨機 決策 樹 群 。 由於 樹 隨機 生成 的樹, 大部分的樹(或許 99.9%樹) 不 會 對 學習 的 分類/回歸 問題 都 有意義 。
如果 觀察到 長度 為 45 ,藍 眼睛 , 和 2 條腿 , 就 被 歸類 為 紅色 。
樹的投票
所以10000個(概率上)糟糕的模型有TMD什么好的?好吧,這樣確實沒什么特別的好處。但是隨着很多糟糕的決策樹被生成,其中也會有很少確實很優秀的決策樹。
當你要做預測的時候,新的觀察到的特征隨着決策樹自上而下走下來,這樣一組觀察到的特征將會被貼上一個預測值/標簽。一旦森林中的每棵樹都給出了預測值/標簽,所有的預測結果將被歸總到一起,所有樹的模式投票被返回做為最終的預測結果。
簡單來說,99.9%不相關的樹做出的預測結果涵蓋所有的情況,這些預測結果將會彼此抵消。少數優秀的樹的預測結果將會超脫於芸芸“噪音”,做出一個好的預測。
為什么你讓我用它?
簡單
隨機森林就是學習方法中的Leatherman呀。你幾乎可以把任何東西扔進去,它基本上都是可供使用的。在估計推斷映射方面特別好用,以致都不需要像SVM那樣做很多調試(也就是說對於那些最后期限很緊的家伙們真是太棒了)。
[譯者注:Leatherman就是那家生產多功能折疊刀的公司,類似瑞士軍刀]
一個映射的例子
隨機森林在沒有精心准備的數據映射的情況下也能學習。以方程f(x) = log(x)為例。
制造一些假數據,並且加上一點兒噪音。
import numpy as np x = np.random.uniform(1, 100, 1000) y = np.log(x) + np.random.normal(0, .3, 1000)
如果 我們 建立了 一個 基本 的 線性 模型 通過使用 x 來預測y, 我們需要 作 一 條 直線 , 算是 平分 log (x) 函數。 而 如果 我們 使用 一個 隨機 的 森林 , 它 不會 更 好 的 逼近 log (x) 曲線 並能夠使得它更像實際函數。
你 也許會說 隨機 森林 有點 擾亂了 log(x) 函數 。 不管怎樣 , 我 都認為 這 做了一個 很 好 的 說明 如何 隨機 森林 並 未綁定於 線性 約束 。
使用
變量選擇
隨機森林最好的用例之一是特征選擇。嘗試很多決策樹變種的一個副產品就是你可以檢測每棵樹中哪個變量最合適/最糟糕。
當一棵樹使用一個變量,而另一棵不使用這個變量,你就可以從是否包含這個變量來比較價值的減少或增加。優秀的隨機森林實現將為你做這些事情,所以你需要做的僅僅是知道去看那個方法或參數。
在下述的例子中,我們嘗試去指出對於將酒分為紅酒或者白酒哪個變量是最重要的。
分類
隨機森林也很善於分類。它可以被用於為多個可能目標類別做預測,它也可以被校正輸出概率。你需要注意的一件事情是過擬合。隨機森林容易產生過擬合,特別是在數據集相對小的時候。當你的模型對於測試集合做出“太好”的預測的時候就應該懷疑一下了。
產生過擬合的一個原因是在模型中只使用相關特征。然而只使用相關特征並不總是事先准備好的,使用特征選擇(就像前面提到的)可以使其更簡單。
回歸
是的,它也可以做回歸。
我們已經發現隨機森林——不像其它算法——對分類變量或者分類變量和真實變量混合學習的非常好。具有高基數(可能值的#)的分類變量是很棘手的,所以在你的口袋中放點兒這樣的東西將會是非常有用的。
一個簡短的python例子
Scikit-Learn是開始使用隨機森林的一個很好的方式。scikit-learn API在所以算法中極其的一致,所有你測試和在不同的模型間切換非常容易。很多時候,我從一些簡單的東西開始,然后轉移到了隨機森林。
隨機森林在scikit-learn中的實現最棒的特性是n_jobs參數。這將會基於你想使用的核數自動地並行設置隨機森林。這里是scikit-learn的貢獻者Olivier Grisel的一個很棒的報告,在這個報告中他談論了使用20個節點的EC2集群訓練隨機森林。
01 |
from sklearn.datasets import load_iris |
02 |
from sklearn.ensemble import RandomForestClassifier |
03 |
import pandas as pd |
04 |
import numpy as np |
05 |
|
06 |
iris = load_iris() |
07 |
df = pd.DataFrame(iris.data, columns = iris.feature_names) |
08 |
df[ 'is_train' ] = np.random.uniform( 0 , 1 , len (df)) < = . 75 |
09 |
df[ 'species' ] = pd.Factor(iris.target, iris.target_names) |
10 |
df.head() |
11 |
|
12 |
train, test = df[df[ 'is_train' ] = = True ], df[df[ 'is_train' ] = = False ] |
13 |
|
14 |
features = df.columns[: 4 ] |
15 |
clf = RandomForestClassifier(n_jobs = 2 ) |
16 |
y, _ = pd.factorize(train[ 'species' ]) |
17 |
clf.fit(train[features], y) |
18 |
|
19 |
preds = iris.target_names[clf.predict(test[features])] |
20 |
pd.crosstab(test[ 'species' ], preds, rownames = [ 'actual' ], colnames = [ 'preds' ]) |
看起來很不錯!
結語
隨機森林相當容易使用,而且很強大。對於任何建模,都要注意過擬合。如果你有興趣用R語言開始使用隨機森林,那么就簽出randomForest包。