小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

算法基礎(17)| 隨機森林算法基礎

 ZZvvh2vjnmrpl4 2019-06-03

今天,你算法了沒?

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ū)別。

 Bagging(套袋法)

Bagging的算法過程如下:

從原始樣本集中使用Bootstraping方法隨機抽取n個訓練樣本,共進行k輪抽取,得到k個訓練集。(k個訓練集之間相互獨立,元素可以有重復)

對于k個訓練集,我們訓練k個模型(這k個模型可以根據(jù)具體問題而定,比如決策樹,knn等)。

對于分類問題:由投票表決產生分類結果;對于回歸問題:由k個模型預測結果的均值作為最后預測結果。

2  Boosting(提升法)

Boosting的算法過程如下:

對于訓練集中的每個樣本建立權值wi,表示對每個樣本的關注度。當某個樣本被誤分類的概率很高時,需要加大對該樣本的權值。

進行迭代的過程中,每一步迭代都是一個弱分類器。我們需要用某種策略將其組合,作為最終模型。(例如AdaBoost給每個弱分類器一個權值,將其線性組合最為最終分類器。誤差越小的弱分類器,權值越大)

Bagging,Boosting的主要區(qū)別:

  • 樣本選擇上:Bagging采用的是Bootstrap隨機有放回抽樣;而Boosting每一輪的訓練集是不變的,改變的只是每一個樣本的權重。

  • 樣本權重:Bagging使用的是均勻取樣,每個樣本權重相等;Boosting根據(jù)錯誤率調整樣本權重,錯誤率越大的樣本權重越大。

  • 預測函數(shù):Bagging所有的預測函數(shù)的權重相等;Boosting中誤差越小的預測函數(shù)其權重越大。

  • 并行計算:Bagging各個預測函數(shù)可以并行生成;Boosting各個預測函數(shù)必須按順序迭代生成。

下面是將決策樹與這些算法框架進行結合所得到的新的算法:

1)Bagging 決策樹 = 隨機森林

2)AdaBoost 決策樹 = 提升樹

3)Gradient Boosting 決策樹 = GBDT

3  決策樹

常用的決策樹算法有ID3,C4.5,CART三種。3種算法的模型構建思想都十分類似,只是采用了不同的指標。決策樹模型的構建過程大致如下:

ID3,C4.5決策樹的生成

輸入:訓練集D,特征集A,閾值eps 輸出:決策樹T

  1. 若D中所有樣本屬于同一類Ck,則T為單節(jié)點樹,將類Ck作為該結點的類標記,返回T;

  2. 若A為空集,即沒有特征作為劃分依據(jù),則T為單節(jié)點樹,并將D中實例數(shù)最大的類Ck作為該結點的類標記,返回T

  3. 否則,計算A中各特征對D的信息增益(ID3)/信息增益比(C4.5),選擇信息增益最大的特征Ag

  4. 若Ag的信息增益(比)小于閾值eps,則置T為單節(jié)點樹,并將D中實例數(shù)最大的類Ck作為該結點的類標記,返回T

  5. 否則,依照特征Ag將D劃分為若干非空子集Di,將Di中實例數(shù)最大的類作為標記,構建子節(jié)點,由結點及其子節(jié)點構成樹T,返回T

  6. 對第i個子節(jié)點,以Di為訓練集,以A-{Ag}為特征集,遞歸地調用1~5,得到子樹Ti,返回Ti

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。

 
如果選取的屬性為 A,那么分裂后的數(shù)據(jù)集 D 的基尼指數(shù)的計算公式為:

 

其中 k 表示樣本 D 被分為 k 個部分,數(shù)據(jù)集 D 分裂成為 k 個 Dj 數(shù)據(jù)集。 對于特征選取,需要選擇最小的分裂后的基尼指數(shù)。也可以用基尼指數(shù)增益值作為決策樹選擇特征的依據(jù)。公式如下:

 

在決策樹選擇特征時,應選擇基尼指數(shù)增益值最大的特征,作為該結節(jié)分裂條件。

另一個,和基尼系數(shù)類似,可采用信息熵,熵的概念物理上都學過,越無序,熵越大,不做多解釋: 


假設在樣本數(shù)據(jù)集 D 中,混有 c 種類別的數(shù)據(jù)。構建決策樹時,根據(jù)給定的樣本數(shù)據(jù)集選擇某個特征值作為樹的結節(jié)。在數(shù)據(jù)集中,可以計算出該數(shù)據(jù)中的信息熵:

如果選取的屬性為 A,那么分裂后的數(shù)據(jù)集 D 的基尼指數(shù)的計算公式為:

 

其中 k 表示樣本 D 被分為 k 個部分,數(shù)據(jù)集 D 分裂成為 k 個 Dj 數(shù)據(jù)集。 


對于特征選取,需要選擇最小的分裂后的基尼指數(shù)。也可以用基尼指數(shù)增益值作為決策樹選擇特征的依據(jù)。公式如下:


 在決策樹選擇特征時,應選擇基尼指數(shù)增益值最大的特征,作為該結節(jié)分裂條件。

4  決策樹的剪枝

