决策树与随机森林理论与实现(一)
决策树
决策树是一种依据多种特征依次进行划分以达到对训练数据的分类。
特点
- 与线性模型相比,树形结构可对数据进行非线性分割
- 接近人的思维,有可视化的划分规则,具有可解释性
- 适合处理离散数据
结构
- 树状结构,根节点,若干内部节点以及若干叶节点
- 根节点代表全集,叶节点代表决策结果,内部节点代表一个属性测试
- 父子节点之间的关系表示为父节点对应的样本集合根据自身的属性测试划分到子节点中
概念
以西瓜质量好坏(甜 or 不甜)与西瓜的色泽,纹理,响声等因素的关系为例
- 样本的类别:决策的最终结果(甜 or 不甜)
- 样本的属性:决策的判断条件(色泽,纹理,响声等)
- 属性值:某一个属性包含的元素(清晰的纹理,清脆的响声等)
总体流程
- 采用递归分治的策略
- 基本思想是寻找信息熵下降最快的树结构
流程伪代码
输入:
训练集 D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x m , y m ) } ; D=\{(x_1,y_1),(x_2,y_2),...,(x_m,y_m)\}; D={
(x1,y1),(x2,y2),...,(xm,ym)};
属性集 A = { a 1 , a 2 , . . . , a d } ; A=\{a_1,a_2,...,a_d\}; A={
a1,a2,...,ad};
过程: TreeGenerate(D,A)
对于当前的集合生成结点node
if D 中样本属于同一类别 //(1)
将 node 标记为叶结点,按照样本类别标记叶结点
else if A中没有多余的特征 or D 在 A 划分一致 //(2)
将 node 标记为叶结点,按照D中样本数最多的类别标记叶结点
else
从 A 中选择最优的划分属性 a* //(3)
for a* 属性中的每一种属性值ai
在node基础上产生子结点,Di表示D中对于属性a取值为ai的子集
if Di 为空 //(4)
标记叶结点,按照D中样本数最多的类别标记叶结点
else //(5)
递归分支 TreeGenerate(Di,A-{a})
- (1) 当前结点内样本都是同一类别,无需继续划分
- (2) 当前属性已经无法对当前部分样本进行更细的划分了,以D中的大多数样本的类别对D的类别进行概括
- (3) 根据不同的算法找到最优的划分属性,后面会详细介绍
- (4) 当前训练集合没有这部分划分的相关样本,故以D中的大多数样本的类别对该子节点的类别进行概括
- (5) 当前的子集还可以继续向下划分,将当前选中属性抛去
划分选择
对于划分标准的选择,唯一的标准就是,通过划分,使得样本尽快划分至同一类别,即划分后纯度提升越快越好。
- 首先,需要对当前样本集合的纯度进行定义,可通过信息熵或基尼值的方式定量描述样本纯度。
- 选择一种方式判定纯度的提升程度
信息熵与信息增益
信息熵的定义:
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k log 2 p k Ent(D)=-\sum_{k=1}^{|y|}p_k\log_2p_k Ent(D)=−k=1∑∣y∣pklog2pk
表示对于样本集合D, p k p_k pk代表不同类别的所占比例, E n t ( D ) Ent(D) Ent(D)越小,纯度越高,叶结点的 E n t ( D ) Ent(D) Ent(D)为0
信息增益引入的目的是为了表示纯度提升的效果,即信息熵的下降程度,划分前与划分后信息熵的差值。
假设属性a有V个属性值 { a 1 , a 2 , . . . , a V } \{a^1,a^2,...,a^V\} {
a1,a2,...,aV},依据V个属性对D进行分类,对于划分后的每一个子集,有自己的信息熵。根据划分子集的大小,分配一个权重 ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} ∣D∣∣Dv∣。
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a)=Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
由上面的定义,以信息增益为基准选择属性a*时,
a ∗ = arg max a ∈ A G a i n ( D , a ) a_*=\mathop{\arg\max}\limits_{a\in A} Gain(D,a) a∗=