Python 實現的隨機森林

jopen 11年前發布 | 84K 次閱讀 Python Python開發

隨機森林是一個高度靈活的機器學習方法,擁有廣泛的應用前景,從市場營銷到醫療保健保險。 既可以用來做市場營銷模擬的建模,統計客戶來源,保留和流失。也可用來預測疾病的風險和病患者的易感性。

隨機森林是一個可做能夠回歸和分類。 它具備處理大數據的特性,而且它有助于估計或變量是非常重要的基礎數據建模。

這是一篇關于使用Python來實現隨機森林文章。

什么是隨機森林?

隨機 森林 幾乎 任何 預測 問題 (甚至 非直線 部分) 的固有 選擇 它是 一個 相對較 機器 學習 策略 90 年代產生于 貝爾 實驗室 ) 可以 幾乎用于 任何方面 屬于 機器 學習 算法 類----- 集成學習 方法

集成學習

集成學習通過建立幾個模型組合解決單一預測問題工作原理是生成多個分類器/模型,各自獨立地學習作出預測這些預測最后結合 預測因此優于任何一個單分類的做出預測

隨機森林是集成學習的一個子類,由于它依靠于策率合并。你可以在這找到用python實現集成學習的文檔 Scikit 學習文檔

隨機決策樹

我們 知道 隨機 森林 是 其他 的模型 聚合, 但 它 聚合 了什么 類型 模型 ? 你 可能 已經 從 其 名稱 、 隨機 森林 聚合 分類(或 回歸) 的 樹 中猜到。 決策 樹 是 由 一 系列 的 決策的組合, 可 用于 分類 觀察 數據集 。

隨機森林

算法引入了一個隨機森林來 自動 創建 隨機 決策 樹 群 。 由于 樹 隨機 生成 的樹, 大部分的樹(或許 99.9%樹) 不 會 對 學習 的 分類/回歸 問題 都 有意義 。

Python 實現的隨機森林

如果 觀察到 長度 為 45 ,藍 眼睛 , 和 2 條腿 , 就 被 歸類 為 紅色
樹的投票

所以10000個(概率上)糟糕的模型有TMD什么好的?好吧,這樣確實沒什么特別的好處。但是隨著很多糟糕的決策樹被生成,其中也會有很少確實很優秀的決策樹。

當你要做預測的時候,新的觀察到的特征隨著決策樹自上而下走下來,這樣一組觀察到的特征將會被貼上一個預測值/標簽。一旦森林中的每棵樹都給出了預測值/標簽,所有的預測結果將被歸總到一起,所有樹的模式投票被返回做為最終的預測結果。

簡單來說,99.9%不相關的樹做出的預測結果涵蓋所有的情況,這些預測結果將會彼此抵消。少數優秀的樹的預測結果將會超脫于蕓蕓“噪音”,做出一個好的預測。

Python 實現的隨機森林

為什么你讓我用它?

簡單

隨機森林就是學習方法中的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)
full gist here Python 實現的隨機森林


如果 我們 建立了 一個 基本 的 線性 模型 通過使用 x 來預測y, 我們需要 作 一 條 直線 , 算是 平分 log (x) 函數。 而 如果 我們 使用 一個 隨機 的 森林 , 它 不會 更 好 的 逼近 log (x) 曲線 并能夠使得它更像實際函數。
Python 實現的隨機森林 Python 實現的隨機森林

你 也許會說 隨機 森林 有點 擾亂了 log(x) 函數 。 不管怎樣 , 我 都認為 這 做了一個 很 好 的 說明 如何 隨機 森林 并 未綁定于 線性 約束 。

使用

變量選擇

隨機森林最好的用例之一是特征選擇。嘗試很多決策樹變種的一個副產品就是你可以檢測每棵樹中哪個變量最合適/最糟糕。

當一棵樹使用一個變量,而另一棵不使用這個變量,你就可以從是否包含這個變量來比較價值的減少或增加。優秀的隨機森林實現將為你做這些事情,所以你需要做的僅僅是知道去看那個方法或參數。

在下述的例子中,我們嘗試去指出對于將酒分為紅酒或者白酒哪個變量是最重要的。


Python 實現的隨機森林 Python 實現的隨機森林

分類

隨機森林也很善于分類。它可以被用于為多個可能目標類別做預測,它也可以被校正輸出概率。你需要注意的一件事情是過擬合。隨機森林容易產生過擬合,特別是在數據集相對小的時候。當你的模型對于測試集合做出“太好”的預測的時候就應該懷疑一下了。

產生過擬合的一個原因是在模型中只使用相關特征。然而只使用相關特征并不總是事先準備好的,使用特征選擇(就像前面提到的)可以使其更簡單。

Python 實現的隨機森林

回歸

是的,它也可以做回歸。

我們已經發現隨機森林——不像其它算法——對分類變量或者分類變量和真實變量混合學習的非常好。具有高基數(可能值的#)的分類變量是很棘手的,所以在你的口袋中放點兒這樣的東西將會是非常有用的。

一個簡短的python例子

Scikit-Learn是開始使用隨機森林的一個很好的方式。scikit-learn API在所以算法中極其的一致,所有你測試和在不同的模型間切換非常容易。很多時候,我從一些簡單的東西開始,然后轉移到了隨機森林。

隨機森林在scikit-learn中的實現最棒的特性是n_jobs參數。這將會基于你想使用的核數自動地并行設置隨機森林。這里是scikit-learn的貢獻者Olivier Grisel的一個很棒的報告,在這個報告中他談論了使用20個節點的EC2集群訓練隨機森林。

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.Factor(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'])

看起來很不錯!

Python 實現的隨機森林

結語

隨機森林相當容易使用,而且很強大。對于任何建模,都要注意過擬合。如果你有興趣用R語言開始使用隨機森林,那么就簽出randomForest包。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!