目录
GDBT
GDBT(gradient boosting decision tree):全名为梯度提升树,内部子树为CART树,基于Boosting集成思想提出的。
1概念:
GBDT的原理很简单,就是所有弱分类器的结果相加等于预测值,然后下一个弱分类器去拟合误差函数对预测值的残差(这个残差就是预测值与真实值之间的误差,在使用MSE时,)。当然了,它里面的弱分类器的表现形式就是各棵树。
举一个非常简单的例子,比如我今年30岁了,但计算机或者模型GBDT并不知道我今年多少岁,那GBDT咋办呢?
- 它会在第一个弱分类器(或第一棵树中)随便用一个年龄比如20岁来拟合,然后发现误差有10岁;
- 接下来在第二棵树中,设置当前预测值为10岁,用当前树用拟合10岁,发现差距还有4岁;
- 接着在第三棵树中拟合残差4岁,发现差距只有1岁了;
- 最后在第四课树中用1岁拟合剩下的残差,完美。
- 最终,四棵树的结论加起来,就是真实年龄30岁(实际工程中,gbdt是计算负梯度,用负梯度近似残差)。
为何gbdt可以用用负梯度近似残差呢?
回归任务下,GBDT 在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数,
那此时的负梯度是这样计算的
所以,当损失函数选用均方损失函数是时,每一次拟合的值就是(真实值 - 当前模型预测的值),即残差。此时的变量是y',即“当前预测模型的值”,也就是对它求负梯度。在神经网络中梯度优化是以具体参数更细为代表,而在GDBT中,是以树这种模型空间代替参数来进行更新的。
注意:GBDT做分类时,每一次迭代需要有k棵树,k是类别数目,每棵树对一个类别进行预测。每个叶子节点也只是输出一个值,可把这颗树看作一个函数f,f将输入样本的特征映射为该值。(注意,该值并不是类别的概率,概率还需要一个logistic转化,logistic regression是:特征x先转化成实值z,然后z经过logistic regression转化成概率p(x),这里叶子节点的值相当于z)。
2. GBDT的优点和局限性有哪些?
2.1 优点
- 预测阶段的计算速度快,树与树之间可并行化计算。
- 在分布稠密的数据集上,泛化能力和表达能力都很好,这使得GBDT在Kaggle的众多竞赛中,经常名列榜首。
- 采用决策树作为弱分类器使得GBDT模型具有较好的解释性和鲁棒性,能够自动发现特征间的高阶关系,并且也不需要对数据进行特殊的预处理如归一化等。
2.2 局限性
- GBDT在高维稀疏的数据集上,表现不如支持向量机或者神经网络。
- GBDT在处理文本分类特征问题上,相对其他模型的优势不如它在处理数值特征时明显。
- 训练过程需要串行训练,只能在决策树内部采用一些局部并行的手段提高训练速度。
3. RF(随机森林)与GBDT之间的区别与联系
相同点:
都是由多棵树组成,最终的结果都是由多棵树一起决定。
不同点:
- 组成随机森林的树可以分类树也可以是回归树,而GBDT只由回归树组成
- 组成随机森林的树可以并行生成,而GBDT是串行生成
- 随机森林的结果是多数表决表决的,而GBDT则是多棵树累加之和
- 随机森林对异常值不敏感,而GBDT对异常值比较敏感
- 随机森林是减少模型的方差,而GBDT是减少模型的偏差
- 随机森林不需要进行特征归一化。而GBDT则需要进行特征归一化
4. 调参优化
代码调优:参考
参数优化:
loss : {'deviance 对数损失 - sum(log(pi**pi))', 'exponential 指数损失 e**(-y*f(x))'},(默认='deviance')
learning_rate : float, optional (default=0.1),每棵按照学习率做缩减
n_estimators : int (default=100),迭代次数
max_depth : integer, optional (default=3),树的最大深度,限制了每棵树的叶子节点数目
criterion : string, optional (default="friedman_mse"),分裂标准,默认为均方误差
min_samples_split : int, float, optional (default=2),节点分裂时需要的最小样本数目
min_samples_leaf : int, float, optional (default=1),叶子节点最小样本数目,预剪枝
subsample : float, optional (default=1.0),样本采样率
max_features : int, float, string or None, optional (default=None),寻找最优分裂特征时需要的特征数量
min_impurity_split : float,停止生长阈值,预剪枝
max_leaf_nodes : int or None, optional (default=None),叶子节点最大数目
min_impurity_decrease : float, optional (default=0.),节点分裂阈值
feature_importances_ : array, shape = [n_features],特征重要性
oob_improvement_ : array, shape = [n_estimators],损失变化列表
train_score_ : array, shape = [n_estimators],训练样本得分
loss_ : LossFunction,损失函数