随机森林原理详解及python代码实现
隨機(jī)森林(RF)算法
- 1、算法原理
- 2、對(duì)數(shù)據(jù)的要求(無(wú)需規(guī)范化)
- 3、算法的優(yōu)缺點(diǎn)
- 4、算法需要注意的點(diǎn)
- 5、python代碼實(shí)現(xiàn)(待更......)
- 導(dǎo)入相關(guān)包
- 讀取數(shù)據(jù)并預(yù)處理(必須處理缺失值)
- 訓(xùn)練
- 評(píng)估
1、算法原理
步驟(booststrap sampling):
1、從數(shù)據(jù)集中有放回的隨機(jī)抽m個(gè)樣本
2、從樣本中選取n個(gè)特征進(jìn)行建樹(shù)
3、重復(fù)1-2
2、對(duì)數(shù)據(jù)的要求(無(wú)需規(guī)范化)
與cart類似 https://blog.csdn.net/weixin_41851055/article/details/106234426
3、算法的優(yōu)缺點(diǎn)
一、優(yōu)點(diǎn):
- 有效解決決策樹(shù)的過(guò)擬合
- 能輸出變量重要性
- 容易理解并且效果好
- 具有很好的抗躁能力
二、缺點(diǎn):
- 小數(shù)據(jù)集及低維度效果一般
- 速度較單個(gè)決策樹(shù)慢
- 隨機(jī)生成、結(jié)果不穩(wěn)定(KPI值較大)
4、算法需要注意的點(diǎn)
隨機(jī)森林不易過(guò)擬合的原因
1、兩個(gè)隨機(jī)抽樣
2、bagging集成算法
隨機(jī)森林特征重要性原理
1、使用OOB(貸外數(shù)據(jù))計(jì)算貸外數(shù)據(jù)誤差(errorB1)(一棵樹(shù))
2、隨機(jī)對(duì)特征x加入噪聲干擾(改變特征x的值等),再次計(jì)算貸外數(shù)據(jù)誤差(errorB2)(一棵樹(shù))
3、importance=1N∑i=1N(errorB2?errorB1)importance=\frac{1}{N}\sum_{i=1}^N(errorB2-errorB1)importance=N1?∑i=1N?(errorB2?errorB1) NNN為隨機(jī)森林總的棵數(shù)
RF為什么隨機(jī)抽樣/隨機(jī)特征
保證基分類器多樣性,增加泛化能力與抗躁能力
為什么有放回抽樣
分布不同,使各棵決策樹(shù)差異性很大
RF需要剪枝與限制樹(shù)的深度嗎
不需要
RF為什么比bagging效率高
可并行實(shí)現(xiàn)而且引入了兩個(gè)隨機(jī)
5、python代碼實(shí)現(xiàn)(待更…)
導(dǎo)入相關(guān)包
import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder #分類變量編碼包 from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeClassifier import variable_iv as vi import Logistic_model as lm from sklearn.ensemble import RandomForestClassifierimport os os.chdir('E:/wyz/Desktop/rf/')讀取數(shù)據(jù)并預(yù)處理(必須處理缺失值)
data = pd.read_excel('ceshi.xlsx',sheet_name = 'Sheet2') #分類變量編碼 from sklearn.preprocessing import LabelEncoder le = LabelEncoder() str_variable = list(data.dtypes[data.dtypes.values == object].index) for col in str_variable: data[col] = le.fit_transform(data[col].astype(str)) #在單變量分析的基礎(chǔ)上填充缺失值(看哪一組的1的比率最接近于缺失值的那一組) data['var1'] = data['var1'].fillna(0.42089) data['var2'] = data['var2'].fillna(125.854) #劃分?jǐn)?shù)據(jù)集 y = data_model['target'] x = data_model.drop('target', axis=1) x_train, x_test, y_train, y_test = train_test_split(x, y,random_state=0,train_size=0.7)訓(xùn)練
model_rf = RandomForestClassifier(n_estimators=100,#樹(shù)的數(shù)量criterion='gini',#分裂指標(biāo)max_depth=None,#樹(shù)的深度max_leaf_nodes=None,#最大葉子節(jié)點(diǎn)數(shù)量min_samples_leaf=1,#葉子最小樣本數(shù)min_samples_split=2,#分裂節(jié)點(diǎn)所需最小樣本數(shù)random_state=50, max_features = 'sqrt',#劃分時(shí)最多考慮的特征數(shù)量n_jobs=-1, verbose = 1)model_rf.fit(x_train, y_train)評(píng)估
#預(yù)測(cè)結(jié)果 rf_class = model_rf.predict(x_test) rf_prob = model_rf.predict_proba(x_test)[:, 1] # Calculate roc auc print('測(cè)試集準(zhǔn)確率: %.4f'%roc_auc_score(y_test, rf_class)) print('測(cè)試集AUC: %.4f'%roc_auc_score(y_test, rf_prob))決策樹(shù)參數(shù)詳解
| n_estimators | 默認(rèn)值:100 輸入:int | 也就是弱學(xué)習(xí)器的最大迭代次數(shù),或者說(shuō)最大的弱學(xué)習(xí)器的個(gè)數(shù)。一般來(lái)說(shuō)n_estimators太小,容易過(guò)擬合,n_estimators太大,又容易欠擬合,一般選擇一個(gè)適中的數(shù)值。在實(shí)際調(diào)參的過(guò)程中,我們常常將n_estimators和下面介紹的參數(shù)learning_rate一起考慮。 |
| oob_scorer | 默認(rèn)值:False 輸入:bool | 是否采用袋外樣本來(lái)評(píng)估模型的好壞。個(gè)人推薦設(shè)置為True,因?yàn)榇夥謹(jǐn)?shù)反應(yīng)了一個(gè)模型擬合后的泛化能力。 |
| criterion | 默認(rèn)值:Gini | CART樹(shù)做劃分時(shí)對(duì)特征的評(píng)價(jià)標(biāo)準(zhǔn)。分類模型和回歸模型的損失函數(shù)是不一樣的。分類RF對(duì)應(yīng)的CART分類樹(shù)默認(rèn)是基尼系數(shù)gini,另一個(gè)可選擇的標(biāo)準(zhǔn)是信息增益。回歸RF對(duì)應(yīng)的CART回歸樹(shù)默認(rèn)是均方差mse,另一個(gè)可以選擇的標(biāo)準(zhǔn)是絕對(duì)值差mae。一般來(lái)說(shuō)選擇默認(rèn)的標(biāo)準(zhǔn)就已經(jīng)很好的。 |
| max_features | 默認(rèn)值:None | 決策樹(shù)劃分時(shí)考慮的最大特征數(shù)max_features:可以使用很多種類型的值,默認(rèn)是”None”,意味著劃分時(shí)考慮所有的特征數(shù);如果是”log2”意味著劃分時(shí)最多考慮log2(n_features)個(gè)特征;如果是”sqrt”或者”auto”意味著劃分時(shí)最多考慮sqrt(n_features) 個(gè)特征。如果是整數(shù),代表考慮的特征絕對(duì)數(shù)。如果是浮點(diǎn)數(shù),代表考慮特征百分比,即考慮(百分比xN)取整后的特征數(shù)。其中N為樣本總特征數(shù)。一般來(lái)說(shuō),如果樣本特征數(shù)不多,比如小于50,我們用默認(rèn)的”None”就可以了,如果特征數(shù)非常多,我們可以靈活使用剛才描述的其他取值來(lái)控制劃分時(shí)考慮的最大特征數(shù),以控制決策樹(shù)的生成時(shí)間。 參數(shù)效果:max_features 值越大,模型學(xué)習(xí)能學(xué)習(xí)到的信息越多,越容易過(guò)擬合。 |
| max_depth | 決策樹(shù)最大深度max_depth, 默認(rèn)可以不輸入,如果不輸入的話,決策樹(shù)在建立子樹(shù)的時(shí)候不會(huì)限制子樹(shù)的深度。一般來(lái)說(shuō),數(shù)據(jù)少或者特征少的時(shí)候可以不管這個(gè)值。如果模型樣本量多,特征也多的情況下,推薦限制這個(gè)最大深度,具體的取值取決于數(shù)據(jù)的分布。常用的可以取值10-100之間。 參數(shù)效果:值越大,決策樹(shù)越復(fù)雜,越容易過(guò)擬合。 | |
| min_samples_split | 默認(rèn)值:2 | 內(nèi)部節(jié)點(diǎn)再劃分所需最小樣本數(shù)min_samples_split: 這個(gè)值限制了子樹(shù)繼續(xù)劃分的條件,如果某節(jié)點(diǎn)的樣本數(shù)少于min_samples_split,則不會(huì)繼續(xù)再嘗試選擇最優(yōu)特征來(lái)進(jìn)行劃分。 如果樣本量不大,不需要管這個(gè)值。如果樣本量數(shù)量級(jí)非常大,則推薦增大這個(gè)值。 參數(shù)效果:值越大,決策樹(shù)越簡(jiǎn)單,越不容易過(guò)擬合。 |
| min_samples_leaf | 默認(rèn)值:1 | 葉子節(jié)點(diǎn)最少樣本數(shù)min_samples_leaf: 這個(gè)值限制了葉子節(jié)點(diǎn)最少的樣本數(shù),如果某葉子節(jié)點(diǎn)數(shù)目小于樣本數(shù),則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝。 可以輸入最少的樣本數(shù)的整數(shù),或者最少樣本數(shù)占樣本總數(shù)的百分比。如果樣本量不大,不需要管這個(gè)值。如果樣本量數(shù)量級(jí)非常大,則推薦增大這個(gè)值。 參數(shù)效果:值越大,葉子節(jié)點(diǎn)越容易被被剪枝,決策樹(shù)越簡(jiǎn)單,越不容易過(guò)擬合。 |
| min_weight_fraction_leaf | 默認(rèn)值:0 | 葉子節(jié)點(diǎn)最小的樣本權(quán)重和min_weight_fraction_leaf:這個(gè)值限制了葉子節(jié)點(diǎn)所有樣本權(quán)重和的最小值,如果小于這個(gè)值,則會(huì)和兄弟節(jié)點(diǎn)一起被剪枝。 默認(rèn)是0,就是不考慮權(quán)重問(wèn)題。一般來(lái)說(shuō),如果我們有較多樣本有缺失值,或者分類樹(shù)樣本的分布類別偏差很大,就會(huì)引入樣本權(quán)重,這時(shí)我們就要注意這個(gè)值了。 |
| max_leaf_nodes | 默認(rèn)值:None | 最大葉子節(jié)點(diǎn)數(shù)max_leaf_nodes: 通過(guò)限制最大葉子節(jié)點(diǎn)數(shù),可以防止過(guò)擬合,默認(rèn)是”None”,即不限制最大的葉子節(jié)點(diǎn)數(shù)。如果加了限制,算法會(huì)建立在最大葉子節(jié)點(diǎn)數(shù)內(nèi)最優(yōu)的決策樹(shù)。如果特征不多,可以不考慮這個(gè)值,但是如果特征分成多的話,可以加以限制,具體的值可以通過(guò)交叉驗(yàn)證得到。 參數(shù)效果:值越小,葉子節(jié)點(diǎn)個(gè)數(shù)越少,可以防止過(guò)擬合。 |
| min_impurity_split | 默認(rèn)值:1e-7 | 節(jié)點(diǎn)劃分最小不純度min_impurity_split: 這個(gè)值限制了決策樹(shù)的增長(zhǎng),如果某節(jié)點(diǎn)的不純度(基于基尼系數(shù),均方差)小于這個(gè)閾值,則該節(jié)點(diǎn)不再生成子節(jié)點(diǎn)。即為葉子節(jié)點(diǎn) 。一般不推薦改動(dòng)默認(rèn)值1e-7。 |
| n_jobs | 這個(gè)參數(shù)告訴引擎有多少處理器是它可以使用。 “-1”意味著沒(méi)有限制,而“1”值意味著它只能使用一個(gè)處理器 | |
| random_state | 此參數(shù)讓結(jié)果容易復(fù)現(xiàn)。 一個(gè)確定的隨機(jī)值將會(huì)產(chǎn)生相同的結(jié)果,在參數(shù)和訓(xùn)練數(shù)據(jù)不變的情況下。 我曾親自嘗試過(guò)將不同的隨機(jī)狀態(tài)的最優(yōu)參數(shù)模型集成,有時(shí)候這種方法比單獨(dú)的隨機(jī)狀態(tài)更好。 | |
| oob_score | 這是一個(gè)隨機(jī)森林交叉驗(yàn)證方法。 它和留一驗(yàn)證方法非常相似,但這快很多。 這種方法只是簡(jiǎn)單的標(biāo)記在每顆子樹(shù)中用的觀察數(shù)據(jù)。 然后對(duì)每一個(gè)觀察樣本找出一個(gè)最大投票得分,是由那些沒(méi)有使用該觀察樣本進(jìn)行訓(xùn)練的子樹(shù)投票得到。 |
總結(jié)
以上是生活随笔為你收集整理的随机森林原理详解及python代码实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: GBDT(回归树)原理详解与python
- 下一篇: Xgboost算法原理详解及python