決策樹的剪枝主要是為了預防過擬合。主要思路是從葉節(jié)點向上回溯,嘗試對某個節(jié)點進行剪枝,比較剪枝前后的決策樹的損失函數(shù)值。最后我們通過動態(tài)規(guī)劃(樹形dp,acmer應該懂)就可以得到全局最優(yōu)的剪枝方案。

5  隨機森林(Random Forests)

隨機森林是一種重要的基于Bagging的集成學習方法,可以用來做分類、回歸等問題。

隨機森林有許多優(yōu)點:

  • 具有極高的準確率

  • 隨機性的引入,使得隨機森林不容易過擬合

  • 隨機性的引入,使得隨機森林有很好的抗噪聲能力

  • 能處理很高維度的數(shù)據(jù),并且不用做特征選擇

  • 既能處理離散型數(shù)據(jù),也能處理連續(xù)型數(shù)據(jù),數(shù)據(jù)集無需規(guī)范化

  • 訓練速度快,可以得到變量重要性排序

  • 容易實現(xiàn)并行化

隨機森林的缺點:

  • 當隨機森林中的決策樹個數(shù)很多時,訓練時需要的空間和時間會較大

  • 隨機森林模型還有許多不好解釋的地方,有點算個黑盒模型

與上面介紹的Bagging過程相似,隨機森林的構建過程大致如下:

  1. 從原始訓練集中使用Bootstraping方法隨機有放回采樣選出m個樣本,共進行n_tree次采樣,生成n_tree個訓練集

  2. 對于n_tree個訓練集,我們分別訓練n_tree個決策樹模型

  3. 對于單個決策樹模型,假設訓練樣本特征的個數(shù)為n,那么每次分裂時根據(jù)信息增益/信息增益比/基尼指數(shù)選擇最好的特征進行分裂

  4. 每棵樹都一直這樣分裂下去,直到該節(jié)點的所有訓練樣例都屬于同一類。在決策樹的分裂過程中不需要剪枝

  5. 將生成的多棵決策樹組成隨機森林。對于分類問題,按多棵樹分類器投票決定最終分類結果;對于回歸問題,由多棵樹預測值的均值決定最終預測結果

模型評估 

算法模型建立后需要進行評估,以判斷模型的優(yōu)劣。一般使用訓練集 (training set) 建立模型,使用測試集 (test set) 來評估模型。對于分類算法評估指標有分類準確度、召回率、虛警率和精確度等。而這些指標都是基于混淆矩陣 (confusion matrix) 進行計算的。 


混淆矩陣用來評價監(jiān)督式學習模型的精確性,矩陣的每一列代表一個類的實例預測,而每一行表示一個實際的類的實例。以二分類問題為例,如下表所示: 

其中 :


P (Positive Sample):正例的樣本數(shù)量。 
N (Negative Sample):負例的樣本數(shù)量。 
TP (True Positive):正確預測到的正例的數(shù)量。 
FP (False Positive):把負例預測成正例的數(shù)量。 
FN (False Negative):把正例預測成負例的數(shù)量。 
TN (True Negative):正確預測到的負例的數(shù)量。 

根據(jù)混淆矩陣可以得到評價分類模型的指標有以下幾種。 


分類準確度,就是正負樣本分別被正確分類的概率,計算公式為:

 

召回率,就是正樣本被識別出的概率,計算公式為:

 虛警率,就是負樣本被錯誤分為正樣本的概率,計算公式為:

 
精確度,就是分類結果為正樣本的情況真實性程度,計算公式為:

 評估方法有保留法、隨機二次抽樣、交叉驗證和自助法等。 

保留法 (holdout) 是評估分類模型性能的最基本的一種方法。將被標記的原始數(shù)據(jù)集分成訓練集和檢驗集兩份,訓練集用于訓練分類模型,檢驗集用于評估分類模型性能。但此方法不適用樣本較小的情況,模型可能高度依賴訓練集和檢驗集的構成。 


隨機二次抽樣 (random subsampling) 是指多次重復使用保留方法來改進分類器評估方法。同樣此方法也不適用訓練集數(shù)量不足的情況,而且也可能造成有些數(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ù)不多的情況下,效果很好。

樣例代碼及參數(shù)調優(yōu)


采用的數(shù)據(jù)集是來自數(shù)據(jù)挖掘競賽網站Kaggle,是一個關于泰坦尼克號,游客生存情況的調查??梢詮倪@里下載:

https://www./c/titanic/data 

總的來說,數(shù)據(jù)集的每一行數(shù)據(jù),差不多有11個字段,包括游客的年齡、名字、性別、買的幾等倉的票等等信息,最后是他的生存情況,在這場事故中,他是死了還是幸存。 

稍微分析一下,我們就可以篩選出對一個游客的生存與否有關的變量:Pclass, Sex, Age, SibSp,Parch,F(xiàn)are, Embarked. 一般來說,游客的名字,買的船票號碼對其的生存情況應該影響很小。

1len(train_data)
2out:891

我們共有891條數(shù)據(jù),將近900條,我們使用600條作為訓練數(shù)據(jù),剩下的291條作為測試數(shù)據(jù)森林的參數(shù)不斷調優(yōu),找出在測試結果上,預測最為精確的隨機森林模型。

