赞
踩
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))
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。