机器学习(决策树算法的实现)

1、决策树算法的原理

1.1决策树模型

分类决策树是一种描述对实例进行分类的树形结构[1],由结点和有向边组成,而结点又有两种类型,一是用来表示特征或属性的内部结点,二是用来表示一个类的叶结点。

决策树的分类,是指从根结点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到子结点,每个子结点对应着被测试特征的某些取值,如此递归地对实例进行测试并分配,直至达到叶结点完成实例的分类。

1.2决策树学习算法

决策树学习的本质是从训练数据集中集中归纳出一组分类规则,以此分类规则来构建与训练数据集不矛盾的决策树,并且需要有很好的泛化能力,使得决策树所代表的条件概率模型不仅对训练数据有很好的拟合,而且对未知数据也能有非常的预测效果。

决策树学习的算法是一个递归地选择最优特征,根据特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程,如果子数据集被基本正确分类,则构建叶结点将子集进行分类,如若还有子集不能被基本正确分类,就对这些子集继续选择新的最优特征,继续对其进行分割。

以上方法生成的决策树可能对训练数据有很好的分类效果,但对未知测试数据的分类可能效果则不佳,这时就需要进行剪枝,去掉过于细分的叶结点,退回更高的结点,然后再将更高的结点改为新的叶结点。

1.3特征选择

特征选择的过程中,给定数据集D和特征A,经验熵[1]表示对数据集D进行分类的不确定性,而经验条件熵[2]则表示在特征A给定的条件下对数据集进行分类的不确定性,那么他们的差[3],即信息增益,表示由于特征A而使得对数据集D的分类的不确定性减少的程度。

ID3算法会根据此类公式计算出信息熵最大的特征,将数据集按照的范围划分为子数据集,若子数据集按照这个特征划分后已经可以正确分类自己子数据集的所有数据,则将子数据集作为一个叶结点,对类进行标记;如若不能正确分类,则继续按照上述分类方法对其余的特征进行信息熵的计算,再按照信息熵最大的特征对子数据集进行划分,最后观察子数据集是否已经正确分类,正确分类则作为叶结点类标记完成分类,不能正确分类的子数据集则继续进行信息熵计算并递归划分。

特征的划分通过信息增益的比较来进行有一个主要的缺点,会倾向选择取值比较多的特征,为了克服这一缺点,特征的划分中也会通过信息增益比[4]的比较来进行特征的划分,与此划分方法相对应的则是C4.5算法。

1.4决策树剪枝

1.4.1剪枝介绍

无论是用ID3算法还是C4.5算法对特征进行划分,都有着过拟合的特点,过于拟合训练数据会导致决策树结构过于复杂,使得对于未知的数据的分类效果不佳,而我们希望构建的决策树不仅拥有较好的拟合能力,还需要较好的泛化能力。为了实现这一目标,对决策树进行剪枝减少模型复杂程度就成为了决策树算法不可或缺的一环。

剪枝主要分为预剪枝和后剪枝两种。预剪枝是指在分成过程中,对每个结点进行划分前进行估计,若划分不能提升泛化能力,则停止划分,记当前结点为叶结点;而后剪枝则是在生成一棵完整的决策树之后,自底而上地对内部结点进行考察,若此内部结点变为叶结点,可以提升泛化能力,则进行替换。

1.4.2预剪枝

预剪枝一般有三种方法:限定决策树的深度、设定一个阈值或设置某个指标来比较划分前后的泛化能力。深度就是以根结点为深度0,然后每次进行特征划分则对深度进行加1操作,限定深度顾名思义,则是剪除限定深度以下的所有决策树;而设定阈值进行预剪枝则是在ID3算法的基础上,计算出信息增益最大的值后,将最大的信息增益与阈值ε进行比较,如果该信息增益小于阈值ε,该结点则作为叶结点完成分类,并观察该结点对应的数据集中哪一类分类的实例个数最多,按照此分类进行类标记;而比较划分前后的泛化能力则主要比较误差率这一指标,误差率是指通过测试集进行测试后,分类错误的数据个数与数据集个数的比值。当数据集按照某一特征进行分类后,得到按照该特征不同取值分类的各个子数据集的子结点,直接按照各个子数据集中实例最多的类对子结点进行类标记后,通过测试集分别对特征划分前后的误差率进行计算,如若划分后的误差率大于等于划分前的误差率,则不通过此特征进行特征的划分,直接按照实例最多的类对父结点进行类标记构建决策树。

1.4.3后剪枝

后剪枝则是在决策树已经生成之后,通过训练集从深度最深的结点开始向上进行误差个数的计算,测试按照某一特征的不同取值后得到的叶结点进行分类的误差个数,再去掉该特征对应的所有叶结点,直接按照该特征数据集中实例最多的类进行类标记,通过测试集进行分类的测试,得到误差个数。若,则去掉该特征的所有叶节点,直接进行类标记,否则保持原决策树,然后再逐步减小深度,选择其他特征进行递归的剪枝比较,直到剪枝进行到根结点。