在具體的實驗之前,我們看一下使用隨機森林模型,需要注意哪幾個變量: 


在 sklearn中,隨機森林的函數(shù)模型是:

1RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
2            max_depth=None, max_features='auto', max_leaf_nodes=None,
3            min_samples_leaf=1, min_samples_split=2,
4            min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1,
5            oob_score=False, random_state=None, verbose=0,
6            warm_start=False)

下面我們對上面提到的三個參數(shù),進行調優(yōu),首先參數(shù)A,由于在我們的這個數(shù)據(jù)中,數(shù)據(jù)段總共只有七八個,所以我們就簡單的選取所有的特征,所以我們只需要對剩下的兩個變量進行調優(yōu)。 

在sklearn自帶的隨機森林算法中,輸入的值必須是整數(shù)或者浮點數(shù),所以我們需要對數(shù)據(jù)進行預處理,將字符串轉化成整數(shù)或者浮點數(shù):

1def harmonize_data(titanic):
2
3
4    titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())
5
6    titanic.loc[titanic['Sex'] == 'male', 'Sex'] = 0
7
8    titanic.loc[titanic['Sex'] == 'female', 'Sex'] = 1
9
10    titanic['Embarked'] = titanic['Embarked'].fillna('S')
11
12    titanic.loc[titanic['Embarked'] == 'S', 'Embarked'] = 0
13    titanic.loc[titanic['Embarked'] == 'C', 'Embarked'] = 1
14    titanic.loc[titanic['Embarked'] == 'Q', 'Embarked'] = 2
15
16    titanic['Fare'] = titanic['Fare'].fillna(titanic['Fare'].median())    return titanic
17
18train_data = harmonize_data(train)

上面的代碼是對原始數(shù)據(jù)進行清洗,填補缺失數(shù)據(jù), 把string類型數(shù)據(jù)轉化成int數(shù)據(jù) 。

下面的工作,我們開始劃分訓練數(shù)據(jù)和測試數(shù)據(jù),總的數(shù)據(jù)有891個,我們用600個訓練數(shù)據(jù)集,剩下的291個作為測試數(shù)據(jù)集。

 1predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
2
3results = []
4
5sample_leaf_options = list(range(1, 500, 3))
6
7n_estimators_options = list(range(1, 1000, 5))
8groud_truth = train_data['Survived'][601:]for leaf_size in sample_leaf_options:    for n_estimators_size in n_estimators_options:
9        alg = RandomForestClassifier(min_samples_leaf=leaf_size, n_estimators=n_estimators_size, random_state=50)
10        alg.fit(train_data[predictors][:600], train_data['Survived'][:600])
11        predict = alg.predict(train_data[predictors][601:])
12
13        results.append((leaf_size, n_estimators_size, (groud_truth == predict).mean()))
14
15        print((groud_truth == predict).mean())
16
17
18print(max(results, key=lambda x: x[2]))

總的來說,調參對隨機森林來說,不會發(fā)生很大的波動,相比神經網絡來說,隨機森林即使使用默認的參數(shù),也可以達到良好的結果。在我們的例子中,通過粗略的調參,可以在測試集上達到84%的預測準確率,我覺得效果應該出乎我的意料吧。 

詳細代碼如下:

1__author__ = 'Administrator'import numpy as npimport pandas as pdfrom sklearn.ensemble import RandomForestClassifier
2
3train = pd.read_csv('E:/train.csv', dtype={'Age': np.float64},)def harmonize_data(titanic):
4
5
6    titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())
7
8    titanic.loc[titanic['Sex'] == 'male', 'Sex'] = 0
9    titanic.loc[titanic['Sex'] == 'female', 'Sex'] = 1
10
11    titanic['Embarked'] = titanic['Embarked'].fillna('S')
12
13    titanic.loc[titanic['Embarked'] == 'S', 'Embarked'] = 0
14    titanic.loc[titanic['Embarked'] == 'C', 'Embarked'] = 1
15    titanic.loc[titanic['Embarked'] == 'Q', 'Embarked'] = 2
16
17    titanic['Fare'] = titanic['Fare'].fillna(titanic['Fare'].median())    return titanic
18
19train_data = harmonize_data(train)
20
21predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
22results = []
23sample_leaf_options = list(range(1, 500, 3))
24n_estimators_options = list(range(1, 1000, 5))
25groud_truth = train_data['Survived'][601:]for leaf_size in sample_leaf_options:    for n_estimators_size in n_estimators_options:
26        alg = RandomForestClassifier(min_samples_leaf=leaf_size, n_estimators=n_estimators_size, random_state=50)
27        alg.fit(train_data[predictors][:600], train_data['Survived'][:600])
28        predict = alg.predict(train_data[predictors][601:])
29
30        results.append((leaf_size, n_estimators_size, (groud_truth == predict).mean()))
31
32        print((groud_truth == predict).mean())
33
34
35print(max(results, key=lambda x: x[2]))


      本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
      轉藏 分享 獻花(0

      0條評論

      發(fā)表

      請遵守用戶 評論公約

      類似文章 更多