Decision Tree

来源:互联网 发布:js性能测试代码 编辑:程序博客网 时间:2024/05/17 22:30

1. Decision Tree

Reference:http://www.hankcs.com/ml/decision-tree.html

代码用ID3生成算法和C4.5生成算法实现,并用matplotlib可视化出来。

分类决策树是对实例进行分类的树形结构。由结点和有向边组成。结点分为内部结点和叶节点。内部结点表示一个特征或属性,叶节点表示一个类。

分类时,从根节点出发,当前结点设为根节点,且当前结点必定有一个特征值,根据值向下移动,最终到达叶节点,由此将实例分到叶节点对应的类中。
image

决策树学习算法包括特征选择、决策树生成与剪枝过程。

1.1 决策树学习

根据最优特征对数据集进行递归式分割。在开始时,构建根节点,选择最优特征,该特征有几个特征值就分割几个子集,每个子集分别调用此方法。直到数据集为空或数据集只有一维向量才分割完毕。

高度不同决策树有不同的复杂程度,这是一个NP问题,能实现的生产算法都是局部最优,剪枝是当前决策树下的最优解。

1.2 特征选择

样本有很多维特征,且选择具有分类能力的特征。

如何判断一个特征的分类能力?

信息增益:
对于一个可能有n种取值的随机变量:
image

其熵为:

image

熵其实就是X的不确定性,从定义可验证:

image

设有随机变量(X,Y),其联合分布为:

image

条件熵H(Y|X)表示在已知随机变量X的条件下随机变量Y的不确定性,定义为在X给定的条件下,Y的条件概率分布对X的数学期望:

image

信息增益定义:

image

因此,信息增益大的特征有更强的分类能力。只要找到各个特征的信息增益,找到最大的就行。
image

信息增益比:
信息增益的值是相对于训练集而言,当当H(D)大的时候,信息增益值往往会偏大,这样对H(D)小的特征不公平。改进的方法是信息增益比:

image

注:上述公式分母应该是特征A的 split information value :

1.3 决策树生成

ID3算法:

从根节点开始,计算所有特征的信息增益,选择信息增益最大的特征作为当前结点的特征,特征的不同值作为空白子节点,对空白子节点递归调用此方法,知道左右特征的信息增益小于阈值或没有特征可选为止。

C4.5生成算法:
与ID3相似,但是选择的时候用信息增益比。

image

1.4 决策树的剪枝

构建决策树的时候为了准确率很容易发生过拟合,解决办法就是简化已生成的决策树,也就是剪枝。

剪枝通过最小化整体cost/loss function来实现。

设决策树T的叶节点有|T|个,t是某个叶节点,t有Nt个样本点,其中归入k类的样本点有Ntk个,Ht(T)为叶节点t上的经验熵,α≥0为参数,则损失函数可以定义为:

image

其中经验熵Ht(T)为:

image

表示叶节点t所代表的类别的不确定性。损失函数对它求和表示所有被导向该叶节点的样本点所带来的不确定的和的和。

在损失函数中,将右边第一项记作:

image

则损失函数可以简单记作:

image

C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,|T|表示模型复杂度,参数α≥0控制两者之间的影响,α越大,模型越简单,α=0表示不考虑复杂度。

剪枝,就是当α确定时,选择损失函数最小的模型。子树越大C(T)越小,但是α|T|越大,损失函数反映的是两者的平衡。

决策树的生成过程只考虑了信息增益或信息增益比,只考虑更好地拟合训练数据,而剪枝过程则考虑了减小复杂度。前者是局部学习,后者是整体学习。

树的剪枝算法

从每个叶节点往上走,走了后如果损失函数减小了,则减掉叶节点,将父节点作为叶节点。如图:

image

1.4.1 CART生成

就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数最小化准则,进行特征选取,生成二叉树。

1、回归树

连续变量。

2、分类树

1.4.2 CART剪枝

原创粉丝点击