Task02加篇1——小白理解决策树

Task02加篇1——小白理解决策树

  • 1 什么是决策树
    • 1.1 决策树的基本概念
    • 1.2 决策树模型的分类
  • 2 树模型的拆分【回答问题1、3】
    • 2.1 基尼不纯度(适用分类树)
    • 2.2 信息增益(适用分类树)
    • 2.3 方差法(适用回归树)
  • 3 决策树的关键参数
  • 4 树模型剪枝(注意在测试样本上进行评估)
    • 4.1 预剪枝
    • 4.2 后剪枝
  • 5 连续值特征处理【回答问题2】
  • 6 缺失值如何处理
  • 7 算法详解
    • 7.1 ID3算法(分类问题,多叉树)
    • 7.2 C4.5算法(分类问题,多叉树)
    • 7.3 CART算法(分类/回归,二叉树)
      • 7.3.1 CART分类任务
      • 7.3.2 CART回归任务
    • 7.4 总结
  • 8 GBDT算法

上一篇在回归模型中提到了决策树,我对这一块属于小白,但又想弄懂其中的基本逻辑,于是自己翻知乎学习了@King James的文章,这篇算是自己的学习笔记。特此感谢知乎@King James的总结与分享!

1 什么是决策树

1.1 决策树的基本概念

决策树是监督学习算法的一种,主要应用于分类问题,但有时也会应用在回归问题上。从数据中挑选具有区分性的变量,将数据集拆分为两个或两个以上的子集合,一步一步拆分,最终形成了一棵“树”,“树”的每个叶子节点代表该分支最终的预测结果

决策树中一些专业术语图解:
Task02加篇1——小白理解决策树_第1张图片

1.2 决策树模型的分类

  • 分类树
    当最终预测的目标变量是一个离散值时,使用“分类树”。当一条新的测试数据进入到分类树的某个子节点时,分类树模型会使用该子节点内所有训练数据的目标变量的众数作为新数据的预测值

  • 回归树
    当最终预测的目标变量是一个连续值时,我们使用“回归树”。当一条新的测试数据进入到回归树的某个子节点时,回归树模型会使用该子节点内所有训练数据的目标变量的平均数作为新数据的预测值


要回答三个问题:
(1)选择哪些特征或者特征组合来构建树模型?
(2)针对单个特征,在具体哪个值进行拆分?
(3)拆分的好与坏,通过什么指标来衡量?


2 树模型的拆分【回答问题1、3】

2.1 基尼不纯度(适用分类树)

描述系统的“纯”度,从数据集中随机选择一个子项,衡量其被错误地分类到其他类别的概率。基尼不纯度的值越靠近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=1nPi(1Pi)=1i=1nPi2

P i P_i Pi代表当前节点(拆分后的)中属于 i i i类的比例。

计算步骤:

  1. 分别计算各个子节点的基尼不纯度,进行加权平均;
  2. 比较加权平均值,越小越好。

用图举个例子(左边的拆分好):
Task02加篇1——小白理解决策树_第2张图片

2.2 信息增益(适用分类树)

信息增益值(父节点的熵-子节点的熵)越大说明分裂效果越好。最优的情况就是单个叶子节点只包含一种分类。

熵计算公式:
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=1nPi×log2Pi

P i P_i Pi代表当前节点(拆分后的)中属于 i i i类的比例。

计算步骤:

  1. 计算父节点的熵;
  2. 分别计算各个子节点的熵,进行加权平均;
  3. 父节点的熵减去子节点的熵即为信息增益,信息增益越大越好。

用图举个例子:
父节点的熵均为 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)拆分的好。
Task02加篇1——小白理解决策树_第3张图片

2.3 方差法(适用回归树)

方差越小说明分的效果越好

计算方法:

  1. 计算每个叶子节点的方差,然后进行加权;
  2. 比较加权平均值,方差越小越好。

计算公式:
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=1n(xixˉ)2


