隨機森林是一個高度靈活的機器學習方法,擁有普遍的應用前景,從市場營銷到醫療保健保險。 既能夠用來作市場營銷模擬的建模,統計客戶來源,保留和流失。也可用來預測疾病的風險和病患者的易感性。
隨機森林是一個可作可以迴歸和分類。 它具有處理大數據的特性,並且它有助於估計或變量是很是重要的基礎數據建模。
這是一篇關於使用Python來實現隨機森林文章。 html
隨機 森林 是 幾乎 任何 預測 問題 (甚至 非直線 部分) 的固有 選擇 。 它是 一個 相對較 新 的 機器 學習 的 策略 ( 在90 年代產生於 貝爾 實驗室 ) 和 它 能夠 幾乎用於 任何方面 。 它 屬於 機器 學習 算法 一大類----- 集成學習 方法 。 python
集成學習經過創建幾個模型組合的來解決單一預測問題。它的工做原理是生成多個分類器/模型,各自獨立地學習和做出預測。這些預測最後結合成單預測,所以優於任何一個單分類的作出預測。 git
隨機森林是集成學習的一個子類,因爲它依靠於策率樹的合併。你能夠在這找到用python實現集成學習的文檔:Scikit 學習文檔。 github
咱們 知道 隨機 森林 是 其餘 的模型 聚合, 但 它 聚合 了什麼 類型 模型 ? 你 可能 已經 從 其 名稱 、 隨機 森林 聚合 分類(或 迴歸) 的 樹 中猜到。 決策 樹 是 由 一 系列 的 決策的組合, 可 用於 分類 觀察 數據集 。 web
算法引入了一個隨機森林來 自動 建立 隨機 決策 樹 羣 。 因爲 樹 隨機 生成 的樹, 大部分的樹(或許 99.9%樹) 不 會 對 學習 的 分類/迴歸 問題 都 有意義 。 算法
若是 觀察到 長度 爲 45 ,藍 眼睛 , 和 2 條腿 , 就 被 歸類 爲 紅色 。vim
因此10000個(機率上)糟糕的模型有TMD什麼好的?好吧,這樣確實沒什麼特別的好處。可是隨着不少糟糕的決策樹被生成,其中也會有不多確實很優秀的決策樹。
當你要作預測的時候,新的觀察到的特徵隨着決策樹自上而下走下來,這樣一組觀察到的特徵將會被貼上一個預測值/標籤。一旦森林中的每棵樹都給出了預測值/標籤,全部的預測結果將被歸總到一塊兒,全部樹的模式投票被返回作爲最終的預測結果。
簡單來講,99.9%不相關的樹作出的預測結果涵蓋全部的狀況,這些預測結果將會彼此抵消。少數優秀的樹的預測結果將會超脫於芸芸「噪音」,作出一個好的預測。 dom
隨機森林就是學習方法中的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) 函數 。 無論怎樣 , 我 都認爲 這 作了一個 很 好 的 說明 如何 隨機 森林 並 未綁定於 線性 約束 。
隨機森林最好的用例之一是特徵選擇。嘗試不少決策樹變種的一個副產品就是你能夠檢測每棵樹中哪一個變量最合適/最糟糕。
當一棵樹使用一個變量,而另外一棵不使用這個變量,你就能夠從是否包含這個變量來比較價值的減小或增長。優秀的隨機森林實現將爲你作這些事情,因此你須要作的僅僅是知道去看那個方法或參數。
在下述的例子中,咱們嘗試去指出對於將酒分爲紅酒或者白酒哪一個變量是最重要的。
分類
隨機森林也很善於分類。它能夠被用於爲多個可能目標類別作預測,它也能夠被校訂輸出機率。你須要注意的一件事情是過擬合。隨機森林容易產生過擬合,特別是在數據集相對小的時候。當你的模型對於測試集合作出「太好」的預測的時候就應該懷疑一下了。
產生過擬合的一個緣由是在模型中只使用相關特徵。然而只使用相關特徵並不老是事先準備好的,使用特徵選擇(就像前面提到的)可使其更簡單。
迴歸
是的,它也能夠作迴歸。
咱們已經發現隨機森林——不像其它算法——對分類變量或者分類變量和真實變量混合學習的很是好。具備高基數(可能值的#)的分類變量是很棘手的,因此在你的口袋中放點兒這樣的東西將會是很是有用的。
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包。