1.5 CARD算法

从根结点出发,设结点处的数据集为D,计算现有特征对数据集的基尼指数[5],按照基尼指数最小的特征进行根结点的二叉树切分,划分成两个数据的,对划分的两个结点进行基尼指数的计算(在子数据的一个节点进行基尼指数[6]的计算,需要按照类标记取值的是与否来进行),选择基尼指数最小的那个特征作为最优切分点,然后在最优切分点按照剩余特征中基尼指数最小的特征进行二叉树划分,如此递归调用直到满足停止条件(结点中的样本个数小于预定阈值、样本集的基尼指数小于预定阈值、没有剩余特征)。

若某一个特征在训练集中的分叉特征大于2,则需要对每一个分叉特征取值的是与否通过基尼指数进行二叉树分类计算,选取最小的基尼指数作为该特征的基尼指数,并按照该分叉特征取值的是与否的作为父特征的二叉树。

2、决策树算法的代码实现

2.1 训练数据集的创建

代码中的datasets在python中是一个二层嵌套的列表变量,列表的第一层嵌套例如datasets[0]表示这个列表中的第一个列表变量,代码中为[’青年,’否’,’否’’,’一般’,‘否’],代表该训练数据集中的第一个数据;而列表的第二层嵌套例如datasets[0][0]表示这个列表中的第一个子列表下标为0的一个值,代码中为’青年’,代表该训练数据集中第一个数据第一个特征的取值,而labels就是给每一个具体特征进行类标注。

图1 数据集创建函数

2.2 经验熵的计算

根据公式(1)我们可以知道,经验熵的计算公式就是分别以分类类别是与否的数据样本的比重当作概率来计算经验熵。代码中for循环的本质就是来计数类别分别为是与否的样本个数:datasets[i][-1]的意思就是第i+1个子列表中倒数第一个数据值,在数据集中代表的便是贷款的是与否;而for循环是一个以数据集为循环长度的遍历循环,for循环的后三行表示,label_count本来是一个空字典,在第一次出现类别为是或否的时候创建字典的键(类别的是或否)并对该键的键值进行+1的计数,之后再索引到类别的是与否就直接对相应的键值进行+1操作,最后,这个字典的键值就是分类类别取值是或否的样本个数,就可以直接通过python中取label_count的键值按照公式(1)来进行经验熵的计算。

图2 经济熵函数代码

2.3 经验条件熵的计算

函数中的axis是一个可变变量,在函数没有赋予该变量他值的时候,axis就默认为0。根据公式(2)易知,经验条件熵不过是按照特征的不同取值将原来的训练数据集划分为子集,子集按照经验熵的公式来进行熵的计算后,再在前面乘上子集在训练数据集中所占的比例便可。在for循环中,仍然是按照数据集的长度进行循环,逐一遍历datasets中每一个子列表的下标为axis+1的值,这意味着程序在遍历每一个数据的第axis+1个特征,在遍历中第一次出现某个特征的某个特征取值的时候,创建该特征取值为字典中的键,并创建一个空列表。然后再在每次遍历到该特征的时候,在该空列表中逐一加入datasets的子数据,意味着创建的字典feature_sets是一个以该特征为键,包含该特征的所有数据为键值的二层嵌套列表,便和经验熵计算函数cala_ent()的函数调用格式对应上了,在计算时进行函数的嵌套调用,再在前面乘上比例就可完成经验条件熵的计算。

图3 经济条件熵函数代码 

2.4 信息增益的计算与比较

根据公式(3)可知,特征C的信息增益就是经验熵减去以C为特征的经验条件熵的值。代码中的for循环便是一个以数据特征个数(不包含分类的是与否)为循环次数的遍历循环,在best_feature列表中加入每一个特征和该特征信息增益的元组,然后再在max函数中选取信息增益最大(元组的最后一个值即best_[-1])的特征,再将该特征(元组的第一个值即best_[0])按照format函数格式打印出来便可完成信息增益的比较,信息增益最大的特征就是分类的最佳特征。

图4 信息增益的比较和计算函数代码

图5 信息增益的计算和比较结果 

3、学习总结

①仅通过一批训练集数据建立的决策树模型虽然能够相当正确地完成训练集数据的分类,但该模型也只是达到了局部最优,若不进行剪枝进行全局优化,对未知数据集的分类必然错误率极高。

②决策树模型在现实生活的应用中,非常适合从孤立的有规律的数据集中按照人为分析给定的特征找出数据分类与相关特征取值的联系,高准确率的数据分类规律挖掘与分析是决策树算法在现实生活应用的主要场景

