今天,你算法了沒? 0.來源說明 作者:我愛大貓咪,shjyoudp 出處:CSDN 整理&排版:Ethon 隨機森林由Leo Breiman(2001)提出的一種分類算法,它通過自助法(Bootstrap)重采樣技術,從原始訓練樣本集N中有放回地重復隨機抽取n個樣本生成新的訓練樣本集合訓練決策樹,然后按以上步驟生成m棵決策樹組成隨機森林,新數(shù)據(jù)的分類結果按分類樹投票多少形成的分數(shù)而定。其實質是對決策樹算法的一種改進,將多個決策樹合并在一起,每棵樹的建立依賴于獨立抽取的樣本。 單棵樹的分類能力可能很小,但在隨機產生大量的決策樹后,一個測試樣本可以通過每一棵樹的分類結果經統(tǒng)計后選擇最可能的分類。 隨機森林這個算法在分類問題上效果十分的好,大多數(shù)情況下效果遠要比svm,log回歸,knn等算法效果好。 隨機森林屬于集成學習(Ensemble Learning)中的Bagging算法。在集成學習中,主要分為Bagging算法和Boosting算法。我們先看看這兩種方法的特點和區(qū)別。 1 Bagging(套袋法) Bagging的算法過程如下: 從原始樣本集中使用Bootstraping方法隨機抽取n個訓練樣本,共進行k輪抽取,得到k個訓練集。(k個訓練集之間相互獨立,元素可以有重復) 對于k個訓練集,我們訓練k個模型(這k個模型可以根據(jù)具體問題而定,比如決策樹,knn等)。 對于分類問題:由投票表決產生分類結果;對于回歸問題:由k個模型預測結果的均值作為最后預測結果。 2 Boosting(提升法) Boosting的算法過程如下: 對于訓練集中的每個樣本建立權值wi,表示對每個樣本的關注度。當某個樣本被誤分類的概率很高時,需要加大對該樣本的權值。 進行迭代的過程中,每一步迭代都是一個弱分類器。我們需要用某種策略將其組合,作為最終模型。(例如AdaBoost給每個弱分類器一個權值,將其線性組合最為最終分類器。誤差越小的弱分類器,權值越大) Bagging,Boosting的主要區(qū)別:
下面是將決策樹與這些算法框架進行結合所得到的新的算法: 1)Bagging 決策樹 = 隨機森林 2)AdaBoost 決策樹 = 提升樹 3)Gradient Boosting 決策樹 = GBDT 3 決策樹 常用的決策樹算法有ID3,C4.5,CART三種。3種算法的模型構建思想都十分類似,只是采用了不同的指標。決策樹模型的構建過程大致如下: ID3,C4.5決策樹的生成 輸入:訓練集D,特征集A,閾值eps 輸出:決策樹T
CART決策樹的生成 這里只簡單介紹下CART與ID3和C4.5的區(qū)別。 CART樹是二叉樹,而ID3和C4.5可以是多叉樹 CART在生成子樹時,是選擇一個特征一個取值作為切分點,生成兩個子樹 選擇特征和切分點的依據(jù)是基尼指數(shù),選擇基尼指數(shù)最小的特征及切分點生成子樹 案例 圖 1 是一棵結構簡單的決策樹,用于預測貸款用戶是否具有償還貸款的能力。貸款用戶主要具備三個屬性:是否擁有房產,是否結婚,平均月收入。每一個內部結節(jié)都表示一個屬性條件判斷,葉子結節(jié)表示貸款用戶是否具有償還能力。 這里說的屬性,也就是算法中的特征,對應于數(shù)據(jù)表就是字段。 這里說的可以償還/不能償還,就是一種分類問題。 從上圖我們可以看到,第一個節(jié)點使用“擁有房產”作為條件,也就是特征。那么我們?yōu)槭裁吹谝粋€條件選擇“擁有房產”呢,選擇的條件和依據(jù)是什么呢?下面介紹基尼系數(shù): 其中 c 表示數(shù)據(jù)集中類別的數(shù)量,Pi 表示類別 i 樣本數(shù)量占所有樣本的比例。 從該公式可以看出,當數(shù)據(jù)集中數(shù)據(jù)混合的程度越高,基尼指數(shù)也就越高。當數(shù)據(jù)集 D 只有一種數(shù)據(jù)類型,那么基尼指數(shù)的值為最低 0。
其中 k 表示樣本 D 被分為 k 個部分,數(shù)據(jù)集 D 分裂成為 k 個 Dj 數(shù)據(jù)集。 對于特征選取,需要選擇最小的分裂后的基尼指數(shù)。也可以用基尼指數(shù)增益值作為決策樹選擇特征的依據(jù)。公式如下:
在決策樹選擇特征時,應選擇基尼指數(shù)增益值最大的特征,作為該結節(jié)分裂條件。 另一個,和基尼系數(shù)類似,可采用信息熵,熵的概念物理上都學過,越無序,熵越大,不做多解釋:
如果選取的屬性為 A,那么分裂后的數(shù)據(jù)集 D 的基尼指數(shù)的計算公式為:
其中 k 表示樣本 D 被分為 k 個部分,數(shù)據(jù)集 D 分裂成為 k 個 Dj 數(shù)據(jù)集。
在決策樹選擇特征時,應選擇基尼指數(shù)增益值最大的特征,作為該結節(jié)分裂條件。 4 決策樹的剪枝 決策樹的剪枝主要是為了預防過擬合。主要思路是從葉節(jié)點向上回溯,嘗試對某個節(jié)點進行剪枝,比較剪枝前后的決策樹的損失函數(shù)值。最后我們通過動態(tài)規(guī)劃(樹形dp,acmer應該懂)就可以得到全局最優(yōu)的剪枝方案。 5 隨機森林(Random Forests) 隨機森林是一種重要的基于Bagging的集成學習方法,可以用來做分類、回歸等問題。 隨機森林有許多優(yōu)點:
隨機森林的缺點:
與上面介紹的Bagging過程相似,隨機森林的構建過程大致如下:
5 模型評估 算法模型建立后需要進行評估,以判斷模型的優(yōu)劣。一般使用訓練集 (training set) 建立模型,使用測試集 (test set) 來評估模型。對于分類算法評估指標有分類準確度、召回率、虛警率和精確度等。而這些指標都是基于混淆矩陣 (confusion matrix) 進行計算的。
根據(jù)混淆矩陣可以得到評價分類模型的指標有以下幾種。
召回率,就是正樣本被識別出的概率,計算公式為: 虛警率,就是負樣本被錯誤分為正樣本的概率,計算公式為: 評估方法有保留法、隨機二次抽樣、交叉驗證和自助法等。 保留法 (holdout) 是評估分類模型性能的最基本的一種方法。將被標記的原始數(shù)據(jù)集分成訓練集和檢驗集兩份,訓練集用于訓練分類模型,檢驗集用于評估分類模型性能。但此方法不適用樣本較小的情況,模型可能高度依賴訓練集和檢驗集的構成。
交叉驗證 (cross-validation) 是指把數(shù)據(jù)分成數(shù)量相同的 k 份,每次使用數(shù)據(jù)進行分類時,選擇其中一份作為檢驗集,剩下的 k-1 份為訓練集,重復 k 次,正好使得每一份數(shù)據(jù)都被用于一次檢驗集 k-1 次訓練集。 該方法的優(yōu)點是盡可能多的數(shù)據(jù)作為訓練集數(shù)據(jù),每一次訓練集數(shù)據(jù)和檢驗集數(shù)據(jù)都是相互獨立的,并且完全覆蓋了整個數(shù)據(jù)集。也存在一個缺點,就是分類模型運行了 K 次,計算開銷較大。 自助法 (bootstrap) 是指在其方法中,訓練集數(shù)據(jù)采用的是有放回的抽樣,即已經選取為訓練集的數(shù)據(jù)又被放回原來的數(shù)據(jù)集中,使得該數(shù)據(jù)有機會能被再一次抽取。用于樣本數(shù)不多的情況下,效果很好。 6 樣例代碼及參數(shù)調優(yōu)
https://www./c/titanic/data 總的來說,數(shù)據(jù)集的每一行數(shù)據(jù),差不多有11個字段,包括游客的年齡、名字、性別、買的幾等倉的票等等信息,最后是他的生存情況,在這場事故中,他是死了還是幸存。 稍微分析一下,我們就可以篩選出對一個游客的生存與否有關的變量:Pclass, Sex, Age, SibSp,Parch,F(xiàn)are, Embarked. 一般來說,游客的名字,買的船票號碼對其的生存情況應該影響很小。 1len(train_data) 我們共有891條數(shù)據(jù),將近900條,我們使用600條作為訓練數(shù)據(jù),剩下的291條作為測試數(shù)據(jù)森林的參數(shù)不斷調優(yōu),找出在測試結果上,預測最為精確的隨機森林模型。 在具體的實驗之前,我們看一下使用隨機森林模型,需要注意哪幾個變量:
下面我們對上面提到的三個參數(shù),進行調優(yōu),首先參數(shù)A,由于在我們的這個數(shù)據(jù)中,數(shù)據(jù)段總共只有七八個,所以我們就簡單的選取所有的特征,所以我們只需要對剩下的兩個變量進行調優(yōu)。 在sklearn自帶的隨機森林算法中,輸入的值必須是整數(shù)或者浮點數(shù),所以我們需要對數(shù)據(jù)進行預處理,將字符串轉化成整數(shù)或者浮點數(shù): 1def harmonize_data(titanic): 上面的代碼是對原始數(shù)據(jù)進行清洗,填補缺失數(shù)據(jù), 把string類型數(shù)據(jù)轉化成int數(shù)據(jù) 。 下面的工作,我們開始劃分訓練數(shù)據(jù)和測試數(shù)據(jù),總的數(shù)據(jù)有891個,我們用600個訓練數(shù)據(jù)集,剩下的291個作為測試數(shù)據(jù)集。
總的來說,調參對隨機森林來說,不會發(fā)生很大的波動,相比神經網絡來說,隨機森林即使使用默認的參數(shù),也可以達到良好的結果。在我們的例子中,通過粗略的調參,可以在測試集上達到84%的預測準確率,我覺得效果應該出乎我的意料吧。 詳細代碼如下: 1__author__ = 'Administrator'import numpy as npimport pandas as pdfrom sklearn.ensemble import RandomForestClassifier |
|
來自: ZZvvh2vjnmrpl4 > 《微信好文》