【机器学习实战】决策树

一.决策树简介

       决策树(decision tree)是一种基本的分类与回归方法。举个通俗易懂的例子,如下图所示的流程图就是一个决策树,长方形代表判断模块(decision block),椭圆形成代表终止模块(terminating block),表示已经得出结论,可以终止运行。从判断模块引出的左右箭头称作为分支(branch),它可以达到另一个判断模块或者终止模块。
        决策树(decision tree)的一个重要任务就是为了理解数据中所蕴含的知识信息,因此决策树可以使用不熟悉的数据集合,并从中提取出一系列规则,这些机器根据数据集创建规则的过程,就是机器学习过程。

       决策树是一种基本的分类与回归方法。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论;也可以认为是定义在特征空间与类空间上的条件概率分布。决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。这就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。这里所覆盖是指实例的特征与路径上的特征一致或实例满足规则的条件。

决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。

适用数据类型:数值型和标称型,但树构造算法只适用于标称型数据,因此数值型数据必须离散化
优点:计算复杂度不高,输出结果易于理解,对于中间值的缺失不敏感,可以处理不相关特征数据
缺点:可能会产生过度匹配问题(过拟合,暂不讨论)

使用决策树做预测需要以下过程:

1.收集数据:可以使用任何方法。
2.准备数据:收集完的数据,我们要进行整理,将这些所有收集的信息按照一定规则整理出来,并排版,方便我们进行后续处理。参见上面的适用数据类型进行整理。
3.分析数据:可以使用任何方法,决策树构造完成之后,我们可以检查决策树图形是否符合预期。
4.训练算法:构造一个决策树的数据结构。
5.测试算法:使用经验树计算错误率。
6.使用算法:此步骤可以使用适用于任何监督学习算法,而使用决策树可以更好地理解数据的内在含义。

二.特征选择
        为了找到决定性的特征,划分出最好的结果,必须评估每一个特征。特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率,如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。在划分数据集之前之后信息发生的变化成为信息增益,知道如何计算信息增益,我们就可以计算每个特征值划分数据集获得的信息增益,获得信息增益最高的特征就是最好的选择。

        决策树的典型算法有ID3,C4.5,CART等。ID3算法是一种贪心算法,用来构造决策树。ID3算法以信息熵的下降速度为选取测试属性的标准,即在每个节点选取还尚未被用来划分的具有最高信息增益的属性作为划分标准,然后继续这个过程,直到生成的决策树能完美分类训练样例,此算法的目的在于减少树的深度,但是忽略了叶子数目的研究。C4.5算法在ID3算法的基础上进行了改进,对于预测变量的缺值处理、剪枝技术、派生规则等方面作了较大改进,既适合于分类问题,又适合于回归问题。(以后补充)。

划分数据集的大原则是:将无序的数据变得更加有序。

度量集合无序程度的两种方法:(有兴趣的可以看数学之美这本书)

使用信息论度量信息:在划分数据集之前之后信息发生的变化成为信息增益,通过计算每个特征值划分数据集获得的信息增益,选出获得信息增益最高的特征作为划分数据集的参考属性。
基尼不纯度:简单说就是从一个数据集中随机选取子项,度量其被错误分类到其他分组里的概率
本文选用第一种方法,那么就要计算信息增益。

集合信息的度量方式称为香农熵或简称熵。为什么熵可以用来表示数据集的混乱程度?(古人说的记住就好)

熵定义为信息的期望值。在信息论与概率统计中,熵是表示随机变量不确定性的度量。如果待分类的事务可能划分在多个分类之中,则符号xi的信息定义为 
l(xi)=−log2p(xi)
l(xi)=−log2p(xi)
其中,p(x_i) 是选择该分类的概率。

将概率在[0,1]之间的信息转换为0到正无穷之间的数,那么在接下来计算信息熵时,拉开了数据间距,更能反映出数据的混乱程度。熵越高,表示数据的混乱数据越多。熵的计算公式如下:

H=−∑(i=1,n)p(xi)log2p(xi)

也就是说,在数据集中去掉某个特征前后,熵的变化越大,信息增益越大,表明被去掉的这个特征越能更好地划分当前数据集。

代码里面部分会涉及到条件熵,经验熵的问题,但是书上没有具体讲,有兴趣的可以查看具体的知识
 

三.决策树的构造

一般采用递归原则构造决策树。递归结束的条件有两个:

1.程序遍历完所有划分数据集的属性:如果数据集已经处理了所有属性,但是类标签依然不是唯一的,此时通常会采用多数表决的方法决定该叶子节点的分类,即选择出现次数最多的那个标签。
2.每个分支下的所有实例都具有相同的分类:如果所有实例具有相同的分类,则得到一个叶子节点或者终止块。任何达到叶子节点的数据必然属于叶子节点的分类。
 

四.决策树的修剪

       决策树是充分考虑了所有的数据点而生成的复杂树,有可能出现过拟合的情况,决策树越复杂,过拟合的程度会越高。 考虑极端的情况,如果我们令所有的叶子节点都只含有一个数据点,那么我们能够保证所有的训练数据都能准确分类,但是很有可能得到高的预测误差,原因是将训练数据中所有的噪声数据都”准确划分”了,强化了噪声数据的作用。剪枝修剪分裂前后分类误差相差不大的子树,能够降低决策树的复杂度,降低过拟合出现的概率。 这里不再详细说明。
       由于特征数目并不是每次划分数据分组时都减少,因此这些算法在实际使用时可能引起一定的问题。目前我们并不需要考虑这个问题,只需要在算法开始运行前计算列的数目,查看算法是否使用了所有属性即可。

       决策树生成算法递归地产生决策树,直到不能继续下去未为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
 

五.决策树的可视化

使用字典存储的决策树不好直观的感受,使用python中的Matplotlib注解绘制树形图方便直观。

六.测试和存储分类器,,使用决策树预测隐形眼镜类型

决策树生成之后可以保存用在下次需要的时候,这样会节约时间,运用生成之后的决策树可以快速的将测试实例进行分类,隐形眼镜是一个具体的应用,很简单,自己手动模拟就好。

七.代码遇到的问题

1.绘制决策树时汉字乱码的问题

from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']

2.图形中添加注释(annotate)

3.熟悉使用matplotlib(稍后会专门学习matplotlib的使用)

4.python中list,tuple,dict,set的区别和用法(基础~~~~~~~~)

八.总结

决策树的一些优点:

1.易于理解和解释,决策树可以可视化。
2.几乎不需要数据预处理。
3.使用树的花费(例如预测数据)是训练数据点(data points)数量的对数。
4.可以同时处理数值变量和分类变量。
5.可以处理多值输出变量问题。
6.使用白盒模型。如果一个情况被观察到,使用逻辑判断容易表示这种规则。
决策树的一些缺点:

1.决策树学习可能创建一个过于复杂的树,并不能很好的预测数据。也就是过拟合。修剪机制(现在不支持),设置一个叶子节点需要的最小样本数量,或者数的最大深度,可以避免过拟合。
2.决策树可能是不稳定的,因为即使非常小的变异,可能会产生一颗完全不同的树。
3.学习一颗最优的决策树是一个NP-完全问题.因此,传统决策树算法基于启发式算法,例如贪婪算法,即每个节点创建最优决策。这些算法不能产生一个全家最优的决策树。对样本和特征随机抽样可以降低整体效果偏差。
4.概念难以学习,因为决策树没有很好的解释他们。如果某些分类占优势,决策树将会创建一棵有偏差的树。因此,建议在训练之前,先抽样使样本均衡。

 

 

 

代码~稍后补上
 

你可能感兴趣的:(机器学习)