機器學習 隨機森林及python實現

2021-10-25 08:14:32 字數 3560 閱讀 3397

隨機森林演算法流程

使用python實現隨機森林

想要知道什麼是隨機森林,我們需要知道bagging:

bagging 是 bootstrap aggregating 的英文縮寫,剛接觸的童鞋不要誤認為 bagging 是一種演算法, bagging 和 boosting 都是整合學習中的學習框架,代表著不同的思想。與 boosting 這種序列整合學習演算法不同, bagging 是並行式整合學習方法。大名鼎鼎的隨機森林演算法就是在 bagging 的基礎上修改的演算法。

bagging 方法的核心思想就是三個臭皮匠頂個諸葛亮。如果使用 bagging 解決分類問題,就是將多個分類器的結果整合起來進行投票,選取票數最高的結果作為最終結果。如果使用 bagging 解決回歸問題,就將多個回歸器的結果加起來然後求平均,將平均值作為最終結果。

bagging 在訓練時的特點就是隨機有放回取樣和並行。

隨機有放回取樣:假設訓練資料集有 m 條樣本資料,每次從這 m 條資料中隨機取一條資料放入取樣集,然後將其返回,讓下一次取樣有機會仍然能被取樣。然後重複 m 次,就能得到擁有 m 條資料的取樣集,該取樣集作為 bagging 的眾多分類器中的乙個作為訓練資料集。假設有 t 個分類器(隨便什麼分類器),那麼就重複 t 此隨機有放回取樣,構建出 t 個取樣集分別作為 t 個分類器的訓練資料集。

並行:假設有 10 個分類器,在 boosting 中,1 號分類器訓練完成之後才能開始 2 號分類器的訓練,而在 bagging 中,分類器可以同時進行訓練,當所有分類器訓練完成之後,整個 bagging 的訓練過程就結束了。如下圖:

bagging 在**時非常簡單,就是投票!比如現在有 5 個分類器,有 3 個分類器認為當前樣本屬於 a 類,1 個分類器認為屬於 b 類,1 個分類器認為屬於 c 類,那麼 bagging 的結果會是 a 類(因為 a 類的票數最高)。如下圖:

隨機森林是 bagging 的一種擴充套件變體,隨機森林的訓練過程相對與 bagging 的訓練過程的改變有:

基學習器: bagging 的基學習器可以是任意學習器,而隨機森林則是以決策樹作為基學習器。

隨機屬性選擇:假設原始訓練資料集有 10 個特徵,從這 10 個特徵中隨機選取 k 個特徵構成訓練資料子集,然後將這個子集作為訓練集扔給決策樹去訓練。其中 k 的取值一般為 log2(特徵數量)

這樣的改動通常會使得隨機森林具有更加強的泛化性,因為每一棵決策樹的訓練資料集是隨機的,而且訓練資料集中的特徵也是隨機抽取的。如果每一棵決策樹模型的差異比較大,那麼就很容易能夠解決決策樹容易過擬合的問題。

隨機森林訓練流程偽**:

#假設資料集為d,標籤集為a,需要構造的決策樹為tree

deffit

(d, a)

: models =

for i in

range

(決策樹的數量)

: 有放回的隨機取樣資料,得到資料集sample_d和標籤sample_a

從取樣到的資料中隨機抽取k個特徵構成訓練集sub_d

構建決策樹tree

tree.fit(sub_d, sample_a)

return models

隨機森林的**流程與 bagging 的**流程基本一致,如果是回歸,就將結果基學習器的**結果全部加起來算平均;如果是分類,就投票,票數最多的結果作為最終結果。但需要注意的是,在**時所用到的特徵必須與訓練模型時所用到的特徵保持一致。例如,第 3 棵決策樹在訓練時用到了訓練集的第 2,5,8 這 3 個特徵。那麼在**時也要用第 2,5,8 這 3 個特徵所組成的測試集傳給第 3 棵決策樹進行**。

手寫數字資料集:

該資料集有 1797 個樣本,每個樣本包括 8*8 畫素(實際上是一條樣本有 64 個特徵,每個畫素看成是乙個特徵,每個特徵都是 float 型別的數值)的影象和乙個 [0, 9] 整數的標籤。比如下圖的標籤是 2 :

sklearn資料集中整合有該資料集,並且已經將資料轉換成一維資料,使用下面**可以匯入並使用:

from sklearn import datasets

digits = datasets.load_digits(

)

列印它:

使用隨機森林進行分類前,先進行資料拆分:

from sklearn.model_selection import train_test_split

#切分x_train,x_test,y_train,y_test = train_test_split(digits[

'data'

],digits[

'target'

],test_size=

0.2,random_state=

42)

這裡將測試集的佔比設定為0.2。然後我們匯入模型、訓練並**:

from sklearn.ensemble import randomforestclassifier

#隨機森林判別

clf = randomforestclassifier(n_estimators=50)

clf.fit(x_train, y_train)

result_randomtrees = clf.predict(x_test)

print

(classification_report(y_test,result_randomtrees)

)

列印結果:

除了1、5以外,都挺高的。

我們用別的進行一下對比:

支援向量機:

神經網路:

決策樹:

就單純從上面來講,可以看出神經網路是表現得最好的,效能相差差不多的是支援向量機。但我們主要需要比對的是隨機森林與決策樹的差別,說到底,隨機森林就像多個決策樹一樣,通過隨機森林方法,將決策樹模型的**準確度提高了將近0.1。

部落格參考educoder實訓平台 機器學習原理與實踐課程,周志華的機器學習等。

機器學習 隨機森林

opencv包含隨機森林 random forest 類,隨機森林可以通過收集很多樹的子節點對各個類別的投票,然後選擇獲得最多投票的類別作為判斷結果。通過計算 森林 的所有子節點上的值的平均值來解決回歸問題。隨機森林包含隨機選擇的一些決策樹。隨機森林建立時的基本子系統也是決策樹,在建立決策樹時會一直...

機器學習 隨機森林

以下內容均為個人理解,如有錯誤,歡迎指出 如何生成隨機森林基學習器的訓練資料集 隨機 的含義 bagging整合學習的評測方法 隨機森林的引數 以下內容摘自周志華老師的 機器學習 隨機森林是bagging的乙個擴充套件變體,它在以決策樹為基學習器構建的bagging整合的基礎上,進一步在決策樹的訓練...

機器學習 隨機森林

以決策樹為基礎 隨機森林 決策樹的乙個主要缺點在於經常對訓練的資料過擬合。隨機森林是解決這個問題的一種方法。隨機森林的本質上是很多決策樹的集合,其中那個每棵樹都和其他樹略有不同。隨機森林背後砈思想史是,每棵樹的 都可能相對較好,但可能對部分書聚過擬合,如果我們構建很多樹,並且每棵樹都可以 的很好,但...