原標題:【乾貨】隨機森林的Python實現
1新智元編譯
來源:yhat.com
作者:yhat
譯者:劉小芹
:COO、執行總編、主編、高級編譯、主筆、運營總監、客戶經理、諮詢總監、行政助理等 9 大崗位全面開放。
簡歷投遞:jobs@aiera.com.cn
HR 微信:13552313024
新智元為COO和執行總編提供最高超百萬的年薪激勵;為骨幹員工提供最完整的培訓體系、高於業界平均水平的工資和獎金。
加盟新智元,與人工智慧業界領袖攜手改變世界。
【新智元導讀】在機器學習中,隨機森林是一個包含多個決策樹的分類器,並且其輸出的類別是由個別樹輸出的類別的眾數而定。隨機森林幾乎是任何預測類問題(甚至非線性問題)的首選。本文介紹了隨機森林的原理、用途,以及用 Python 實現隨機森林的方法。
隨機森林是一種高度通用的機器學習方法,廣泛應用於市場營銷、醫療保健、保險等各領域。它可用於模擬市場營銷對客戶獲取、保持和流失的影響,或用於預測患者的患病風險和感病性。
隨機森林能夠進行回歸和分類。它能處理大量的特徵,有助於預估哪些變量在建模的底層數據中很重要。本文介紹了隨機森林的原理、用途,以及用 Python 實現隨機森林的方法。
什麼是隨機森林?
隨機森林幾乎是任何預測類問題(甚至非線性問題)的首選。隨機森林是相對較新的機器學習策略(出自90年代的貝爾實驗室),可應用於幾乎所用問題。它隸屬於更大的一類機器學習算法,叫做「集成方法」(ensemble methods)。
集成學習是解決單個預測問題的數個模型的組合。集成學習通過生成多個獨立學習並進行預測的分類器/模型生效。然後這些預測結果被組合成一個預測,這個預測的準確率應當等於或大於任一分類器做出的預測。
隨機森林是集成學習中非常有效的一種,因為它依賴於許多決策樹的集合。更多關於Python 集成學習的內容可參考:http://scikit-learn.org/dev/modules/ensemble.html
我們已經知道隨機森林是其他模型的聚合,那麼它聚合的是哪些模型呢?正如它的名字所示,隨機森林是分類(或回歸)決策樹的聚合。決策樹由一系列能夠用於對一個數據集的觀察進行分類的決策組成()。
誘發隨機森林的算法將自動創建許多隨機決策樹。由於這些樹是隨機生成的,它們大多數(大概99.9%)不會對學習分類/回歸問題有影響。
如果觀察到長度為45,眼睛是藍色,並且有兩條腿,那麼它將被歸類為紅色。
那麼10000個(多半)糟糕的模型有什麼好處?好吧,他們確實沒什麼幫助。但有幫助的是這麼多的模型中也會產生少數幾個非常好的決策樹。
在進行預測時,新觀察到的特徵沿著每棵決策樹的分支往下走,並被賦予一個預測值/標籤(predicted value/label)。當森林中的每棵樹都得到它的預測值/標籤,這些預測就會被統計,所有樹的投票被返回作為最終的預測結果。
簡單地說,99.9%的不相關的樹做出了大部分的預測,但它們彼此抵消。少數好的決策樹做出了準確度高的預測,它們處於「噪聲」的頂端,使得隨機森林最終能產生較好的預測結果。
為什麼使用隨機森林?
隨機森林就像學習方法中的瑞士軍刀,任何東西它都可以給你修好。隨機森林尤其擅長預估推斷變換(inferred transformations),因此,它不需要像 SVM 那樣進行很多調試。
隨機森林能夠在沒有精心設計的數據變換(data transformations)的環境下學習。以 f (x) = log(x)函數為例。
我們在Yhat自己的為數據分析而建的交互環境 Rodeo 中編寫 Python 代碼。可在這裡下載Rodeo:https://www.yhat.com/products/rodeo。
首先,製造一些不真實數據(fake data)來加入一點噪音。
用 Rodeo 的話,應該能看到這樣的情形:
放大看這張圖:
如果我們嘗試建一個基本線性模型來用 x預測 y,我們需要作一條直線來平分 log (x)。但如果我們使用隨機森林,能得到一條接近 log (x)的曲線,看起來更像實際的函數。
你可能認為隨機森林對 log (x)函數過度擬合了。不管怎麼說,我覺得它很好地說明了隨機森林不受線性約束的限制。
用途
隨機森林的最佳使用實例之一是特徵選擇(feature selection)。嘗試許多決策樹變量(variations)帶來的副產品之一是,你可以檢驗每棵樹中哪個變量最相關/無關。
當一棵樹使用某個變量,而另一棵不用這個時,你可以比較包含/排除該變量時丟失或得到的值。在下面的例子中,我們試圖找出哪些變量在將酒分類為紅酒和白酒的任務中最重要。
隨機森林也很擅長分類任務。它能用於對具有多個可能值的類別進行預測,也能被校準來輸出概率。需要注意的是過擬合(overfitting)。隨機森林可能容易過擬合,尤其是使用相對小型的數據集時。如果你的模型在我們的測試集中表現「太好」,就應該懷疑過擬合了。
引起過擬合的原因之一是在模型中只使用真正相關的特徵。雖然不是固定的方式,但使用一些特徵選擇技術(例如前文提到的)可以避免過擬合。
我發現隨機森林——不像其他算法——在學習分類變量或分類變量和真實變量的結合時真的很有效。高基數的分類變量處理起來很棘手,因此隨機森林會大有幫助。
一個 Python 實現的例子
Scikit-Learn 對開始使用隨機森林非常好。Scikit-Learn API 在各種算法中都非常一致,因此可以很容易地在模型之間進行比較和切換。多數時候我會從簡單的地方開始,再轉移到隨機森林。
隨機森林在 scikit-learn 中實現得最好的特徵之一是 n_jobs 參數。它會根據你想要使用的核的數量自動並行擬合隨機森林。這裡有一個關於如何在 20 節點的 EC2 簇中訓練隨機森林的演示:https://vimeo.com/63269736。
按照如上代碼,你應該能看到如下的結果。由於我們使用隨機選擇的數據,因此確切的值每次都會有不同。
總結
隨機森林非常強大而且相當容易使用。與任何模型訓練一樣,要警惕過擬合。
編譯來源:http://blog.yhat.com/posts/python-random-forest.html
:COO、執行總編、主編、高級編譯、主筆、運營總監、客戶經理、諮詢總監、行政助理等 9 大崗位全面開放。
簡歷投遞:jobs@aiera.com.cn
HR 微信:13552313024
新智元為COO和執行總編提供最高超百萬的年薪激勵;為骨幹員工提供最完整的培訓體系、高於業界平均水平的工資和獎金。
加盟新智元,與人工智慧業界領袖攜手改變世界。
點擊閱讀原文,查看新智元招聘信息。返回搜狐,查看更多
責任編輯: