RF模型(随机森林模型)详解
入門小菜鳥,希望像做筆記記錄自己學的東西,也希望能幫助到同樣入門的人,更希望大佬們幫忙糾錯啦~侵權(quán)立刪。
目錄
一、RF背景——集成學習中的bagging流派
1、集成學習簡介
2、bagging流派算法簡介
(1)算法結(jié)構(gòu)圖
(2)算法步驟
(3)OOB(袋外數(shù)據(jù))& 泛化能力
二、RF模型算法原理
1、RF Vs bagging
2、算法步驟
三、RF模型的優(yōu)缺點
1、優(yōu)點
2、缺點
四、RF的變式——extra trees?
五、代碼實現(xiàn)RF模型
一、RF背景——集成學習中的bagging流派
RF模型屬于集成學習中的bagging流派,可以說是bagging的進化版
1、集成學習簡介
集成學習分為2派:
(1)boosting:它組合多個弱學習器形成一個強學習器,且各個弱學習器之間有依賴關系。
(2)bagging:同樣的,它也是組合多個弱學習器形成一個強學習器,但它各個弱學習器之間沒有依賴關系,而且可以并行擬合。
2、bagging流派算法簡介
(1)算法結(jié)構(gòu)圖
(2)算法步驟
🌳從原始樣本集(包含M個樣本)中抽取k個采樣集
每個采樣集的生成是使用隨機采樣(bootsrap)的方法抽取M個訓練樣本(有放回的抽樣:所以可能被重復抽取)
進行k輪抽取,得到k個采樣集。(k個采樣集之間是相互獨立的)
🌳分別對這k個采樣集進行訓練形成對應的k個弱學習器
🌳將這k個弱學習器模型輸出通過結(jié)合策略得到最終的模型輸出
結(jié)合策略:
對于分類問題:通常使用簡單投票法,得到最多票數(shù)的類別或者類別之一為最終的模型輸出。
對于回歸問題:通常使用簡單平均法,對k個弱學習器得到的回歸結(jié)果進行算術(shù)平均得到最終的模型輸出。
(3)OOB(袋外數(shù)據(jù))& 泛化能力
🌳OOB:即Out of Bag(袋外數(shù)據(jù))
上面我們提到“每個采樣集的生成是使用隨機采樣(bootsrap)的方法抽取M個訓練樣本”。
那么原始數(shù)據(jù)集中任意一個樣本被抽取出來的概率是1/M,沒被抽取出來的概率為1-1/M。
那么M次采樣都沒抽中的概率就為
當m→∞時,p→1/e,約等于0.368
那么在每輪采樣集的生成中大約有36.8%的數(shù)據(jù)沒有被采樣集采集中,這部分數(shù)據(jù)被稱為袋外數(shù)據(jù)。
🌳OOB的作用
因為這些數(shù)據(jù)沒有參與采樣集模型的擬合,所以可以用來檢測模型的泛化能力
🌳泛化能力
由于Bagging算法每次都進行采樣來訓練模型,因此泛化能力很強,對降低模型的方差很有效。當然對于訓練集(采樣集)的擬合程度就會差一些,也就是模型的偏差會大一些。
二、RF模型算法原理
1、RF Vs bagging
RF用了改進的CART決策樹來作為弱學習器
(1)CART決策樹
CART決策樹是在給定輸入隨機變量X的條件下輸出隨機變量Y的條件概率分布的學習方法
CART假設決策樹全是二叉樹(即其結(jié)點只有兩種選擇:“是” or “否”):決策樹遞歸二分每個特征,最終得到?jīng)Q策樹,通過不斷的劃分,將特征空間劃分為有限個單元,并在這些單元上確定預測的概率分布
因此CART就是遞歸構(gòu)建二叉樹,但是對于分類和回歸問題使用的策略是不一樣的:
對于回歸樹使用的是平方誤差最小;而對于分類樹使用的是基尼指數(shù)最小化準則()
(2)RF中的CART決策樹
普通決策樹:在節(jié)點上所有的n個樣本特征中選擇一個最優(yōu)特征來作為決策樹的左右子樹劃分
RF:隨機選擇節(jié)點上的一部分樣本特征,假設為t個特征(t<n),然后在這些隨機選擇樣本特征中,選擇一個最優(yōu)的特征來作為決策樹的左右子樹劃分,這樣進一步增強了模型的泛化能力
t越小——模型越穩(wěn)定(模型方差變小),但對于訓練集的擬合程度會變差(偏差變大)
所以在實際案例中,一般會通過交叉驗證調(diào)參獲取一個合適的t
注:分類問題中,t默認取;回歸問題中,默認取M/3
2、算法步驟
(1)從原始樣本集(包含M個樣本)中抽取k個采樣集
每個采樣集的生成是使用隨機采樣(bootsrap)的方法抽取M個訓練樣本(有放回的抽樣:所以可能被重復抽取)
進行k輪抽取,得到k個采樣集。(k個采樣集之間是相互獨立的)
(2)分別對這k個采樣集進行訓練形成對應的k個弱學習器
在訓練決策樹模型的節(jié)點的時候, 在節(jié)點上所有樣本特征中選擇一部分樣本特征(選中了就不放回了),在這部分樣本特征中選擇一個最優(yōu)的特征來作為決策樹的左右子樹劃分
判斷特征的重要性:
🎈對整個隨機森林,得到相應OOB,然后計算OOB誤差,記為errOOB1
🎈隨機對OOB所有樣本的特征X加入噪聲干擾(即可以隨機改變樣本在特征X處的值),再次計算袋外數(shù)據(jù)誤差,記為errOOB2
🎈假設森林中有N棵樹,則特征X的重要性 = (∑errOOB2?errOOB1)/N
(3)將這k個弱學習器模型輸出通過結(jié)合策略得到最終的模型輸出
結(jié)合策略:
對于分類問題:通常使用簡單投票法,得到最多票數(shù)的類別或者類別之一為最終的模型輸出。(RF通常處理的是分類問題)
對于回歸問題:通常使用簡單平均法,對k個弱學習器得到的回歸結(jié)果進行算術(shù)平均得到最終的模型輸出。
剛剛不是說有OOB嘛~派上用場啦
🌳對OOB樣本中的每個樣本,計算對應決策樹對它的分類情況;
🌳然后以簡單多數(shù)投票作為該樣本的分類結(jié)果;
🌳最后用誤分個數(shù)占樣本總數(shù)的比率作為隨機森林的oob誤分率。
三、RF模型的優(yōu)缺點
1、優(yōu)點
RF善于處理高維數(shù)據(jù),特征遺失數(shù)據(jù),和不平衡數(shù)據(jù)
(1)訓練可以并行化,速度快
(2)對高維數(shù)據(jù)集的處理能力強,它可以處理成千上萬的輸入變量,并確定最重要的變量,因此被認為是一個不錯的降維方法。
(3)在訓練集缺失數(shù)據(jù)時依舊能保持較好的精度(原因:RF隨機選取樣本和特征;RF可以繼承決策樹對缺失數(shù)據(jù)的處理方式)
(4)泛化能力強,因為隨機
2、缺點
(1)在解決回歸問題時效果不是很好
RF不能給出一個連續(xù)的輸出,而且RF不能做出超越訓練集數(shù)據(jù)范圍的預測,這可能會導致在訓練含有某些特定噪聲的數(shù)據(jù)時出現(xiàn)過擬合
(2)對特征數(shù)比較少的數(shù)據(jù),它的隨機性不好發(fā)揮,效果不太好
四、RF的變式——extra trees?
改進點:
1、extra trees的每個決策樹采用原始訓練集
2、extra trees隨機選擇一個特征值來劃分決策樹
五、代碼實現(xiàn)RF模型
我們可以調(diào)用sklearn里面現(xiàn)成的RF模型來實現(xiàn)
🌳首先導入所需要的庫
import numpy as np import pandas as pd from sklearn.ensemble import RandomForestClassifier #導入隨機森林模型 from sklearn.datasets import load_boston #讓我們利用sklearn里現(xiàn)有的boston數(shù)據(jù) from sklearn.model_selection import train_test_split#用來進行訓練集和測試集的自動分配🌳我們這里使用sklearn里的boston數(shù)據(jù)
boston = load_boston()#導入boston數(shù)據(jù)🌳我們把數(shù)據(jù)變成DataFrame類型,這樣比較好處理,我們看起來也比較清晰
bos = pd.DataFrame(boston.data, columns = boston.feature_names) bos['MEDV'] = boston.target print(bos) print(bos.columns)數(shù)據(jù)變成這樣
🌳讓我們把數(shù)據(jù)變?yōu)閚umpy類型再送進train_test_split進行訓練集和測試集的分配
y = np.array(bos['MEDV']) #目標 x = bos.drop(['MEDV'], axis=1)#去除目標后的所有數(shù)據(jù)作為輸入 x = np.array(x) x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.2)#分成80%訓練,20%測試?🌳模型配置并訓練
rf = RandomForestClassifier(n_estimators=10000, random_state=0, n_jobs=-1)#RF模型設置 rf.fit(x_train, y_train.astype('int'))#把數(shù)據(jù)送進去訓練🎈RandomForestClassifier函數(shù)
n_estimators?:森林里決策樹的數(shù)目,默認是10
random_state:隨機數(shù)生成器使用的種子
n_jobs:用于擬合和預測的并行運行的工作數(shù)量。如果值為-1,那么工作數(shù)量被設置為核的數(shù)量
🌳輸出預測后的每個特征對于MEDV的重要性
a = rf.feature_importances_ print(boston.feature_names) print("重要性:",a)預測結(jié)果
歡迎大家在評論區(qū)批評指正,謝謝大家~
總結(jié)
以上是生活随笔為你收集整理的RF模型(随机森林模型)详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Eclipse: select at l
- 下一篇: 截取图片生成头像插件