C++实现决策树
决策树
决策数学习的基本算法
划分选择
决策树的关键在第8行,如何选择最优划分属性,一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的“纯度”越来越高。
信息增益
“信息熵”是度量样本集合纯度最常用的一种指标。
信息熵
Ent(D)=−k=1∑∣y∣pklog(pk)
当前样本D中的第k类样本(比如好瓜、坏瓜)所占的比例为
pk,则D的信息熵为上面公式,值越小,纯度越高
信息增益(ID3决策树)
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
V表示属性a的可能取值为
{a1,a2,...,aV}, 信息增益越大,使用a属性来划分所获得的“纯度提升越大”,因此我们可以使用信息增益作为决策树的划分属性选择,就如第8行的
a∗=a∈AargmaxGain(D,a), ID3决策树学习算法就是使用信息增益为准则划分属性。
增益率(C4.5决策树)
使用信息增益的缺点可能划分纯度很大,但是决策树不具有泛化能力,就是过拟合,无法对新样本进行有效的预测,信息增益准则对可能取值数目较多的属性有所偏好。C4.5决策树算法使用增益率来选择最优划分属性。
Gainratio(D,a)=IV(a)Gain(D,a)
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
IV(a)称为属性a的“固有值”,属性a的取值数目越多,值越大。增益率准则对可取值数目较少的属性有所偏好。所以C4.5决策树算法使用了一个启发式的算法:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益率最高的。
基尼指数(CART决策树)
数据集D的纯度用基尼指数表示为:
Gini(D)=−k=1∑∣y∣pk2
基尼指数越小,纯度越高
属性a的基尼指数为:
Giniindex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
在候选属性集合A中,选择使得划分后基尼指数最小的属性作为最优划分属性,
a∗=a∈AargminGini_index(D,a)
剪枝处理
是一种决策树学习算法对付“过拟合”的手段。
预剪枝
在决策树生成过程中,对每个节点在划分前进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点。
未剪枝决策树
预剪枝决策树
后剪枝
先从训练集中生成一颗完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应地子树替换为叶节点能带来决策树泛化性能提升,则将该字叔替换为叶节点。
连续与缺失值
连续值处理
我们之前都是基于离散属性来生成决策树,现实中可能遇到连续属性。
如图中地密度和含糖率
最简单地策略是采用二分法对来内需属性进行处理,C4.5决策树就是采用地这样地机制。
- 将连续属性a排序为
{a1,a2,...,an}
- 基于划分点t将D分为子集
D−和
D+
- 对相邻地属性取值
ai和
ai+1,t在区间
[ai,ai+1)中取任意值产生地划分结果相同
- 划分点集合
Ta={2ai+ai+1∣1<=i<=n−1}
- 信息增益
Gain(D,a)=t∈TamaxGain(D,a,t)=t∈TamaxEnt(D)−λ∈{−,+}∑∣D∣∣Dtλ∣Ent(Dtλ)
选择使
t∈TamaxGain(D,a,t)最大化地划分点
缺失值处理
现实任务中总会遇到不完整地样本,样本地某些属性值缺失。我们不能完全丢弃,否则是一种信息浪费。
所以我们要解决两个问题:
- 如何在属性值缺失的情况下进行划分属性选择?
- 给定划分属性?若样本在该属性上的值缺失,如何对样本进行划分?
下面
- 令
D
表示D中在属性a上没有缺失值地样本子集
- 令
D
v表示
D
在属性a上取值为
av地样本子集
- 假定我们给每一个x赋予一个权重
ωx,并定义
ρ=∑x∈Dωx∑x∈D
ωx
表示无缺失值样本所占比例
ρ
k=∑x∈D
ωx∑x∈D
kωx
表示无缺失值样本中第k类所占地比例
r
v=∑x∈D
ωx∑x∈D
vωx
表示无缺失值样本中在属性a上取值
av地样本所占地比例
Gain(D,a)=ρ∗Gain(D
,a)=ρ∗(Ent(D
)−v=1∑Vr
vEnt(D
v))
Ent(D)=−k=1∑∣y∣ρ
klog(ρ
k)