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

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的基础数据类型及常见的函数后,才能在机器学习的编程上有所进展。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值