日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

随机森林原理详解及python代码实现

發(fā)布時(shí)間:2024/1/23 python 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机森林原理详解及python代码实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

隨機(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ù)詳解

參數(shù)默認(rèn)值及輸入類型介紹
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)值:GiniCART樹(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。