3 决策树的关键参数

  • 决策节点分裂包含的最小样本数:过高,会导致模型欠拟合;过低又会导致模型过拟合。需要使用交叉检验的方式进行调参。
  • 叶子节点包含的最小样本数:也是为了控制过拟合,如果样本数过小就会导致可以分出大量的叶子节点,所以会存在一个最小值限制。一般对于正负样本比例严重不均衡的分类,可以将此参数设置相对较小。
  • 树的最大深度:深度过小,可能模型会欠拟合;深度过大,有可能模型会学习到一些特定样本才有的特征。需要使用交叉检验的方式进行调参。
  • 总体的叶子节点数量:一般情况下,树深度为 n n n的情况下,最多允许产生 2 n 2^n 2n个叶子节点。
  • 整体分裂中使用的最多特征数:根据建模经验,我们认为 p , p 为 总 特 征 数 \sqrt p, p为总特征数 p ,p是最佳的特征数。使用过多特征会导致模型过拟合。

4 树模型剪枝(注意在测试样本上进行评估)

目的:为了防止树模型过拟合。

⚠️注意!
我们需要考虑模型的泛化能力,因此需要拿测试集来评估是否需要再分裂。
所有的剪枝效果评估都是在测试样本上进行的,而不是训练样本

4.1 预剪枝

在对每个决策节点在分裂前进行预估如果当前节点的分裂不能带来模型泛化能力的提升,则该节点不再分裂,直接标记为叶子节点。

  • 优点:预剪枝使得决策树的很多节点都没有“展开”,降低了过拟合的风险和模型的训练时间。
  • 缺点:预剪枝是基于“贪心”的,虽然当前分裂不能提升泛化性能,但是基于该分裂的后续分裂却有可能导致效果提升,因此预剪枝策略有可能带来欠拟合的风险。

4.2 后剪枝

在最开始分裂时先不考虑每次分裂在测试集上的效果表现,先尽可能地分裂。然后再自下而上地针对决策节点进行评估,如果将该决策节点下的所有叶子节点全部剪枝,将原本的决策节点变为新的叶子节点,是否在测试集上效果表现更好。

  • 优点:比预剪枝决策保留了更多的分支,因为前期尽可能地让树进行分裂。一般情形下,后剪枝决策树的欠拟合风险小,泛化能力也要优于预剪枝决策树。
  • 缺点:后剪枝过程是在构建完全决策树之后进行的,并且要自底向上的对树中的所有非叶结点进行逐一考察,因此其训练时间长得多。

5 连续值特征处理【回答问题2】

目标:选择出合理的分界点使其离散化。比如以年收入等于70万为一个分界线。

方法:将所有的值从小到大进行排序,然后相邻的值之间取平均数。一个一个遍历所有的平均数将样本进行二分裂,计算出得到最小加权基尼不纯度对应的的平均数,将该平均数作为我们最终连续值特征的分界点。

注意⚠️!
通常情况下连续值特征可以在一颗子树上重复使用,并不是一颗子树上只能使用该连续值特征分裂一次。比如父节点使用了“年收入小于等于70万”,子节点可以继续使用“年收入小于等于30万”分裂。


6 缺失值如何处理

参考 知乎@King James的详细回答 通俗易懂讲解决策树算法系列第一讲:决策树模型基本概念及如何构建,再次表示感谢!


7 算法详解

7.1 ID3算法(分类问题,多叉树)

  • 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:GmaxStep3:IfGmax>ϵelse:Step4:Step1Step2Step3

  • 局限性:

    • 信息增益阀值 ϵ \epsilon ϵ比较难以设定;另一方面模型训练时会偏好取值较多的特征,最终有可能模型泛化能力比较差。
    • 如果样本的特征很多,可能会导致树的深度过深,有些无关紧要的特征也被挑选出来,导致模型过拟合。
    • 不能处理取值是连续值的特征,同时也无法对树进行剪枝。

7.2 C4.5算法(分类问题,多叉树)

  • 在进行特征选择时,同时考虑另外一个指标:信息增益率。相当于把信息增益归一化。

  • 计算方法:
    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=1VDDv×log2DDv
    其中,
    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

  • ID3算法会偏向于选择取值分散(取值范围较多)的特征,但是C4.5 又倾向于选择取值范围比较少的特征。
  • 因为 I V ( a ) IV(a) IV(a)是分母,如果特征的取值数目相对较少,则 I V ( a ) IV(a) IV(a)就会相对较小;如果 I V ( a ) IV(a) IV(a)越小, G a i n r a t i o Gain_{ratio} Gainratio就会相对越大。
  • 实际应用时,我们会综合信息增益和信息增益率,先从候选特征中找出信息增益高于平均水平的特征,再从中选择增益率最高的特征

