人类面临决策过程时,就是用树的思维来解决的问题。决策树的目的是产生一个泛化能力强的树。
原理:
根节点-à子节点(属性,feature)à叶节点(决策结果)
每个叶节点的得到都是通过一个决策过程实现的。
在三种情况下,根节点或者是子节点会转化成叶节点:
决策树实现过程:(伪代码)
输入:训练集d,属性集a。
1生成节点
2 if d中样本全部属于同一个类别
根节点-à叶子结点
End if
If a==空 or d在a上的取值全部一样
根节点à叶子节点 ,类别是样本中数量最多的那一类结果的类别
End if
从a中选择最优划分节点a*
For a*中的每种取值
生分支,d*为d在a*上取得的样本子集。
If d* == 空
分支节点就是叶节点,它的父节点中样本类别最多的类是该节点的类别
Else:
除去a*这个属性,继续进行分支节点的划分。
End if
End for
输出:一颗决策树
关键的部分就是如何划分最优划分节点。
划分就是要使数据越发纯粹,纯粹的衡量标准可以用①信息熵②基尼系数来表示。
①信息熵:度量样本集合纯度的最常用的指标,样本集合d中第k类样本所占的比例为pk,则d的信息熵为:
Ent(d)= -∑pk*log2pk
k是样本的分类
该值越小,d的纯度越高。
如果离散属性a有n个取值,就会有n个分支节点,每个分支节点包含的样本是总样本d在a这个属性上取值为a_n的样本,记为dv,那么每个属性的信息熵可以计算出来:
z= ∑|dv|/|d|*ent(dv)
那么可以计算出用属性a对样本集合d进行划分所获得的“信息增益”,
Gain(d,a) = ent(d)-z
信息增益越大,意味着使用属性a来进行划分所获取的“纯度提升”越大。
所以属性的选择是 a* = argmaxGain(d,a),著名的id3决策树学习算法就是使用的这个方法来选择属性划分的。
信息增益准则对可取数目较多的属性有所偏好,为减少这种偏好所带来的不利影响,c4.5决策树算法加入了增益率来选择最优划分属性。
Gain_ratio(d,a) = gain(d,a)/IV(a),
Iv(a) = -∑|dv|/|d|*log2(|dv|/|d|)--属性a的固有值
增益率准则对可取值数目较少的属性有所偏好。先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率高的。
②Cart决策树使用基尼系数,cini index来选择划分属性。
Gini(d)=1-∑pk^2
直观来说,基尼系数反映的是从数据集中随机抽取两个样本,其类别标记不一致的概率,因此,基尼越小,则纯度越高。
属性a的基尼系数:
Gini_index(d,a) = ∑|dv|/|d|*gini(dv)
A* = argmin Gini_index(d,a)
剪枝处理:预剪枝(在每个节点预先使用验证集估计),后剪枝(完成决策树后,自底向下验证评估)。为避免分支节点太多造成过拟合,主动减去一些分支来降低过拟合的风险。
预剪枝比后剪枝的训练开销和测试时间开销更低。但是可能会造成欠拟合风险。后剪枝的欠拟合风险小,泛化性优于预剪枝决策树。
连续值与缺失值处理
如果属性取值为多个连续值,那么划分属性就是尝试的划分节点,首先把数据从小到大排序,然后划分1到n-1个划分节点,划分节点的值,取两个划分值的中位数。然后就像离散属性值一样考虑。
如果有缺失值,那么首先计算没有缺失值样本的信息增益,然后再和无缺失值和总体的比例相乘,得到最后的信息增益。
多变量决策树:分类边界不再和坐标轴平行,而是线性分类器等函数。