系列文章目录
前言
你好哇,昆兰(Quinlan)在1986年发表的论文中详细描述了决策树算法,是一种用于分类的树状结构,简洁直观、有效。在1979年昆兰提出了ID3算法,该算法最初被用来判断国际象棋残局的输赢,后来通用于分类问题。并且在此基础上,提出了一系列的改进算法,如C4.5等。
在昆兰发表决策树算法的时代,机器学习的概念已经提出。人们意识到,学习是智能行为的重要特征,昆兰将当时的机器学习方法分为两类:一类是能够自我改进的自适应系统,它们通过监测自己的性能,调整系统内部参数,向着目标方向做出改进;另一类基于结构化知识的学习方法,把学习视为获取知识,比如专家系统中的产生式规则。昆兰将决策树纳入后一类学习方法,这种方法一定程度上解决了专家系统获取知识的瓶颈问题,但是非常耗时和低效(通过对领域专家进行访谈)。并且整个过程费时费力,而且 不能很好地解决一些边界情况或者极端情况,比如不常见地个例、重复或是冲突的规则 。
而决策树不再依赖于人类专家的经验,而是用统计的方法直接从数据中获得“第一手”经验。
一、构造决策树
类似于数据结构中的二叉树的定义、树的定义,构造决策树也是一个递归的过程:
从整个数据集开始,根据条件将数据集分割为两个互补的子集。这个条件构成了树的分支节点,称为节点的 分支条件。对于两个子数据集,我们递归地进行分割操作,分别形成节点的左右子树。当数据集被分割为仅包含单一类别的元素集合时,递归分割就终止了,这些不能继续分割的集合是 叶节点。
在构建过程中,选取的分支条件决定了树的形态。如果随意选取可能造成:
1.得到一棵非常深而且非常宽的决策树,占据更多存储空间,耗费更多计算资源。
2.一棵复杂的树可能过拟合样本,决策树"记住了“训练样本中一些次要细节,不利于识别没有出现过的新样本。
一般来说,决策树的构建遵循 奥卡姆剃刀(Occam’s Razor)原理:
如无必要,勿增实体:一颗小的树预测能力更好。
采用 分而治之 的思想,利用贪心策略从局部出发来构造一棵大小紧凑的决策树。
决策树的 构建过程 主要步骤:
训练数据集D,类别集合C={C1, C2, … c}
1.创建一个结点t,初始情况下训练数据集中的所有样本与根结点关联,记为 D t D_t Dt将t设为当前结点。
2.如果当前结点所关联的数据集 D t D_t Dt.中所有样本的类别相同(假设为 C i C_i Ci) , 则将该结点标记为叶子节点,记录类别为 C i C_i Ci,停止对该结点所关联的数据集的进一步分裂。接着处理其他非叶子节点。否则,进入下一步。
3.为数据集 D t D_t Dt选择分裂属性和分裂条件。根据分裂条件将数据集 D t D_t Dt{分裂为m个子集,为结点创建m个子女结点,将这m个数据集分别与之关联。依次将每个结点设为当前结点,转至步骤2进行处理,直至所有结点都标记为叶子结点。
二、ID3算法
ID3算法的全称是Iterative Dichotomiser,是一个迭代二分算法。为了使分支尽快到达叶节点,在对落入某个节点的样本进行分割的时候,应该力求分割得到的两个集合具有较高的 纯度。这个算法利用了 __信息熵__来衡量分割的纯度,p表示正样本(分类为是)的比例,n表示负样本(分类为否)的比例,一组样本的熵H(p,n)定义如下。
H ( p , n ) = − p p + n log 2 p p + n − n p + n log 2 n p + n H(p, n)=-\frac{p}{p+n} \log _{2} \frac{p}{p+n}-\frac{n}{p+n} \log _{2} \frac{n}{p+n} H(p,n)=−p+nplog2p+np−p+nnlog2p+nn
假设某个分割A将样本分为两组,两组正负样本数量分别为(P1,n1)和(Pz,n2),分割后的熵就是两组熵的加权和。
H ( A ) = ( p 1 + n 1 ) H ( p 1 , n 1 ) + ( p 2 + n 2 ) H ( p 2 , n 2 ) p 1 + n 1 + p 2 + n 2 H(A)=\frac{\left(p_{1}+n_{1}\right) H\left(p_{1}, n_{1}\right)+\left(p_{2}+n_{2}\right) H\left(p_{2}, n_{2}\right)}{p_{1}+n_{1}+p_{2}+n_{2}} H(A)=