AdaBoost训练弱分类器关注的是那些被分错的样本,AdaBoost每一次训练都是为了减少错误分类的样本。而GBDT训练弱分类器关注的是残差,也就是上一个弱分类器的表现与完美答案之间的差距,GBDT每一次训练分类器,都是为了减少这个差距。
GBDT的原理就是所有弱分类器的结果相加等于预测值,然后下一个弱分类器去拟合误差函数对预测值的残差(这个残差就是预测值与真实值之间的误差)。当然了,它里面的弱分类器的表现形式就是各棵树。树只能为回归树。
实例:
- A: 14岁高一学生,购物较少,经常问学长问题,预测年龄A = 15 – 1 = 14
- B: 16岁高三学生,购物较少,经常被学弟问问题,预测年龄B = 15 + 1 = 16
- C: 24岁应届毕业生,购物较多,经常问师兄问题,预测年龄C = 25 – 1 = 24
- D: 26岁工作两年员工,购物较多,经常被师弟问问题,预测年龄D = 25 + 1 = 26
所以,GBDT需要将多棵树的得分累加得到最终的预测得分,且每一次迭代,都在现有树的基础上,增加一棵树去拟合前面树的预测结果与真实值之间的残差。
sklearn中GBDT的引入:
from sklearn.ensemble import GradientBoostingClassifier # 全部参数 GradientBoostingClassifier(ccp_alpha=0.0, criterion='friedman_mse', init=None, learning_rate=0.1, loss='deviance', max_depth=3, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_iter_no_change=None, presort='deprecated', random_state=None, subsample=1.0, tol=0.0001, validation_fraction=0.1, verbose=0, warm_start=False)
重要参数
loss
字符串类型,默认值’deviance’。用于指定损失函数:
‘deviance’:对数损失函数
‘exponential’:指数损失函数,只能用于二分类。
learning_rate
数值型,默认值0.1。用于指定学习率,调参方法:
给定 learning_rate 较小的值,例如0.1。
根据验证集准确率以10倍为单位增大或者减小参数值。
在找到合适的数量级后,在此数量级上微调。
合适的候选值:[0.001, 0.01, 0.1, 1]
subsample
数值型,默认值1。指定采样出 subsample * n_samples 个样本用于训练弱学习器。注意这里的子采样和随机森林不一样,随机森林使用的是放回抽样,而这里是不放回抽样。 取值在(0, 1)之间,设置为1表示使用所有数据训练弱学习器。如果取值小于1,则只有一部分样本会去做GBDT的决策树拟合。选择小于1的比例可以减少方差,即防止过拟合,但是会增加样本拟合的偏差,因此取值不能太低。
推荐的取值为:[0.5, 0.6, 0.7, 0.8, 0.9, 1]
n_estimators
数值型参数,默认值为100,此参数指定了弱分类器的个数。设置的值越大,精确度越好,但是当 n_estimators 大于特定值之后,带来的提升效果非常有限。
推荐的参数值为:[120, 300, 500, 800, 1200]
criterion
字符串类型,默认值为 ‘gini’。这个参数指定划分子树的评估标准:
‘entropy’,使用基于信息熵的方法,即计算信息增益
‘gini’,使用基尼系数(Gini Impurity)
**推荐设置为 ‘gini’,**因为(1)基尼系数的计算过程相对简单,而计算信息增益需要进行对数运算。(2)使用信息增益作为划分标准时,在使用高纬度数据或者噪声很多的数据时容易过拟合。
max_depth
数值型,默认值3。这是与剪枝相关的参数,设置为None时,树的节点会一直分裂,直到:(1)每个叶子都是“纯”的;(2)或者叶子中包含⼩于min_sanples_split个样本。
推荐从 max_depth = 3 尝试增加,观察是否应该继续加大深度。
合适的取值可以是 [3, 5, 8, 15, 25, 30, None]
如果max_leaf_nodes参数非None,则忽略此项
min_samples_leaf
数值型,默认值1,指定每个叶子结点包含的最少的样本数。参数的取值除了整数之外,还可以是浮点数,此时(min_samples_leaf * n_samples)向下取整后的整数是每个节点的最小样本数。
此参数设置的过小会导致过拟合,反之就会欠拟合。调整过程:
从min_samples_leaf=5开始上下调整。
对于类别不多的分类问题,设置为1通常是合理的选择。
当叶节点包含样本数量差异很大时,建议设置为浮点数。
推荐的取值可以是:[1, 2, 5, 10]
min_samples_split
数值型,默认值2,指定每个内部节点(非叶子节点)包含的最少的样本数。与min_samples_leaf这个参数类似,可以是整数也可以是浮点数。
推荐的取值是:[1, 2, 5, 10, 15, 100]
max_features
可以为整数、浮点、字符串,默认值为None。此参数用于限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃。
如果是整数,则每次切分只考虑max_features个特征。
如果是浮点数,每次切分只考虑max_features*n_features个特征(max_features指定百分⽐)。
如果是字符串‘auto’,则max_features等于n_features。
如果是字符串‘sqrt’,则max_features等于sqrt(n_features)。
如果是字符串‘log2’,则max_features等于log2(n_features)。
如果是字符串None,则max_features等于n_features。
推荐的取值为:[‘log2’, ‘sqrt’, None]
verbose
数值类型,默认值为0,表示不输出日志。如果为1,则每次迭代输出一次日志。如果大于1,则每间隔 verbose 此迭代输出一次日志。
重要属性
1,feature_importances_ ,给出了各个特征对模型的重要性。
2,estimators_,一个数组,给出了每个弱学习器。
重要方法
1,fit(X, y) : 训练模型。
2,predict(X) : 用模型预测,返回预测值。
3,predict_proba(X) : 返回一个数组,数组元素依次为各个样本属于各个类别的概率值。
4,score(X, y) : 返回在(X, y)上预测的准确率(accuracy)。
从sklearn引入GBDT回归:
from sklearn.ensemble import GradientBoostingRegressor # 所有参数 GradientBoostingRegressor(alpha=0.9, ccp_alpha=0.0, criterion='friedman_mse', init=None, learning_rate=0.1, loss='ls', max_depth=3, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=100, n_iter_no_change=None, presort='deprecated', random_state=None, subsample=1.0, tol=0.0001, validation_fraction=0.1, verbose=0, warm_start=False)
与GBDT分类树相比较,主要是下面的参数存在区别:
loss:
字符串类型,默认值为 ‘ls’,实际可选的有:
‘ls’:此时损失函数为平方损失函数,使用最小二乘回归。
‘lad’:此时使用指数绝对值损失函数。
‘huber’:此时损失函数为上述两者的综合,即误差较小时,采用平方损失,在误差较大时,采用绝对值损失。
‘quantile’:分位数回归(分位数指的是百分之几),采用绝对值损失。
criterion:
字符串类型,默认值为 ‘friedman_mse’,是衡量回归效果的指标。可选的有:
‘friedman_mse’:改进型的均方误差
‘mse’:标准的均方误差
‘mae’:平均绝对误差
除了这两个参数之外,其他参数、属性、方法的含义与用法与上文提到的GBDT分类器的参数基本一致。