GBDT(回归树)原理详解与python代码实现
GBDT算法
- 1、算法原理
- 2、對數(shù)據(jù)的要求
- 3、算法的優(yōu)缺點
- 4、算法需要注意的點
- 5、python代碼實現(xiàn)(待更......)
- 導(dǎo)入相關(guān)包
- 讀取數(shù)據(jù)并預(yù)處理
- 訓(xùn)練及評估
1、算法原理
步驟:
1、初始f0(x)f_0(x)f0?(x):
| 0 | 1.1 | 1.475 | -0.375 |
| 1 | 1.3 | 1.475 | -0.175 |
| 2 | 1.7 | 1.475 | -0.225 |
| 3 | 1.8 | 1.475 | -0.325 |
2、以殘差作為樣本真實值訓(xùn)練f1(x)f_1(x)f1?(x):
| 0 | 5 | 20 | -0.375 |
| 1 | 7 | 30 | -0.175 |
| 2 | 21 | 70 | -0.225 |
| 3 | 30 | 60 | -0.325 |
| 年齡5 | /// | 0、1、2、3 | 0 | 0.327 | 0.327 |
| … | … | … | … | … | … |
| 體重70 | 0、1、3 | 2 | 0.260 | 0 | 0.260 |
- 選出SEsumSE_{sum}SEsum?最小的分裂,以此類推,達到第一棵樹終止條件
- 建成第一棵樹,重新使用樣本建第二棵樹(使用第一棵樹的殘差),建立的樹滿足終止條件
- 預(yù)測f(x)=f0(x)+f1(x)+....+fn(x)?learning_ratef(x)=f_0(x)+f_1(x)+....+f_n(x)*learning\_ratef(x)=f0?(x)+f1?(x)+....+fn?(x)?learning_rate
2、對數(shù)據(jù)的要求
與cart類似 https://blog.csdn.net/weixin_41851055/article/details/106234426
3、算法的優(yōu)缺點
一、優(yōu)點:
- 預(yù)測精度高
- 適合低維數(shù)據(jù)
- 能處理非線性數(shù)據(jù)與各種類型數(shù)據(jù)(離散(one_hot) or 連續(xù))
二、缺點:
- 由于弱學(xué)習(xí)器之間存在依賴關(guān)系,難以并行訓(xùn)練數(shù)據(jù)
- 數(shù)據(jù)維度較高會加大算法的計算復(fù)雜度
4、算法需要注意的點
GBDT分裂規(guī)則
選取使得誤差下降最多的(均方差則選SEsumSE_{sum}SEsum?最小的)。終止條件:節(jié)點分裂最小樣本數(shù)、樹最大深度、最大葉子節(jié)點數(shù)、min(loss)
GBDT如何正則化
1、Shrinkage(步長)+最大迭代次數(shù)
2、Subsample(子采樣):采用不放回采樣(值為1則全部使用)
3、正則化剪枝
GBDT梯度提升體現(xiàn)在哪
每一棵樹基于上一棵樹的loss進行梯度下降
GBDT如何做特征選擇(重要性)
每棵樹的加權(quán)平均
GBDT為什么用回歸樹而不用分類樹
GBDT主要以殘差逼近的方式,這一點和回歸樹輸出連續(xù)值不謀而合,如果為分類男+男+女=到底是男還是女
GBDT為什么較RF淺
1、GBDT主要降低bias(模型的泛化能力),串行保證了降低bias。即GBDT中基分類器需要低方差(variance)。即簡單的樹
2、RF主要降低variance(模型的穩(wěn)定性),因此RF中的基分類器需要低偏差的bias。即樹的深度較深
GBDT哪些部分可以并行
1、計算每個樣本的負梯度
2、分裂挑選最佳特征及節(jié)點分割時,對特征計算相應(yīng)誤差及均值時
3、更細每個樣本負梯度
4、最后預(yù)測將之前所有樹的結(jié)果相加
GBDT與RF的區(qū)別
1、RF的樹可回歸可分類,GBDT只能回歸樹
2、RF樹獨立,互不影響可并行;GBDT樹依賴,串行
3、RF由多棵樹表決,GBDT由多棵樹累加;RF對異常值不敏感,GBDT則很敏感(當(dāng)前錯誤影響下一棵樹)
5、RF不需要數(shù)據(jù)預(yù)處理,GBDT需要進行特征歸一化
GBDT如何用于分類
https://zhuanlan.zhihu.com/p/46445201
5、python代碼實現(xiàn)(待更…)
導(dǎo)入相關(guān)包
import pandas as pd import numpy as np from sklearn.ensemble import GradientBoostingClassifier from sklearn.metrics import roc_curve,auc from sklearn import metrics from sklearn.model_selection import GridSearchCV from sklearn.preprocessing import LabelEncoder讀取數(shù)據(jù)并預(yù)處理
#讀取數(shù)據(jù) data = pd.read_excel(r'E:/wyz/Desktop/data/data.xlsx') #將數(shù)據(jù)集中的字符串轉(zhuǎn)化為代表類別的數(shù)字。因為sklearn的決策樹只識別數(shù)字 le = LabelEncoder() for col in data_model.columns: data_model[col] = le.fit_transform(data_model[col].astype(str)) #劃分數(shù)據(jù)集(3、7劃分) 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) #標(biāo)準(zhǔn)化數(shù)據(jù) ss_x = StandardScaler() ss_y = StandardScaler() x_train = ss_x.fit_transform(x_train) x_test = ss_x.transform(x_test)訓(xùn)練及評估
model_GBDT = GradientBoostingClassifier(random_state=10) model_GBDT.fit(x_train,y_train) y_pred = gbm0.predict(x_train) y_predprob = model_GBDT.predict_proba(x_train)[:,1] print ("Accuracy : %.4g" % metrics.accuracy_score(y.values, y_pred)) print ("AUC Score (Train): %f" % metrics.roc_auc_score(y, y_predprob)) 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的GBDT(回归树)原理详解与python代码实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 决策树原理详解及python代码实现
- 下一篇: 随机森林原理详解及python代码实现