决策树是一种自上向下,对样本数据进行树形分类的过程。结点分为内部结点和叶节点。每个内部结点代表一个特征,叶节点代表类别。从顶部根节点开始,所有样本聚在一起。经过根节点的划分,样本被划分到不同子节点,再根据子节点特征进一步划分,直到所有样本都被归到某一个类别(叶节点)。
决策树可用于分类与回归问题,应用于集成学习可得到随机森林、GBDT等模型。简单直观、可解释性强。
决策树的生成过程包含了特征选择、树的构造、树的剪枝三个过程。
我们既希望决策树能够拟合数据,有良好分类效果。也希望控制复杂度,有一定泛化效果。
常见决策树算法有ID3、C4.5、CART
所谓的最大信息增益是指选择能够带来最大的信息增益的那个特征
信息熵是衡量样本集合纯度最常用的方法。
对于样本集合D,类别数为K,其中 C k C_k Ck是D中第k类的样本子集,| C k C_k Ck|是该子集元素个数,|D|表示样本中元素个数。信息熵表示为:
E n t ( D ) = − ∑ k = 1 K ∣ C k ∣ ∣ D ∣ l o g 2 ∣ C k ∣ ∣ D ∣ Ent(D) = -\sum_{k=1}^{K}\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|} Ent(D)=−∑k=1K∣D∣∣Ck∣log2∣D∣∣Ck∣ .
然后计算某个特征A对于数据集D的信息经验熵 E n t ( D ∣ A ) Ent(D|A) Ent(D∣A)为:
E n t ( D ∣ A ) = ∑ i = 1 n ∣ D i ∣ ∣ D ∣ E n t ( D i ) Ent(D|A)=\sum_{i=1}^n\frac{|D_i|}{|D|}Ent(D_i) Ent(D∣A)=∑i=1n∣D∣∣Di∣Ent(Di)
于是信息增益可以表示为二者之差。
G a i n ( D , A ) = E n t ( D ) − E n t ( D ∣ A ) Gain(D,A)=Ent(D)-Ent(D|A) Gain(D,A)=Ent(D)−Ent(D∣A)
选取信息增益最大的特征作为根节点进行划分。继续进行划分。
最大信息增益方法对于可选值较多的方法偏好较大,因其纯度较大。改进方法是使用最大信息增益率。
G a i n r a t i o ( D , A ) = G a i n ( D , A ) I V ( A ) Gain_ratio(D,A)=\frac{Gain(D,A)}{IV(A)} Gainratio(D,A)=IV(A)Gain(D,A)
其中 I V ( A ) = − − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ IV(A)=--\sum_{v=1}^{V}\frac{|D_v|}{|D|}log_2\frac{|D_v|}{|D|} IV(A)=−−∑v=1V∣D∣∣Dv∣log2∣D∣∣Dv∣
V为该属性可取值的数目。
直观来看,基尼指数反映了从数据集中随机抽取两个样本,其类别不一致的概率。Gini越小,数据纯度越高。
G i n i ( D ) = 1 − ∑ k = 1 n ∣ c k ∣ ∣ D ∣ 2 Gini(D)=1-\sum_{k=1}^{n}{\frac{|c_k|}{|D|}}^2 Gini(D)=1−∑k=1n∣D∣∣ck∣2
属性A的基尼系数定义为: G i n i ( D ∣ A ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D V ) Gini(D|A)=\sum_{v=1}^{V}\frac{|D_v|}{|D|}Gini(D^V) Gini(D∣A)=∑v=1V∣D∣∣Dv∣Gini(DV)
CART每次选取使基尼系数最小的特征。
最大信息增益方法对于可选值较多的方法偏好较大,因其纯度较大。信息增益比对较多值进行惩罚。提供泛化能力。
ID3只能处理离散变量。C4.5和CART都能处理连续。CART处理连续是将其转为离散。
ID3和C4.5只能分类任务。CART可以回归。
ID3对缺失值敏感,C4.5和CART可以处理缺失值。
决策树容易过拟合,需要剪枝。分为预剪枝和后剪枝。
预剪枝核心思想在于对树中节点扩展之前,先计算当前划分能否带来模型泛化能力的提升。若不能,则不再继续生长子树。
后剪枝核心思想先让算法生成一个完全生长的决策树,然后自底向上计算是否剪枝。剪枝过程将子树切除,用叶节点代替。也可以在验证集上,判断能否提升验证集准确率来决定是否剪枝。
引言
梯度提升决策树(Gradient Boosting Decision Tree,GBDT)是Boosting算法中非常流行的一个。GBDT非常好地体现了“从错误中学习”的理念,基于决策树预测的残差进行迭代的学习。
集成学习的两大框架:Bagging和Boosting。Bagging并行化,每个弱分类器可以独立地进行训练,而Boosting弱分类器需要一次生成。在每一轮迭代中,基于已生成的弱分类器集合(即当前模型)的预测结果,新的分类器重点关注那些没有被预测正确的样本。
Gradient Boosting是Boosting中的一大类算法,其基本思想是根据当前模型损失函数的负梯度信息来训练新加入的弱分类器,然后把训练好的分类器以累加的形式加入到现有模型中去。
Gradient Boosting的流程:在每一轮迭代中,首先计算出当前模型在所有样本上的负梯度,然后以该值为目标训练出一个新的弱分类器进行拟合并计算出该弱分类器的权重。最终实现对模型的更新。
采用决策树作为弱分类器的Gradient Boosting算法称为GBDT。GBDT中使用的决策树通常为CART。
由于GBDT是利用残差训练的。预测过程需要把所有树的预测值加起来,得到最后的预测结果。
XGBoost是一个开源机器学习项目,高效实现了GBDT算法并进行了许多改进。
时间紧迫 先附上参考
1
BGD 采用整个训练集的数据来计算 cost function 对参数的梯度:
缺点:
由于这种方法是在一次更新中,就对整个数据集计算梯度,所以计算起来非常慢,遇到很大量的数据集也会非常棘手,而且不能投入新数据实时更新模型
和 BGD 的一次用所有数据计算梯度相比,SGD 每次更新时对每个样本进行梯度更新,对于很大的数据集来说,可能会有相似的样本,这样 BGD 在计算梯度时会出现冗余,而 SGD 一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。
缺点
SGD的噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。虽然包含一定的随机性,但是从期望上来看,它是等于正确的导数的。
SGD 因为更新比较频繁,会造成 cost function 有严重的震荡。
MBGD 每一次利用一小批样本,即 n 个样本进行计算,这样它可以降低参数更新时的方差,收敛更稳定,另一方面可以充分地利用深度学习库中高度优化的矩阵操作来进行更有效的梯度计算。
和 SGD 的区别是每一次循环不是作用于每个样本,而是具有 n 个样本的批次。
缺点
SGD 在 ravines 的情况下容易被困住, ravines 就是曲面的一个方向比另一个方向更陡,这时 SGD 会发生震荡而迟迟不能接近极小值:
梯度更新规则:
Momentum 通过加入 γv_t−1 ,可以加速 SGD, 并且抑制震荡
加入的这一项,可以使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,这样就可以加快收敛并减小震荡。
这个算法就可以对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性,例如识别 Youtube 视频里面的猫,训练 GloVe word embeddings,因为它们都是需要在低频的特征上有更大的更新。
Adagrad 的优点是减少了学习率的手动调节.
缺点:
它的缺点是分母会不断积累,这样学习率就会收缩并最终会变得非常小。
RMSprop 和 Adadelta 都是为了解决 Adagrad 学习率急剧下降问题的,
这个算法是另一种计算每个参数的自适应学习率的方法。相当于 RMSprop + Momentum
时间紧迫 先附上参考
1
他们都是可以防止过拟合,降低模型复杂度
L1是在loss function后面加上模型参数的1范数(也就是|xi|)
L2是在loss function后面加上模型参数的2范数(也就是sigma(xi^2))
L1 会产生稀疏的特征,L2 会产生更多地特征但是都会接近于0。L1在特征选择时候非常有用,而L2就只是一种规则化而已。
L1对应拉普拉斯分布,L2对应高斯分布。
发现拉普拉斯分布跟正太分布很相似,但是拉普拉斯分布比正太分布有尖的峰和轻微的厚尾。
L1不可导可以使用Proximal Algorithms或者ADMM来解决。
L1、L2正则化是通过改动代价函数来实现的,而Dropout则是通过改动神经网络本身来实现的,它是在训练网络时用的一种技巧.
假设我们要训练上图这个网络,在训练開始时,我们随机地“删除”一半的隐层单元,视它们为不存在,得到例如以下的网络: