python梯度提升回归树_GBDT(回归树)原理详解与python代码实现

GBDT算法

1、算法原理

2、对数据的要求

3、算法的优缺点

4、算法需要注意的点

5、python代码实现(待更......)

导入相关包

读取数据并预处理

训练及评估

1、算法原理

步骤:

1、初始f 0 ( x ) f_0(x)f0​(x):

编号

真实值

f 0 ( 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、以残差作为样本真实值训练f 1 ( 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

划分点

小于划分点样本

大于划分点样本

S E l SE_lSEl​

S E r SE_rSEr​

S E s u m SE_{sum}SEsum​

年龄5

/ //

0、1、2、3

0

0.327

0.327

体重70

0、1、3

2

0.260

0

0.260

选出S E s u m SE_{sum}SEsum​最小的分裂,以此类推,达到第一棵树终止条件

建成第一棵树,重新使用样本建第二棵树(使用第一棵树的残差),建立的树满足终止条件

预测f ( x ) = f 0 ( x ) + f 1 ( x ) + . . . . + f n ( x ) ∗ l e a r n i n g _ r a t e f(x)=f_0(x)+f_1(x)+....+f_n(x)*learning\_ratef(x)=f0​(x)+f1​(x)+....+fn​(x)∗learning_rate

2、对数据的要求

与cart类似 https://blog.csdn.net/weixin_41851055/article/details/106234426

3、算法的优缺点

一、优点:

预测精度高

适合低维数据

能处理非线性数据与各种类型数据(离散(one_hot) or 连续)

二、缺点:

由于弱学习器之间存在依赖关系,难以并行训练数据

数据维度较高会加大算法的计算复杂度

4、算法需要注意的点

GBDT分裂规则

选取使得误差下降最多的(均方差则选S E s u m SE_{sum}SEsum​最小的)。终止条件:节点分裂最小样本数、树最大深度、最大叶子节点数、min(loss)

GBDT如何正则化

1、Shrinkage(步长)+最大迭代次数

2、Subsample(子采样):采用不放回采样(值为1则全部使用)

3、正则化剪枝

GBDT梯度提升体现在哪

每一棵树基于上一棵树的loss进行梯度下降

GBDT如何做特征选择(重要性)

每棵树的加权平均

GBDT为什么用回归树而不用分类树

GBDT主要以残差逼近的方式,这一点和回归树输出连续值不谋而合,如果为分类男+男+女=到底是男还是女

GBDT为什么较RF浅

1、GBDT主要降低bias(模型的泛化能力),串行保证了降低bias。即GBDT中基分类器需要低方差(variance)。即简单的树

2、RF主要降低variance(模型的稳定性),因此RF中的基分类器需要低偏差的bias。即树的深度较深

GBDT哪些部分可以并行

1、计算每个样本的负梯度

2、分裂挑选最佳特征及节点分割时,对特征计算相应误差及均值时

3、更细每个样本负梯度

4、最后预测将之前所有树的结果相加

GBDT与RF的区别

1、RF的树可回归可分类,GBDT只能回归树

2、RF树独立,互不影响可并行;GBDT树依赖,串行

3、RF由多棵树表决,GBDT由多棵树累加;RF对异常值不敏感,GBDT则很敏感(当前错误影响下一棵树)

5、RF不需要数据预处理,GBDT需要进行特征归一化

GBDT如何用于分类

https://zhuanlan.zhihu.com/p/46445201

5、python代码实现(待更…)

导入相关包

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

读取数据并预处理

#读取数据

data = pd.read_excel(r'E:/wyz/Desktop/data/data.xlsx')

#将数据集中的字符串转化为代表类别的数字。因为sklearn的决策树只识别数字

le = LabelEncoder()

for col in data_model.columns:

data_model[col] = le.fit_transform(data_model[col].astype(str))

#划分数据集(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)

#标准化数据

ss_x = StandardScaler()

ss_y = StandardScaler()

x_train = ss_x.fit_transform(x_train)

x_test = ss_x.transform(x_test)

训练及评估

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))

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值