7.3 CART算法(分类/回归,二叉树)

CART算法主要具备以下几个特点:

  • 既可以处理分类问题,也可以处理回归问题;
  • 所有的分裂都是二叉树;
  • 分类任务时使用基尼不纯度来代替信息增益(因为信息增益计算需要计算熵,存在大量的对数运算,计算复杂度更高);
  • 回归任务时使用方差法来选择特征。

7.3.1 CART分类任务

核心流程

  1. 为了防止过度拟合,对节点包含的样本数 N N N和基尼不纯度 ϵ \epsilon ϵ均设置一个阀值。
  2. 针对每个节点,选择当前可分裂的特征,计算每种分裂可能得到的二叉树。
  3. 计算左右节点的加权基尼不纯度,选择加权基尼不纯度最小的(特征 A A A,具体取值 a a a)进行分裂。
  4. 一直重复直到达到某个条件不再分裂,形成最终的决策树模型。

7.3.2 CART回归任务

整体执行步骤和分类任务差不多,只是评估指标由基尼不纯度改为了均方差,选择使得分裂结果均方差最小的(特征 A A A,具体取值 a a a)组合,其他并无差异。

平常调用sklearn的包,里面的决策树算法就是CART算法。

7.4 总结

算法 支持模型 树结构 特征选择 是否支持连续值处理 是否支持缺失值处理 剪枝
ID3 分类 多叉树 信息增益 不支持
C4.5 分类 多叉树 信息增益比、信息增益 支持
CART 分类、回归 二叉树 基尼不纯度、均方差 支持

8 GBDT算法

GB,Gradient Boosting梯度提升算法。
关于该算法的通俗讲解,请看知乎@King James的讲解:通俗易懂讲解决策树算法系列第三讲:GBDT算法在回归任务中的应用

  • 输入:训练集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x n , y n ) } , x i ∈ R n , y i ∈ R T = \{(x_1, y_1), (x_2, y_2), ..., (x_n, y_n)\}, x_i \in R^n, y_i \in R T={(x1,y1),(x2,y2),...,(xn,yn)},xiRn,yiR
  • 根据样本集,初始化一个弱学习器,该弱学习器是一个常数 C = f 0 ( x ) C = f_0(x) C=f0(x) C C C满足损失函数 J = 1 2 ∑ i = 1 n ( y i − C ) 2 J = \frac{1}{2} \sum_{i = 1}^{n} (y_i-C)^2 J=21i=1n(yiC)2的值最小
  • 进行后续迭代,假设迭代的轮数为 m , m ∈ [ 1 , M ] m, m \in [1,M] m,m[1,M]。对于 m ∈ [ 1 , M ] m \in [1,M] m[1,M],一直做如下循环:
    • 计算残差: r m i = y i − f m − 1 ( x i ) , i = 1 , 2 , . . . , n r_{mi} = y_i-f_{m-1}(x_i), i = 1, 2, ..., n rmi=yifm1(xi),i=1,2,...,n
    • 构建新的学习样本集 { ( x i , r m i ) } \{(x_i, r_{mi})\} {(xi,rmi)},基于新的样本集,利用CART中的方法得到一个新的弱学习器 h m ( x ) h_m(x) hm(x)
    • 更新 f m ( x ) = f m − 1 ( x ) + h m ( x ) f_m(x) = f_{m-1}(x) + h_m(x) fm(x)=fm1(x)+hm(x)
  • 最终得到强学习器: f M ( x ) = f 0 ( x ) + ∑ m = 1 M h m ( x ) f_M(x) = f_0(x) + \sum_{m=1}^{M}h_m(x) fM(x)=f0(x)+m=1Mhm(x)

你可能感兴趣的:(DataWhale,决策树,机器学习)