机器学习之决策树 Decision Tree(一)

一、决策树

        决策树是一个树结构(可以是二叉树或非二叉树),每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,按照其值选择输出分支,直到到达叶节点,将叶节点存放的类别作为决策结果。

二、决策树的构造

        构造决策树的关键步骤是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”,就是尽量使一个分裂子集中待分类项属于同一类别。不纯度的选取有多种方法,每种方法形成了不同的决策树方法。ID3算法使用信息增益作为不纯度,C4.5算法使用信息增益率作为不纯度,CART算法使用基尼系数作为不纯度。

2.1 信息增益

        在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。设D为训练样本的一组划分,则D的熵表示为:


        其中pi表示第i个类别在整个训练集中出现的概率,可以用属于此类别样本的数量除以训练集样本总数作为估计。
        假设将训练集按属性A进行划分,产生v个分支结点,其中第j个分支结点记为Dj,考虑到不同分支结点所包含的样本数不同,赋予权重,即样本数越多的分支结点影响越大,则A对D划分的期望信息为:


        信息增益即为二者的差值:

        一般而言,信息增益越大,意味着使用属性A来进行划分所获得的纯度提升越大,因此可用信息增益进行决策树的划分属性选择,ID3决策树学习算法就是以信息增益为准则来选择划分属性。


        以A1、A2、A3、A4分别表示年龄、有工作、有自己的房子和信贷情况四个特征。分别计算各特征的信息增益,选择信息增益值最大的特征作为最优特征。


2.2 信息增益率

        假如将样本编号作为一个特征,每个分支结点仅包含一个样本,这些分支结点的纯度达到最大,使用信息增益得到的决策树不具有泛化能力,无法对新样本进行有效预测。信息增益准则的缺点是对可取值数目较多的属性有所偏好,为了减少这种偏好可能带来的不利影响,C4.5决策树算法使用增益率选择最优划分属性。
        增益率定义为



        属性A的可能取值数目越多,则IV(A)的值通常会较大。增益率准则对可取值数目较少的属性有所偏好。C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。

2.3 基尼指数


        直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别不一致的概率,因此Gini(D)越小,数据集D的纯度越高。
        属性A的基尼指数定义为


        CART (Classification And Regression Tree) 算法既可以用于分类,也可以用于回归。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选择,生成二叉树。

三、剪枝处理

        剪枝(pruning)是决策树学习算法对付过拟合的主要手段。决策树剪枝的基本策略有预剪枝和后剪枝。预剪枝是指在决策树生成过程中,对每个节点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶节点进行考察,若将该节点对应的子树替换为叶节点能带来决策树泛化性能的提升,则将该子树替换为叶节点。
        判断决策树泛化性能提升的方法:1、留出法,即预留一部分数据用作“验证集”以进行性能评估;2、损失函数。

3.1 预剪枝

        预剪枝对划分前后的泛化性能进行估计,若对某一节点划分后验证集的精度下降,则禁止划分该节点。预剪枝使得决策树的很多分支没有展开,不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高。预剪枝基于“贪心”的本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
        停止分类的条件:
(1) 如果节点中所有观测属于一类;
(2) 如果节点中所有观测的属性取值一致;
(3) 如果树的深度达到设定的阈值;
(4) 如果该节点所含观测值小于设定的父节点应含观测数的阈值;
(5) 如果该节点的子节点所含观测数将小于设定的阈值;
(6) 如果没有属性能满足设定的分裂准则的阈值。

3.2 后剪枝

        后剪枝先从训练集生成一棵完整决策树,对每个节点,若将该节点对应的子树替换为叶节点后,验证集精度提升,则进行剪枝。后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶节点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
        后剪枝的方法:
(1) Reduced-Error Pruning (REP):删除以此节点为根的子树使其成为叶节点,赋予该节点关联的训练数据的最常见分类,当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该节点。
(2) Pessimistic Error Pruning (PEP):计算某节点的误差,计算该节点的叶节点误差之和,当其误差小于等于叶节点误差之和加一个标准差时,则修建该节点。
(3) CCP:给基尼指数加上惩罚项,此时树的层次越深,基尼指数的惩罚项越大。

3.3 损失函数

        设树T的叶节点个数为|T|,t是树的叶节点,该叶节点有Nt个样本点,其中k类样本点有Ntk个,k=1、2…K, 为叶节点t上的经验熵,α≥0为参数,则决策树学习的损失函数可以定义为

        其中经验熵为


        参数α≥0控制两者之间的影响,较大的α促使选择较简单的模型,较小的α促使选择较复杂的模型。剪枝就是当α确定时,选择损失函数最小的模型,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好,损失函数正好表示了对两者的平衡。