③决策树模型在通过训练集完成构造后,仍需不断地通过测试集来测试相关特征分类的准确性,决策树模型的构造是一个不断学习、优化、完善的一个过程。

④决策树模型不适合运用于无规律随机的数据集,在特征的选取方面也仍需人工对数据集进行分析后给定具体特征,决策树模型并非能够代替人类直接从完全孤立的数据中直接找出影响分类的特征,而是通过数据集和人为给定的特征,找出数据分类与人为给定的特征之间的关联。

⑤编译软件的安装在每一个电脑上可能会出现不同的问题,要多在网上博客上查阅他人的经验与资料来具体情况具体分析,从而解决自己安装的问题。

⑥读懂机器学习的代码需要非常多的python的基础知识,一定要多加积累python的基础数据类型及常见的函数后,才能在机器学习的编程上有所进展。

⑦理解机器学习的知识和代码后,再通过比较专业易懂的语言描述出来对写作的要求是非常之高,机器学习的许多公式概念还是非常抽象的。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《机器学习》西瓜书是机器学习领域的一本经典教材,其中的决策树算法机器学习中的一种重要分类算法决策树算法可以用于决策问题,将问题分解成多个子问题,通过构造决策树来递归地进行分类。 决策树算法的构建过程可以分为两个步骤,即特征选择和决策树生成。在特征选择过程中,需要根据某个评估指标对不同特征进行排序,选择最优的特征作为节点进行分割。常用的评估指标包括信息增益、信息增益比和基尼系数等。在决策树生成过程中,需要递归地生成决策树的各个节点,通过特征选择将训练样本不断划分成子集,并为每个子集生成一个新的节点,直到满足停止条件。 决策树算法具有易理解、易实现的特点,同时对部分异常数据具有一定的鲁棒性。但是,在处理高维数据或特征较多的数据集时,决策树算法可能会存在过拟合等问题。为了解决这些问题,可以使用剪枝算法、随机森林等方法进行优化和改进。 在实际应用中,决策树算法被广泛应用于数据挖掘、信用评估、医学诊断、文本分类等领域。在学习和应用决策树算法时,需要注意特征选择和决策树生成的各种细节和算法选择,以及如何利用决策树算法解决实际问题。 ### 回答2: 《机器学习》这本西瓜书是机器学习领域的经典教材之一,其中涉及了决策树算法决策树是一种基于树形结构的分类方法,可以用于处理离散型和连续型数据集。使用决策树算法建立模型的过程,可以理解为递归地将数据切割成小的子集,使得每个子集的纯度尽可能地提高,最终生成一棵有序的树型结构。 决策树算法的训练过程,通常分为三个步骤:选择最优特征、建立决策树以及剪枝。其中选择最优特征的目的是在当前样本集合中,找到对样本分类最有帮助的特征,通过衡量每个特征的信息增益或信息增益比,选出最优特征作为节点。根据节点特征将数据集分成若干互斥的子集,然后递归地对子集进行划分,生成决策树。最后,通过剪枝减少决策树的复杂度和泛化误差,得到最终的模型。 决策树算法在实际应用中具有很高的灵活性和可解释性,相对简单的分类问题中具有很好的性能。但是,当数据集过大或过于复杂时,决策树算法的计算复杂度会显著增加,生成的决策树容易过拟合,泛化能力较差。因此,在进行模型训练时需要进行特征选择、代码优化以及剪枝等操作。 ### 回答3: 决策树机器学习中一种常用的算法,它采用树状结构来进行分类和预测。在《机器学习》西瓜书中,决策树被归为监督学习中的分类算法决策树算法的主要思想是将数据按照特征属性分为不同的类别。决策树有三个关键的概念:节点、分支、叶子节点。节点包括根节点、内部节点和叶子节点。根节点代表数据集,内部节点表示特征属性,叶子节点代表不同的数据类别。 在决策树算法中,有两种常用的构建方式:ID3算法和C4.5算法。这里我们简要介绍一下C4.5算法。C4.5算法决策树算法中的一种改进算法,它不仅考虑了信息熵,还考虑了各个特征属性之间的相关性,从而提高了决策树算法的准确率。 C4.5算法主要分为三个步骤:特征选择、决策树的生成和决策树的剪枝。在特征选择阶段,C4.5算法采用信息增益比来选择最优划分属性。在决策树的生成阶段,C4.5算法采用递归方法,依次生成决策树的各个节点。在决策树的剪枝阶段,C4.5算法通过比较剪枝前后的错误率来确定是否进行剪枝。 总的来说,决策树算法是一种简单且常用的分类算法,它不仅易于理解和解释,还具有较高的分类准确率。当然,在实际应用中,我们需要根据实际情况选择合适的决策树算法,并对模型进行调参和优化,提高算法的性能和实用性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值