《机器学习》笔记(第二部分:决策树、神经网络、支持向量机)
4 决策树
4.1 基本流程
假设数据集 D={(xi,yi)}i=1m, xi=(xij)j=1d, 属性序号集 A={a}a=1d.
问题: 生成一棵树. 深度为 d+1, 其中根节点和中间节点共 d 层, 结果叶节点 1 层. 每个根 (中间) 节点是一个决策: 属性 a∗ 的值是多少? 根据其取值, 确定下一轮进入的子节点. 从根节点往下判断, 共经过 d 个节点, 恰好是全部 d 个属性的问题.
- 函数 generate_tree(D, A)
- 输入:
- 训练集 D={(xi,yi)}i=1m
- 属性序号集 A={a}a=1d
- 过程:
- 生成节点 node
if
y1=y2=⋯=ym
- 将 node 标记为叶节点, 其类别为 y1
if
x1=x2=⋯=xm
- 将 node 标记为叶节点, 其类别为 {yi} 的众数
- 从 A 中选择一个最优划分属性 a∗
for
a∗ 的每一种可能取值 v
- 为 node 生成一个分支节点 subnode
- 令 Dv 表示 D 中在 a∗ 取值为 v 的样本子集
-
if
Dv=∅
- 将 subnode 标记为叶节点, 其类别为 {yi} 的众数
-
else
- 令 subnode 为 generate_tree(Dv, A∖{a∗})
这样可以生成一个深度最多为 d+1 的树.
4.2 划分选择
问题: 在当前给定的数据集 D 和属性集 A 下, 在当前节点 node 处, 应该选择哪一个属性作为最优划分属性? 选定优化目标: 我们希望每个 subnode 所包含的样本, 尽可能属于同一类别. 即纯度 (purity) 越来越高.
信息熵 对于这个问题, Shannon 已经给了我们答案. 对于数据集 D, 定义信息熵 (information entropy)
EntD:=−y∈Y∑pylbpy
其中 Y 是标记集, py 表示标记值为 y 的样本占整个 D 的比例. 约定 0lb0=0. 它的取值范围是
0≤EntD≤lb∣Y∣
我们的目的是降低信息熵: 信息熵越小, D 的纯度越高.
信息增益 给定属性 a∗, 考虑划分前与划分后信息熵之差 (加权)
GainDa∗:=EntD−v∈Xa∗∑∣D∣∣Dv∣EntDv
其中 v 取遍属性 a∗ 的所有可能取值, Dv 表示 D 中在 a∗ 取值为 v 的样本子集. 上面的差式定义为信息增益 (information gain). 差式越大, 说明 a∗ 在划分 D 式造成的信息熵减少越多. 故取
a∗=argmaxa∈AGainDa
作为划分属性即可.
增益率 信息增益有一个漏洞, 它偏好取值种类较多的属性. 作为一个修正, 定义增益率 (gain ratio)
GainRatioDa:=IVDaGainDa,IVDa:=−v∈Xa∗∑∣D∣∣Dv∣lb∣D∣∣Dv∣
其中 IVDa 是属性 a 在训练集 D 上的固有值 (intrinsic value). 增益率偏好取值种类较少的属性.
基尼指数 基尼指数 (Gini index) 反映了数据集中任取两个样本, 其类别标记不一致的概率. 定义基尼值 (Gini value)
GiniD:=y,y′∈Yy=y′∑pypy′=1−y∈Y∑py2
基尼指数越小, 数据集纯度越高. 定义基尼指数
GiniIndexDa:=v∈Xa∗∑∣D∣∣Dv∣GiniDv
取基尼指数最小的那个属性
a∗=argmina∈AGiniIndexDa
作为划分属性即可.
4.3 剪枝处理
完整的、将每一个属性都完全划分的决策树, 很容易出现过拟合问题. 对于每一个节点 node, 比较剪枝前 (即 node 是有分支的节点) 和剪枝后 (即将 node 置为叶子结点), 决策树在验证集 T 的预测精度, 来决定是否要进行剪枝操作.
预剪枝 在生成决策树时, 若当前节点 node 划分后比划分前预测精度低, 则将 node 置为叶节点. 其类别为 yi 的众数. 预剪枝是基于贪心思想设计, 容易欠拟合.
后剪枝 在生成完决策树后, 从叶节点往上逐个判断. 若节点 node 划分后精度反低, 则置为叶节点. 后剪枝有效规避了欠拟合问题, 但是计算开销较大.
4.4 连续与缺失值
4.4.1 连续值处理