此篇文章翻譯自以下鏈接(https://community.alteryx.com/t5/Data-Science-Blog/Random-Forests-in-Python/ba-p/138437)
隨機(jī)森林一種多功能的機(jī)器學(xué)習(xí)算法,它可以作用于從營銷到醫(yī)療保健纵搁、保健的眾多應(yīng)用腾誉。它可用于模擬營銷對獲客峻呕、留存和流失的影響趣效,或者預(yù)測疾病風(fēng)險和易感染性。
隨機(jī)森林可用于分類classification和回歸regresssion問題讯私,它可以處理大量的特征斤寇,并且有助于估計哪些特征在建模的基礎(chǔ)數(shù)據(jù)中占重要地位拥褂。
這是一篇關(guān)于在Python中使用隨機(jī)森林的文章。
1莫秆、什么是隨機(jī)森林
隨機(jī)森林幾乎可以用于任何預(yù)測問題悔详,甚至是非線性問題。它是一種相對較新(我猜現(xiàn)在也不新了)的機(jī)器學(xué)習(xí)策略缝驳,出自90年代的貝爾實驗室党巾,它可以用于任何事情霜医。它屬于更大類的機(jī)器學(xué)習(xí)算法,稱為集合方法署海。
集成學(xué)習(xí)
集成學(xué)習(xí)涉及集中模型的組合以解決單個預(yù)測問題砸狞。它的工作原理是生成多個獨立學(xué)習(xí)和預(yù)測的分類器/模型镀梭。然后這些預(yù)測組合起來得到單個預(yù)測結(jié)果,與單個的分類器相比研底,它的結(jié)果應(yīng)該是一樣好或者更好。
隨機(jī)森林是集成學(xué)習(xí)的一個分支冠蒋,因為它依賴于決策樹的集成乾胶。關(guān)于Python中更多關(guān)于集成學(xué)習(xí)的內(nèi)容:Scikit-Learn docs
隨機(jī)決策樹
所以我們知道了隨機(jī)森林是其他模型的集合,但它究竟聚合了哪些模型呢识窿?你可能從它的名稱中已經(jīng)猜到了,隨機(jī)森林聚合了分類或者回歸樹孽拷。決策樹由一系列決策組成半抱,用于對數(shù)據(jù)集的觀測值進(jìn)行分類窿侈。
隨機(jī)森林
誘導(dǎo)隨機(jī)森林的算法秋茫,將自動創(chuàng)建一堆隨機(jī)決策樹肛著。由于樹是隨機(jī)生成的,因此大多數(shù)樹對于學(xué)習(xí)分類/回歸問題都沒有意義(可能是99.9%的樹)殉农。
Arboreal 投票
那么超凳,一萬個糟糕的模型有什么用呢耀态?事實證明首装,它們真的沒那么有用。但是驰吓,有用的是少數(shù)非常好的決策樹,它也會和壞的決策樹一起生長现斋。
當(dāng)我們進(jìn)行預(yù)測時偎蘸,新的觀測值隨決策樹自上而下Push并且被賦予一個預(yù)測值/標(biāo)簽。一旦森林中的每棵樹都報告了其預(yù)測值/標(biāo)簽迷雪,我們就會對預(yù)測進(jìn)行統(tǒng)計章咧,所有樹的投票結(jié)果作為最終預(yù)測結(jié)果返回。
簡單來說扰柠,99.9%不相干的樹做出的預(yù)測疼约,會涵蓋所有的結(jié)果程剥,并且這些預(yù)測結(jié)果相互抵消。少數(shù)優(yōu)秀樹木的預(yù)測才是好的舔腾,并且得到好的預(yù)測結(jié)果稳诚。
2采桃、為什么要用它丘损?
它很簡單
隨機(jī)森林是機(jī)器學(xué)習(xí)中的多功能折疊刀徘钥,你幾乎可以把任何東西扔給它。它在估計推斷轉(zhuǎn)換方面做得特別好舆驶,因此沙廉,你不需要像SVM那樣做太多調(diào)參(它對于時間緊迫的人來說特別好)
一個轉(zhuǎn)換的例子
隨機(jī)森林能夠在沒有精心設(shè)計的數(shù)據(jù)轉(zhuǎn)換的情況下學(xué)習(xí)。以f(x) = log(x)為例珊皿。
我們將在Yhat自己的交互環(huán)境Rodeo中利用Python生成分析數(shù)據(jù)蟋定,在這里下載Rodeo
的Mac
,Windows
和Linux
的安裝文件草添。
首先,我們先生成一下數(shù)據(jù)并添加噪聲抄淑。
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òu)建一個基本的線性模型來使用x來預(yù)測y蝇狼,我們會得到一條直線,它將log(x)函數(shù)一分為二贱枣。然而,如果我們使用隨機(jī)森林钠乏,它可以更好地近似log(x)曲線春塌,并且我們得到的東西看起來更像真正的函數(shù)只壳。
當(dāng)然锅必,你也可以說隨機(jī)森林對log(x)函數(shù)有點過擬合搞隐。不管怎么樣,這說明了隨機(jī)森林并不受線性約束的約束逢捺。
3使用方法
特征選擇
隨機(jī)森林的最佳用例之一是特征選擇蒸甜。嘗試大量決策樹變體的副產(chǎn)品之一是余佛,您可以檢查每棵樹中哪些變量最佳或者最差辉巡。
當(dāng)某個樹使用一個參數(shù)而另一個不使用時,您可以比較從該參數(shù)的包含/排除中丟失或獲得的值憔恳。好的隨機(jī)森林實現(xiàn)將為您做到這一點钥组,所以您需要做的就是知道要查看哪個方法或參數(shù)。
在下面的例子中今瀑,我們試圖找出哪些變量對于將葡萄酒分類為紅色或白色最重要程梦。
分類
隨機(jī)森林也很善長分類問題。它可用于對具有多個可能值的類別進(jìn)行預(yù)測橘荠,也可以對其進(jìn)行校準(zhǔn)以輸出概率屿附。你需要注意的一件事情是過擬合。
隨機(jī)森林可能容易過度擬合哥童,尤其是在使用相對較小的數(shù)據(jù)集時挺份。如果您的模型對我們的測試集進(jìn)行“太好”的預(yù)測,您應(yīng)該懷疑贮懈。避免過擬合的一個方法是在模型中只使用有相關(guān)性的特征匀泊。雖然這并不總是干凈完美的,但使用特征選擇技術(shù)(如前面提到的特征選擇)可以使它更容易朵你。
回歸
隨機(jī)森林也可以用于回歸問題。
不像其他的方法毛仪,隨機(jī)森林非常擅長于分類變量或分類變量與連續(xù)變量混合的情況。
一個簡單的Python例子
Scikit-Learn是開始使用隨機(jī)森林的好方法衡怀。scikit-learn API在算法中非常一致,因此您可以非常輕松地在模型之間進(jìn)行競賽和切換茁帽。很多時候潘拨,我從一些簡單的東西開始茫船,然后轉(zhuǎn)移到隨機(jī)森林狰闪。
scikit-learn中隨機(jī)森林實現(xiàn)的最佳功能之一是n_jobs參數(shù)幔欧。這將根據(jù)您要使用的核心數(shù)自動并行化隨機(jī)林的擬合觉义。這里 是scikit-learn撰稿人Olivier Grisel的精彩演講,他講述了在20個節(jié)點的EC2集群上訓(xùn)練隨機(jī)森林的過程徒坡。
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ù)刻诊,所以每次看到的結(jié)果都會有所不同。
preds | sertosa | versicolor | virginica |
---|---|---|---|
actual | |||
sertosa | 6 | 0 | 0 |
versicolor | 0 | 16 | 1 |
virginica | 0 | 0 | 12 |
最終思考
由于它的先進(jìn)性民假,隨機(jī)森林非常易于被使用事秀。但是與任何建模一樣,我們都要警惕過擬合睹欲。如果你有興趣在R語言中開始使用隨機(jī)森林,那么請查看randomForest包吧。
翻譯完了才發(fā)現(xiàn)蔚出,并沒有寫太多干貨.....