决策树通常有三个步骤:特征选择、决策树的生成、决策树的修剪。 常用的算法有ID3,C4.5,CART
ID3算法
ID3算法的核心是在决策树的各个节点上应用信息增益(大)准则选择特征,递归的构建决策树。
信息增益准则对可取值数目较多的属性有所偏好!
缺点:ID3算法只有树的生成,所以该算法生成的树容易产生过拟合。
C4.5算法
C4.5算法对ID3算法进行了改进,使用信息增益比(大)来选择特征。
增益率准则对可取值数目较少的属性有所偏好!
CART算法
分类与回归树(classification and regression tree, CART)
决策树的生成久士递归的构建二叉决策树的过程,对回归树用平方误差最小化准则,对分类树用基尼指数(小)最小化准则,进行特征选择,生成二叉树。
CART详细解释:
CART算法既可以用于创建分类树(Classification Tree),也可以用于创建回归树(Regression Tree)
CART作为分类树时,特征属性可以是连续类型也可以是离散类型,但观察属性(即标签属性或者分类属性)必须是离散类型。
CART分类树在节点分裂时使用GINI指数,GINI指数是度量数据划分或训练数据集D的不纯度为主。GINI值越小,表明样本的纯净度越高(即该样本只属于同一类的概率越高)。衡量出数据集某个特征所有取值的Gini指数后,就可以得到该特征的Gini Split info,也就是GiniGain。不考虑剪枝情况下,分类决策树递归创建过程中就是每次选择GiniGain最小的节点做分叉点,直至子数据集都属于同一类或者所有特征用光了。
当数据拥有众多特征并且特征之间关系十分复杂时,构建全局模型的想法就显得太难了,也略显笨拙。而且,实际生活中很多问题都是非线性的,不可能使用全局线性模型来拟合任何数据。一种可行的方法是将数据集切分成很多份易建模的数据,然后利用线性回归技术来建模。如果首次切分后仍然难以拟合线性模型就继续切分。在这种切分方式下,树结构和回归法就相当有用。
回归树要求观察属性是连续类型,由于节点分裂选择特征属性时通常使用最小绝对偏差(LAD)或者最小二乘偏差(LSD)法,因此通常特征属性也是连续类型。
以最小绝对偏差(LAD)为例
(1)先令最佳方差为无限大bestVar=inf。
(2)依次计算根据某特征(FeatureCount次迭代)划分数据后的总方差currentVar(,计算方法为:划分后左右子数据集的总方差之和),如果currentVar
(3)返回最佳分支特征、分支特征值(离散特征则为二分序列、连续特征则为分裂点的值),左右分支子数据集。
回归树举个例子:
原来CART回归树生成这么简单啊。。。 首先建立一个数据集,为了方便,就取少量数据,如下表,数据的创建仅作参考
臂长(m)年龄(岁)体重(kg)身高(m)(标签值)0.55201.10.77301.30.921701.7
训练数据中臂长,年龄,体重为特征变量X,身高为标签值Y,下面开始种树 1、首先将第一个特征的第一个值作为切割点(0.5),则划分的两个空间记为R1,R2
所以对于固定了特征后,从上面的MSE得出,所以特征“臂长=0.7”为切分点。同理。对于特征年龄,也可以采取上述的方式寻找最佳切分点,这样遍历了所有的特征,寻找平方误差最小的对(j,s),j表示第j个特征,s表示第j个特征的第s个值。本例中最佳切分点为0.7,所以以此将特征空间划分为两个区域(R1,R2). 3、对于第二步得到的R1h和R2,分别再次求最佳切分点,递归操作,过程同1~2。
:
显然该数据集包含17个样本,类别为二元的,即。则,正例(类别为1的样本)占的比例为:,反例(类别为0的样本)占的比例为:。根据信息熵的公式能够计算出数据集D的信息熵为:
二 减枝
预剪枝(pre-pruning) 后剪枝(post-pruning)
首先剪枝(pruning)的目的是为了避免决策树模型的过拟合。因为决策树算法在学习的过程中为了尽可能的正确的分类训练样本,不停地对结点进行划分,因此这会导致整棵树的分支过多,也就导致了过拟合。决策树的剪枝策略最基本的有两种:预剪枝(pre-pruning)和后剪枝(post-pruning):
预剪枝(pre-pruning):预剪枝就是在构造决策树的过程中,先对每个结点在划分前进行估计,若果当前结点的划分不能带来决策树模型泛华性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。 后剪枝(post-pruning):后剪枝就是先把整颗决策树构造完毕,然后自底向上的对非叶结点进行考察,若将该结点对应的子树换为叶结点能够带来泛华性能的提升,则把该子树替换为叶结点。