决策树算法是机器学习中的一种算法,有分类和预测的作用。首先先贴下算法
1.简要介绍及算法表达:
输入:训练集 D={(x1,y1),(x2,y2),…,(xm,ym)}
属性集 A={a1,a2,…,ad}
过程:函数 TreeGenerate(D,A)
1:生成节点node;
2:if D中样本全属于同一类别C then
3: 将node标记为页节点;return
4:end if
5:if A = ∅ OR D中样本在A上取值相同 then
6: 将node标记为叶节点,其类别标记为D中样本数最多的类;return
7:end if
8:从A中选择最优划分属性 a∗ ;
9:for a ∗ 的每一个值 av∗ do
10: 为node生成一个分支;令 Dv 表示D中在 a∗ 上取值为 av∗ 的样本子集;
11: if Dv 为空 then
12: 将分支节点标记为叶节点,其类别标记为D中样本最多的类; return
13: else
14: 以 TreeGenerate( Dv, A \{a∗}) 为分支节点
15: end if
16:end for
输出:以node为根节点的一颗决策树
摘自: 周志华.机器学习.清华大学出版社.2016
训练集D中
x
为特征值,
1. 对训练集进行判断:当所有的y都相同时,退出,都是同一类不好分类。 无需划分
2. 属性集为空,或所有的样本在所有属性上取值相同,标记为训练集中样本数最多的类。无法划分
3. 当前阶段包含的样本集合为空。不能划分
这是个递归方法生成树,先判断第1,2种情况,然后确定以什么特征为根节点,然后根据特征不同的属性分孩子节点,如果出现第3中情况,则分为子节点。然后递归。
2.关于第8步的最优划分:
划分的方法区分了不同的决策树。比如CART,C4.5等。
纯度:结点包含的样本属于同一类别的越多,则结点纯度越高。(决策树的目标就是分类,所以决策树的构建就需要纯度越高)
信息熵:
上图为函数 y=−pklog2pk
信息熵值越小,样本集合纯度越高,由图我们需仔细观察,同时可发现类别越多信息熵越大。因为它是凸函数。
信息增益:
Dv 表示在某个属性上的样本集,信息增益的意思就是(请对照公式) 根节点的信息熵 − 各个分支信息熵之和。信息增益越大,相对而言就是根节点的信息熵很大,而叶子节点的相对较小。换成纯度即是根节点的纯度很低,以这个属性分节点后纯度变很高,所以分的越有效。
增益率:
观察上图的时候,我们就发现类别越多信息熵越大,所以信息增益对有很多属性值的特征有偏好,所以我们需要 增益率和信息增益一起使用。增益率对少属性值的特征有偏好。C4.5使用的方法是:先从候选划分特征中找出信息增益高于 平均水平的属性,再从中选增益率最高的。
基尼指数:
CART决策树使用它选择划分特征。
3.剪枝(防止过拟的手段):
过拟就是把训练集自身的特点当成所有所有数据都有的特点。通俗的说就是:共性寓于个性之中,过拟在训练时误将个性当成了共性。(共性决定事物的基本性质;个性揭示事物之间的差异性。)
为了解决过拟所以就有剪枝。为实现剪枝需将样本集分成训练集(样本集数量的2/3~4/5)和验证集,训练集用于建模,验证集用于剪枝(留出法)。
3.1预剪枝
顾名思义,预剪枝就是预防过拟的方法,在过拟出现之前就解决掉(有可能错剪),实质就是在决策树生成好之前就剪枝。好处就是程序运行快了,坏处就是牺牲了很多特征,可能会不够准确。预剪枝第一步判断节点将其标记为训练集中样本数最多的类别,然后使用验证集得出精度(这是剪枝前的)。第二步按照特征的属性分支,然后对每个分支进行类别的判断(使用的训练集),然后使用验证集进行精度判断。第三步,比较那个精度高就使用哪个。预剪枝用广度优先搜索的方法(排除无需划分的点)进行迭代上面三步。
3.2后剪枝
后剪枝就是决策树生成完毕之后再进行剪枝。剪枝的方法也是上面的三步,只是从树的下层向上层进行迭代。