一、GBDT模型介绍
梯度提升树是一个集成模型,可用于分类、回归与排序。GBDT的核心在于累加所有树的结果作为最终结果,GBDT可用于分类,并不代表是累加所有分类树的结果。GBDT中的树都是回归树(利用平方误差最小化准则,进行特征选择,生成二叉树),不是分类树,这点对理解GBDT相当重要
梯度提升树,当损失函数是平方损失时,下一棵树拟合的是上一棵树的残差值(实际值减预测值)。当损失函数是非平方损失时,拟合的是损失函数的负梯度值。
举个简单例子:
A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学。
当损失函数是平方差损失时,用残差作为全局最优的绝对方向,并不需要Gradient求解。但是损失函数多种多样,当损失函数是非平方损失时,机器学习界的大牛Freidman提出了梯度提升算法:利用最速下降的近似方法,即利用损失函数的负梯度在当前模型的值,作为回归问题中提升树算法的残差的近似值,拟合一个回归树。
特点:
-
基于简单回归决策树的组合模型
决策树的优点:
解释性强
允许变量交互作用
对离群值、缺失值、共线性不敏感决策树的缺点:
准确度不够高
易过拟合
运算量大 -
沿着梯度下降的方向进行提升
-
只接受数值型连续变量—需要做特征转化(将类别型变量转换成离散型变量)
优点:
- 准确度高
- 不易过拟合
1.该案例GBDT结构
2.GBDT常用参数
更多参数解析详见sklearn官网
GBDT框架常用参数
n_estimators:分类树的个数,K
learning_rate:即每个弱学习器的权重缩减系数 v v v,也称为步长。较小的 v v v意味着需要更多的弱学习器的迭代次数。
参数n_estimators和learning_rate要一起调参。可以从一个小一点的 v v v开始调参,默认为1,这两个参数关系相反,一个大了,另一个就小了
Subsample:(不放回)抽样率,推荐[0.5,0.8]之间,默认是1.0,即不使用子采样
init:即初始化的时候的弱学习器,一般用在对数据有先验知识,或者之前做过一些拟合的时候
loss:GBDT算法中的损失函数
max_features : {‘auto’, ‘sqrt’, ‘log2’}, int or float, default=None
寻找最佳分割时需要考虑的特性数量:
If int, then consider max_features features at each split.
If float, then max_features is a fraction and int(max_features * n_features) features are considered at each split.
If ‘auto’, then max_features=sqrt(n_features).
If ‘sqrt’, then max_features=sqrt(n_features).
If ‘log2’, then max_features=log2(n_features).
If None, then max_features=n_features.
弱分类树的参数:
max_features:划分时考虑的最大特征数
max_depth:决策树的最大深度
min_samples_split:内部节点再划分时所需的最小样本数。默认是2。如果样本量不大,就不需要管这个值。如果样本量数量级非常大,则推荐增大这个值
min_samples_leaf:叶子节点最少样本数
min_weight_fraction_leaf:叶子节点最小的样本权重。默认是0,就是不考虑权重问题。一般来说,如果我们有较多样本有缺失值,或者分类树样本的分布类别偏差很大,就会引入样本权重,这个时候就要注意这个值。
max_leaf_nodes:最大叶子节点数,通过限制最大叶子节点数,可以防止过拟合
min_impurity_split : 节点划分最小不纯度
二、分类器性能指标—AUC
如果想弄懂AUC和ROC曲线,一定要彻底理解混淆矩阵的概念!!!
混淆矩阵中有Postitive(阳性)、Negative(阴性)、False(伪)、True(真)的概念
- 预测类别为0的为Negative(阴性),预测类别为1的为Postitive(阳性)
- 预测错误的为False(伪)、预测正确为True(真)
对上述概念进行组合,就有了混淆矩阵!
ROC计算过程参见该博客
三、GBDT在流失预警模型中的应用
1.调参过程
导入模块、加载数据集、切分数据集
# 导入模块
import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import train_test_split, KFold, GridSearchCV
from sklearn import ensemble, metrics
# 读取预处理后的数据集
modelData = pd.read_csv(