一则写给自己的、奇异的札记,这里,种的树并不是世俗的树,而是决策树!是一件不平凡的事。
但一切又很简单,我们这里只是想用一种正确的方式来打开这棵树,为此,只需要种下对的树种,宠着它直到长好枝叶就阔以得到一处荫凉啦... ...
了解一棵决策树!Intro first
所以说,决策树也就是一棵平凡的树而已,它由 '根节点'、'内部节点/枝节点'、'叶节点' 组成,根节点如树的根部,唯一存在且承担决策树决策总体的角色,每一个叶节点都代表了一个预测出的分类类型,而内部节点则是连接根和叶的决策过程部分,如下图所示,是一棵简单的决策树,它所解决的分类预测问题是“我是否应该接受这一岗位的邀请?”,考虑了薪水、时间管理、是否提供免费咖啡三个你平时比较注意的要点(即,作为样本分岔的属性)。
一棵决策树,当它被喂入数据集训练时,将会按照它的类型自动生长起来,此过程以伪代码形式记录如下:
了解了决策树的基本形态、结构和生长方式后,就要考虑怎么去种一棵好树。
优苗选育!Good choice to begin
那么自然是要找到有最佳表现的决策树幼苗啦!下面将介绍三种常见的树种{C3决策树、C4.5决策树、CART分类回归树(From Breiman)}以及它们的一些优缺点。
种树专家香农 (Shannon Claude,信息论专家) 曾经利用公理化假设提出一种衡量事物不确定性的物理量:命名为信息量,感性上说,这种量能够衡量当前随机变量集中所含的有效信息的多少,这有利于我们得到一棵优良的决策树。
为此我们先给出信息论的公理化假设:
a. 一个事件的信息量与这个事件发生的概率是呈负相关的;
b. 信息量满足可加性:;
c. ;
d. .
依微分学,易得所需信息熵函数可以表示对数式,同时为了方便编码领域的应用,将底数设为 ‘2’,从而得到了衡量当前样本集合的信息凌乱程度即信息熵:
,
求和遍历样本集中每一对样本,此物理量数值越大,说明当前的树生长的越不完全,通过计算并比较构造(一层)树枝前后,的增量大小即可了解这一层的出现所对应的信息量大小。
构造ID3决策树时,并不是随意地把每一层与一个(使得样本分岔的)属性相对应,而是首先判断当前(即所有属性 - 之前用掉的属性)哪一个属性对于决策树分岔的影响最大,由前述,即寻找对应增量最大的一个属性作为下一个分岔层的属性,这一增量可以显式表达为:
,
由上述,可得ID3所规定的函数可表示为:.
可以看出,树的种类不同实际上意味着对于其构造方式的要求不同。
C4.5与决策树核心算法ID3并无大差大别,只是将属性的选择判据改为信息增益比
,
即采用一个分类信息值来规范化信息增益,这样做的好处有
a. 能够克服“ID3算法会倾向于选择取值较多的属性”的缺陷,且保留核心算法中构造时剪枝的优势;
b. 利于连续属性的离散化处理;
c. 适合有缺陷的数据处理;
d. 解释性强、准确率高.
分类信息值定义为
,
其中,代表了目前内部节点对应的集合中可能会在下一步分岔选择 'j' 属性的数目,这里也可以看出,这个规范化因子也是一种信息熵,从这个角度来讲,它也因此获得优良的规范化一个熵值的能力。
C4.5这种决策树仍然由于算法效率过低(大量的顺序扫描)且需要过大的内存而大体停留在理论部分,很常用的则是下面这个... ...
这种决策树最早由Breiman提出,目前在统计领域、数据挖掘得到了广泛使用,它采用了另一种增益的衡量方式(GINI指数)作为属性分岔的选择依据。
这里仅限于构造一个分类决策树,实际上它还可以作回归使用。
CART决策树所使用的算法依然与ID3决策树中相同,只是其中所涉及到的信息熵增益要改为GINI指数增益,因此在这里我们可以把GINI指数当作类似于信息熵的一种物理量,
,
其中,代表了目前内部节点对应的集合中可能会在下一步分岔选择 'j' 属性的数目。
下面让我们利用CART决策树的模型来培养一棵小树... ...
种树!Algorithm realize... ...
如图所示,可以得到一棵简单的小决策树... ...
此代码走的是平凡路线(o゚v゚)ノ,在MATLAB中调用CART决策树Algorithm: fitctree(),输入其中自带的鸢尾花数据集,来进行决策树实现的试验。
照料决策树!Cut redundant leaves
剪枝,为了让我们的树把肥料(内存)都用在正确的地方(防止过拟合),就需要把一些多余的枝叶修剪掉,过拟合是非常常见的一件事,例如在下面的情况下我们浪费了过多的内存用于生成了一个奇形怪状的函数(紫色线):
所以说,在一定的误差范围内,需要剪枝这一操作,上面的三种决策树种都带有一些剪枝的影子,它们在生长的同时(构造决策树的同时)都会自己通过一些信息条件规划最优的生长模式,这种操作叫做预剪枝,还有一种剪枝方式更为常用,即后剪枝,下面有两种很很很基本的后剪枝策略 CCP 和 REP 可以实现决策树的优化以防止过拟合的发生。
错误率降低剪枝,将决策树的训练集取出合适的部分A用作剪枝的材料,用初始决策树给出对应于A数据集的预测结果与真实结果进行比较得出预测错误率,用修剪该 ‘层/节点’ 前后的错误率、进行比较,子树的预测错误率未下降,则修剪该 ‘层/节点’ ,可以以伪代码表示此剪枝过程如下:
代价复杂度剪枝,依据误差增加率来判断是否进行剪枝,其与前述剪枝方法的不同之处在于它并不需要抽出训练集中的数据进行检验,且它采用的剪枝的判断法则不同,这里使用一个叫做误差增加率的统计量:
,
这里代表当前决策树的训练数据集误差,代表剪枝后产生的决策树的误差,而则对应剪枝前后的叶节点数,用于限制增加率的范围,通过预先为这一超参数赋值的方式来对于剪枝操作进行判断,从而完成修建决策树的操作。