四、连续与缺失值

4.1 连续值处理

        由于连续属性的可取值数目不再有限,因此不能直接根据连续属性的可取值来对接点进行划分,此时,连续属性离散化技术可派上用场,最简单的策略是采用二分法对连续属性进行处理。给定样本集D和连续属性A,假定A在D上出现了n个不同的取值,将这些值从小到大进行排序,记为 ,对相邻属性取值来说,在区间 中取任意值所产生的划分结果相同,因此对连续属性A,可以考察包含n-1个元素的候选划分点集合


        需要注意,与离散属性不同,划分节点时,若当前节点划分属性为连续属性,该属性还可以作为其后代节点的划分属性。

4.2 缺失值处理

        现实任务中常会遇到不完整样本,即样本的某些属性值缺失,这时需要解决两个问题:(1) 如何在属性值缺失的情况下进行划分属性选择?(2) 给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?


五、随机森林

5.1 优缺点

        随机森林是一个比较火的算法,它有很多优点:
  • 几乎不需要输入的准备,不需要测算就能够处理二分特征、分类特征、数值特征的数据。能够完成隐含特征的选择,能够处理高维度(特征很多)的数据,不用做特征选择,并且提供一个很好的特征重要度选择指标。在训练过程中,能够监测到特征间的相互影响。
  • 训练速度快,性能优化过程刚好又提高了模型的准确性。
  • 在数据集上表现良好。针对任何数据集,尽管可以找到性能优于它的模型(比较典型的是神经网络或一些增益算法boosting algorithm),但这类算法肯定不多,而且通常建立这样的模型并调试好,耗时要比随机森林算法模型多更多。这也是为何随机森林算法作为基准模型表现出色的原因。建立一个差劲的随机森林模型真的很难,因为随机森林算法对指定使用的超参数并不十分敏感。为了要得到一个合适的模型,参数并不需要做很多调整。只需使用大量的树,模型就不会产生很多偏差。大多数随机森林算法的实现方法的参数设置初始值是合理的。
  • 通用性。随机森林算法可以应用于很多类别的模型任务,它们可以很好的处理回归问题,也能够对分类问题应付自如,甚至可以产生合适的标准概率值。还可以用于聚类分析问题。
  • 简洁性。结论模型很简洁,学习算法本身很简洁,实现比较简单,基本的随机森林学习算法仅用几行代码就可以写出来了。
  • 提供了数量庞大的精彩、免费、开源实现方法。能在几乎所有主要的机器学习资料库和工具箱中找到一个好的实现方法。随机森林算法在R、scikit-learn和Weka上都有非常好的实现方法。
  • 容易做成并行化方法,boosted model或者大规模神经网络可做不到这一点。
  • 在创建随机森林时,对泛化误差使用的是无偏估计。
        随机森林算法的主要缺点是模型规模。模型很容易就会花费成百上千兆字节内存,最后会因为评估速度慢而结束。另一个可能会引发担忧的缺点就是随机森林模型是很难解释清楚的黑箱。

5.2 算法

        随机森林,顾名思义,是用随机的方式建立一个森林,森林里面有很多决策树,每一棵决策树之间是没有关联的。在得到森林之后,当有一个新的输入样本进入的时候,就用森林中的每一棵决策树分别判断,然后根据多数投票结果预测样本的类别。
        同一批数据用同样的算法只能产生一棵树,在建立每一棵决策树时,采样包括两个随机的过程。一是样本的随机,采用Bootstraping方法,这是一种有放回的抽样方法,也就是在采样得到的样本集合中可能有重复的样本。假设输入样本为N个,那么采样得到的样本也是N个。这样在训练时每一棵树的输入样本都不是全部样本,相对不容易出现过拟合。二是特征选择的随机。从M个特征中,随机选择m个特征(m<<M)。然后建立分类器(ID3/C4.5/CART/SVM/Logistic)。重复以上步骤K次,得到K个分类器,根据这些分类器的投票结果,决定输入数据属于哪一类。
        按这种算法得到的随机森林中每一棵树都是很弱的,但是组合起来就很厉害。可以这样比喻随机森林算法:每一棵决策树是一个精通于某一个窄领域的专家(从M个特征中选择m个进行学习),这样在随机森林中就有了很多个精通不同领域的专家,对一个新的问题,可以用不同的角度去看待,最终由各个专家投票得到结果。
        随机森林的生成方法:
1、从样本集中通过重采样的方式产生N个样本;
2、假设样本特征数目为M,选择m个特征,建立分类器;
3、重复K次,产生K棵决策树;
4、多数投票机制来进行预测。

猜你喜欢

转载自blog.csdn.net/ivy_reny/article/details/78743495