翻譯自:http://blog.yhat.com/posts/python-random-forest.html
昨天收到
yhat
推送了一篇介紹隨機(jī)森林算法的郵件慢洋,感覺作為介紹和入門不錯(cuò)塘雳,就順手把它翻譯一下。
目錄
- 1 什么是隨機(jī)森林
- 1.1 集成學(xué)習(xí)
- 1.2 隨機(jī)決策樹
- 1.3 隨機(jī)森林
- 1.4 投票
- 2 為什么要用它
- 3 使用方法
- 3.1 變量選擇
- 3.2 分類
- 3.3 回歸
- 4 一個(gè)簡(jiǎn)單的Python示例
- 結(jié)語
前言: 隨機(jī)森林是一個(gè)非常靈活的機(jī)器學(xué)習(xí)方法普筹,從市場(chǎng)營(yíng)銷到醫(yī)療保險(xiǎn)有著眾多的應(yīng)用败明。它可以用于市場(chǎng)營(yíng)銷對(duì)客戶獲取和存留建模或預(yù)測(cè)病人的疾病風(fēng)險(xiǎn)和易感性太防。
隨機(jī)森林能夠用于分類和回歸問題妻顶,可以處理大量特征,并能夠幫助估計(jì)用于建模數(shù)據(jù)變量的重要性蜒车。
這篇文章是關(guān)于如何使用Python構(gòu)建隨機(jī)森林模型讳嘱。
1 什么是隨機(jī)森林
隨機(jī)森林可以用于幾乎任何一種預(yù)測(cè)問題(包括非線性問題)。它是一個(gè)相對(duì)較新的機(jī)器學(xué)習(xí)策略(90年代誕生于貝爾實(shí)驗(yàn)室)可以用在任何方面酿愧。它屬于機(jī)器學(xué)習(xí)中的集成學(xué)習(xí)
這一大類沥潭。
1.1 集成學(xué)習(xí)
集成學(xué)習(xí)是將多個(gè)模型進(jìn)行組合來解決單一的預(yù)測(cè)問題。它的原理是生成多個(gè)分類器模型嬉挡,各自獨(dú)立地學(xué)習(xí)并作出預(yù)測(cè)钝鸽。這些預(yù)測(cè)最后結(jié)合起來得到預(yù)測(cè)結(jié)果呼渣,因此和單獨(dú)分類器的結(jié)果相比,結(jié)果一樣或更好寞埠。
隨機(jī)森林是集成學(xué)習(xí)的一個(gè)分支,因?yàn)樗揽坑跊Q策樹的集成焊夸。更多關(guān)于python實(shí)現(xiàn)集成學(xué)習(xí)的文檔: Scikit-Learn 文檔仁连。
1.2 隨機(jī)決策樹
我們知道隨機(jī)森林是將其他的模型進(jìn)行聚合, 但具體是哪種模型呢阱穗?從其名稱也可以看出饭冬,隨機(jī)森林聚合的是分類(或回歸) 樹。一顆決策樹是由一系列的決策組合而成的揪阶,可用于數(shù)據(jù)集的觀測(cè)值進(jìn)行分類 昌抠。
1.3 隨機(jī)森林
引入的隨機(jī)森林算法將自動(dòng)創(chuàng)建隨機(jī)決策樹群。由于這些樹是隨機(jī)生成的鲁僚,大部分的樹(甚至 99.9%)對(duì)解決你的分類或回歸問題是沒有有意義炊苫。
1.4 投票
那么,生成甚至上萬的糟糕的模型有什么好處呢冰沙?好吧侨艾,這確實(shí)沒有。但有用的是拓挥,少數(shù)非常好的決策樹也隨之一起生成了唠梨。
當(dāng)你要做預(yù)測(cè)的時(shí)候,新的觀察值隨著決策樹自上而下走下來并被賦予一個(gè)預(yù)測(cè)值或標(biāo)簽侥啤。一旦森林中的每棵樹都給有了預(yù)測(cè)值或標(biāo)簽当叭,所有的預(yù)測(cè)結(jié)果將被歸總到一起,所有樹的投票返回做為最終的預(yù)測(cè)結(jié)果盖灸。
簡(jiǎn)單來說蚁鳖,99.9%不相關(guān)的樹做出的預(yù)測(cè)結(jié)果涵蓋所有的情況,這些預(yù)測(cè)結(jié)果將會(huì)彼此抵消赁炎。少數(shù)優(yōu)秀的樹的預(yù)測(cè)結(jié)果將會(huì)脫穎而出才睹,從而得到一個(gè)好的預(yù)測(cè)結(jié)果。
2 為什么要用它
隨機(jī)森林是機(jī)器學(xué)習(xí)方法中的Leatherman(多功能折疊刀)甘邀。你幾乎可以把任何東西扔給它琅攘。它在估計(jì)推斷映射方面做的特別好,從而不需要類似SVM醫(yī)一樣過多的調(diào)參(這點(diǎn)對(duì)時(shí)間緊迫的朋友非常好)松邪。
2.1 一個(gè)映射的例子
隨機(jī)森林可以在未經(jīng)特意手工進(jìn)行數(shù)據(jù)變換的情況下學(xué)習(xí)坞琴。以函數(shù)f(x)=log(x)
為例。
我們將在Yhat自己的交互環(huán)境Rodeo
中利用Python生成分析數(shù)據(jù)逗抑,你可以在here下載Rodeo
的Mac
,Windows
和Linux
的安裝文件剧辐。
首先寒亥,我們先生成一下數(shù)據(jù)并添加噪聲。
[01]: http://latex.codecogs.com/png.latex?sh(x)=\\frac{ex+e{-x}}{2}}
import numpy as np
import pylab as pl
x = np.random.uniform(1, 100, 1000)
y = np.log(x) + np.random.normal(0, .3, 1000)
pl.scatter(x, y, s=1, label="log(x) with noise")
pl.plot(np.arange(1, 100), np.log(np.arange(1, 100)), c="b", label="log(x) true function")
pl.xlabel("x")
pl.ylabel("f(x) = log(x)")
pl.legend(loc="best")
pl.title("A Basic Log Function")
pl.show()
得到如下結(jié)果:
如果我們建立了一個(gè)基本的線性模型通過使用x
來預(yù)測(cè)y
荧关,我們需要作一條直線溉奕,一定成都市算是平分log(x)
函數(shù)。而如果我們使用隨機(jī)森林算法忍啤,它可以更好的逼近log(x)
曲線從而使得它看起來更像實(shí)際的函數(shù)加勤。
當(dāng)然,你也可以說隨機(jī)森林對(duì)log(x)
函數(shù)有點(diǎn)過擬合同波。不管怎么樣鳄梅,這說明了隨機(jī)森林并不限于線性問題。
3 使用方法
3.1 特征選擇
隨機(jī)森林的一個(gè)最好用例是特征選擇未檩。嘗試很多個(gè)決策樹變量的一個(gè)副產(chǎn)品就是戴尸,你可以檢查變量在每棵樹中表現(xiàn)的是最佳還是最糟糕。
當(dāng)一些樹使用一個(gè)變量冤狡,而其他的不使用這個(gè)變量孙蒙,你就可以對(duì)比信息的丟失或增加。實(shí)現(xiàn)的比較好的隨機(jī)森林工具能夠?yàn)槟阕鲞@些事情悲雳,所以你需要做的僅僅是去查看那個(gè)方法或參數(shù)马篮。
在下述的例子中,我們嘗試弄明白區(qū)分紅酒或白酒時(shí)怜奖,哪些變量是最重要的浑测。
3.2 分類
隨機(jī)森林也很善長(zhǎng)分類問題。它可以被用于為多個(gè)可能目標(biāo)類別做預(yù)測(cè)歪玲,它也可以在調(diào)整后輸出概率迁央。你需要注意的一件事情是過擬合。
隨機(jī)森林容易產(chǎn)生過擬合滥崩,特別是在數(shù)據(jù)集相對(duì)小的時(shí)候岖圈。當(dāng)你的模型對(duì)于測(cè)試集合做出“太好”的預(yù)測(cè)的時(shí)候就應(yīng)該懷疑一下了。避免過擬合的一個(gè)方法是在模型中只使用有相關(guān)性的特征钙皮,比如使用之前提到的特征選擇蜂科。
3.3 回歸
隨機(jī)森林也可以用于回歸問題。
我發(fā)現(xiàn)短条,不像其他的方法导匣,隨機(jī)森林非常擅長(zhǎng)于分類變量或分類變量與連續(xù)變量混合的情況。
4 一個(gè)簡(jiǎn)單的Python示例
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.from_codes(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'])
下面就是你應(yīng)該看到的結(jié)果了茸时。由于我們隨機(jī)選擇數(shù)據(jù)贡定,所以實(shí)際結(jié)果每次都會(huì)不一樣。
preds | sertosa | versicolor | virginica |
---|---|---|---|
actual | |||
sertosa | 6 | 0 | 0 |
versicolor | 0 | 16 | 1 |
virginica | 0 | 0 | 12 |
5 結(jié)語
隨機(jī)森林相當(dāng)起來非常容易可都。不過和其他任何建模方法一樣要注意過擬合問題缓待。如果你有興趣用R
語言使用隨機(jī)森林蚓耽,可以查看randomForest包。
有用的話旋炒,就動(dòng)手點(diǎn)一下 喜歡 唄