上一篇在回归模型中提到了决策树,我对这一块属于小白,但又想弄懂其中的基本逻辑,于是自己翻知乎学习了@King James的文章,这篇算是自己的学习笔记。特此感谢知乎@King James的总结与分享!
决策树是监督学习算法的一种,主要应用于分类问题,但有时也会应用在回归问题上。从数据中挑选具有区分性的变量,将数据集拆分为两个或两个以上的子集合,一步一步拆分,最终形成了一棵“树”,“树”的每个叶子节点代表该分支最终的预测结果。
分类树
当最终预测的目标变量是一个离散值时,使用“分类树”。当一条新的测试数据进入到分类树的某个子节点时,分类树模型会使用该子节点内所有训练数据的目标变量的众数作为新数据的预测值。
回归树
当最终预测的目标变量是一个连续值时,我们使用“回归树”。当一条新的测试数据进入到回归树的某个子节点时,回归树模型会使用该子节点内所有训练数据的目标变量的平均数作为新数据的预测值。
要回答三个问题:
(1)选择哪些特征或者特征组合来构建树模型?
(2)针对单个特征,在具体哪个值进行拆分?
(3)拆分的好与坏,通过什么指标来衡量?
描述系统的“纯”度,从数据集中随机选择一个子项,衡量其被错误地分类到其他类别的概率。基尼不纯度的值越靠近0越“纯”,分类效果越好。
计算公式:
G ( P ) = ∑ i = 1 n P i ( 1 − P i ) = 1 − ∑ i = 1 n P i 2 \begin{aligned} G(P) & = \sum_{i=1}^{n} P_i(1-P_i)\\ & = 1-\sum_{i=1}^{n} P_i^2 \end{aligned} G(P)=i=1∑nPi(1−Pi)=1−i=1∑nPi2
P i P_i Pi代表当前节点(拆分后的)中属于 i i i类的比例。
计算步骤:
- 分别计算各个子节点的基尼不纯度,进行加权平均;
- 比较加权平均值,越小越好。
信息增益值(父节点的熵-子节点的熵)越大说明分裂效果越好。最优的情况就是单个叶子节点只包含一种分类。
熵计算公式:
E ( P ) = − ∑ i = 1 n P i × log 2 P i E(P) = -\sum_{i=1}^{n} P_i\times\log_2P_i E(P)=−i=1∑nPi×log2Pi
P i P_i Pi代表当前节点(拆分后的)中属于 i i i类的比例。
计算步骤:
- 计算父节点的熵;
- 分别计算各个子节点的熵,进行加权平均;
- 父节点的熵减去子节点的熵即为信息增益,信息增益越大越好。
用图举个例子:
父节点的熵均为 E 父 = − ( 5 10 × ( log 2 5 10 ) + 5 10 × ( log 2 5 10 ) ) = 1 E_父 = -(\frac{5}{10}\times(\log_2 \frac{5}{10}) + \frac{5}{10}\times(\log_2 \frac{5}{10})) = 1 E父=−(105×(log2105)+105×(log2105))=1,故左边(信息增益为1)拆分的好。
方差越小说明分的效果越好。
计算方法:
- 计算每个叶子节点的方差,然后进行加权;
- 比较加权平均值,方差越小越好。
计算公式:
V a r = 1 n ∑ i = 1 n ( x i − x ˉ ) 2 Var = \frac{1}{n} \sum_{i=1}^{n}(x_i-\bar x)^2 Var=n1i=1∑n(xi−xˉ)2
目的:为了防止树模型过拟合。
⚠️注意!
我们需要考虑模型的泛化能力,因此需要拿测试集来评估是否需要再分裂。
所有的剪枝效果评估都是在测试样本上进行的,而不是训练样本!
在对每个决策节点在分裂前进行预估,如果当前节点的分裂不能带来模型泛化能力的提升,则该节点不再分裂,直接标记为叶子节点。
在最开始分裂时先不考虑每次分裂在测试集上的效果表现,先尽可能地分裂。然后再自下而上地针对决策节点进行评估,如果将该决策节点下的所有叶子节点全部剪枝,将原本的决策节点变为新的叶子节点,是否在测试集上效果表现更好。
目标:选择出合理的分界点使其离散化。比如以年收入等于70万为一个分界线。
方法:将所有的值从小到大进行排序,然后相邻的值之间取平均数。一个一个遍历所有的平均数将样本进行二分裂,计算出得到最小加权基尼不纯度对应的的平均数,将该平均数作为我们最终连续值特征的分界点。
注意⚠️!
通常情况下连续值特征可以在一颗子树上重复使用,并不是一颗子树上只能使用该连续值特征分裂一次。比如父节点使用了“年收入小于等于70万”,子节点可以继续使用“年收入小于等于30万”分裂。
参考 知乎@King James的详细回答 通俗易懂讲解决策树算法系列第一讲:决策树模型基本概念及如何构建,再次表示感谢!
ID3,Iterative Dichotomiser 3第三代迭代二分器,是早期经典的决策树算法,上世纪70年代由澳大利亚科学家Ross Quinlan提出。
实施步骤:
初 始 设 定 一 个 信 息 增 益 阈 值 ϵ S t e p 1 : 选 择 样 本 中 未 进 行 分 裂 过 的 特 征 进 行 分 裂 , 然 后 计 算 每 个 特 征 对 应 的 信 息 增 益 值 G S t e p 2 : 找 出 拥 有 最 大 信 息 增 益 G m a x 的 特 征 S t e p 3 : I f G m a x > ϵ 选 择 该 特 征 继 续 分 裂 e l s e : 结 束 分 裂 S t e p 4 : 重 复 S t e p 1 、 S t e p 2 、 S t e p 3 \begin{aligned} &初始设定一个信息增益阈值\epsilon\\ &Step1: 选择样本中未进行分裂过的特征进行分裂,然后计算每个特征对应的信息增益值G\\ &Step2: 找出拥有最大信息增益G_{max}的特征\\ &Step3: \begin{aligned} &If G_{max} > \epsilon\\ &选择该特征继续分裂\\ &else:\\ &结束分裂 \end{aligned}\\ &Step4: 重复Step1、Step2、Step3 \end{aligned} 初始设定一个信息增益阈值ϵStep1:选择样本中未进行分裂过的特征进行分裂,然后计算每个特征对应的信息增益值GStep2:找出拥有最大信息增益Gmax的特征Step3:IfGmax>ϵ选择该特征继续分裂else:结束分裂Step4:重复Step1、Step2、Step3
局限性:
在进行特征选择时,同时考虑另外一个指标:信息增益率。相当于把信息增益归一化。
计算方法:
G a i n r a t i o = G a i n ( D , a ) I V ( a ) I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ × log 2 ∣ D v ∣ ∣ D ∣ \begin{aligned} Gain_{ratio}&=\frac{Gain(D,a)}{IV(a)}\\ IV(a) & = -\sum_{v=1}^{V} \frac{|D^v|}{|D|} \times \log_2\frac{|D^v|}{|D|} \end{aligned} GainratioIV(a)=IV(a)Gain(D,a)=−v=1∑V∣D∣∣Dv∣×log2∣D∣∣Dv∣
其中,
G a i n r a t i o Gain_{ratio} Gainratio——信息增益率
G a i n Gain Gain——信息增益
D D D——样本集合的数量(如10位选民的数据)
a a a——选择分裂的特征(如肤色特征)
V V V——特征 a a a所有的可能取值集合(如肤色特征的可能取值为{白,黑,黄}或{黑,非黑})
I V ( a ) IV(a) IV(a)——该特征的固有值
D v D^v Dv——当特征 a a a的取值为 v v v时,在样本 D D D中的数量
用图举个例子:
得到的信息增益比率为: 0.364 0.49 = 0.74 \frac{0.364}{0.49} = 0.74 0.490.364=0.74
CART算法主要具备以下几个特点:
核心流程
- 为了防止过度拟合,对节点包含的样本数 N N N和基尼不纯度 ϵ \epsilon ϵ均设置一个阀值。
- 针对每个节点,选择当前可分裂的特征,计算每种分裂可能得到的二叉树。
- 计算左右节点的加权基尼不纯度,选择加权基尼不纯度最小的(特征 A A A,具体取值 a a a)进行分裂。
- 一直重复直到达到某个条件不再分裂,形成最终的决策树模型。
整体执行步骤和分类任务差不多,只是评估指标由基尼不纯度改为了均方差,选择使得分裂结果均方差最小的(特征 A A A,具体取值 a a a)组合,其他并无差异。
平常调用sklearn
的包,里面的决策树算法就是CART算法。
算法 | 支持模型 | 树结构 | 特征选择 | 是否支持连续值处理 | 是否支持缺失值处理 | 剪枝 |
---|---|---|---|---|---|---|
ID3 | 分类 | 多叉树 | 信息增益 | 否 | 否 | 不支持 |
C4.5 | 分类 | 多叉树 | 信息增益比、信息增益 | 是 | 是 | 支持 |
CART | 分类、回归 | 二叉树 | 基尼不纯度、均方差 | 是 | 是 | 支持 |
GB,Gradient Boosting梯度提升算法。
关于该算法的通俗讲解,请看知乎@King James的讲解:通俗易懂讲解决策树算法系列第三讲:GBDT算法在回归任务中的应用