在博弈论中常常使用决策树寻找最优决策,这些决策树往往是人工生成的。在数据挖掘过程中,决策树的生成通常是通过对数据的拟合、学习,从数据集中获取到一棵决策树。
决策树的形式,从根节点到叶子节点的路径就是决策的过程。其本质思路就是使用超平面对数据递归化划分。决策树的生成过程,就是对数据集进行反复切割的过程,直到能够把决策类别区分开来为止,切割的过程就形成了一棵决策树。
而实例隶属于决策树每个终端节点的个数,就可以看作该节点的支持度,支持度越大,该规则越有力。
决策树的构造过程
决策树解决的问题:
- 选择哪一个属性进行第一次划分?
- 什么时候停止继续划分?
对于第一个问题,需要定义由属性进行划分的度量,根据该度量可以计算出对当前数据子集来说最佳的划分属性。对于第二个问题,通常有几种方法:一种是定义一个停止树进一步生长的条件,另一种是对生成完成的树进行再剪枝。
选择属性进行划分
信息增益方法基于信息熵原理(一种对信息混乱程度的度量)。一般来说,信息如果是均匀的混合分布,则信息熵就高。若信息呈现一致性分布,则信息熵就低。在决策树分类之中,若数据子集中类别混合均匀分布,则信息熵较高。若类别单一分布,则信息熵就低。
显然地,选择信息熵向最小的方向变化的属性,就能使得决策树能够迅速达到叶子节点,从而能够构造一棵决策树。对于每个数据集/数据子集,信息熵可如下定义:
\[ENT(D_j)=-\sum^{c-1}_{i=0}p_ilog_2P_i\]
c是数据集/子集D_j中决策类的个数,p_i是第i个决策类在D中的比例。
对于任意一个属性,将数据集进行划分为多个数据子集,则该属性的信息增益为未进行划分时的数据集的信息熵与划分后数据子集的信息熵加权和的差:
\[GAIN(A)=ENT(D)-\sum_{j=0}^k\frac{|D_j|}{D}ENT(D_j)\]
A是候选属性,k是该属性的分支数;D是未使用A进行划分时的数据集,D_j是由A划分而成的子数据集;|x|代表数据集的实例个数。
Gini系数则是从另一个方面刻画了信息的纯度。该方法用于计算从相同的总体中随机选择的两个样本来自于不同类别的概率:
\[Gini(D_j)=1-\sum^{c-1}_{i=0}p_i^2\]
c是数据集/子集D_j中决策类的个数,p_i是第i个决策类在D中的比例
于是,对于任意一个属性,将数据集划分为多个子集,则未进行划分时的数据集的Gini系数与划分后数据子集的Gini系数加权和的差为:
\[Gini(D)-\sum^k_{j=1}\frac{D_j}{D}Gini(D_j)\]
在所有属性中,具有最大G(A)的属性被选为当前进行划分的结点。
由此可以看出,两者计算结果是类似的,但是,信息增益方法和Gini系数法都有一个问题,即他们都偏向于具有很多不同值得属性,因为多个分支能降低信息熵或Gini系数。但决策树划分为很多分支会降低决策树的适用性。
CART算法 只生成二叉树。为生成二叉树,CART使用Gini系数测试属性值两两组合,找出最好的二分方法。
C4.5算法 采用了信息增益的改进形式增益率来解决问题。增益率在信息增益中引入了该结点的分支信息,对分支过多的情况进行惩罚:
\[\frac{GAIN(A)}{-\sum^k_{i=1}\frac{|D_j|}{|D|}log_2\frac{|D_j|}{D}}\]
k为属性A的分支数。 因此可知,k越大,增益率越小。
CHAID方法 利用卡方检验来寻找最优的划分属性。(对于连续的属性,使用卡方检验方法将其离散化。对于离散属性,使用卡方检验方法查找可以合并的值。
获得大小适合的树
决策树的目的事实上是通过训练集获得一棵简洁的、预测能力强的树。但往往树完全生长会导致预测能力的降低,因此最好是恰如其分。以下定义树停止生长的条件如下:
- 最小划分实例数:当当前结点对应的数据子集的大小小于指定的最小划分实例数时,即使它们不属于同一类,也不再进行进一步划分。
- 划分阈值:当使用的划分方法所得的值与其父结点的值的差小于指定的阈值时,不再进行划分
- 最大树深度。当进一步的划分超过最大树的深度的时候,停止划分。
另一种方法是在生成完全决策树之后进行剪枝任务。
在CART中,对每个子树构造一个成本复杂性指数(参考了误分类错误率和树的结构复杂度),从一系列结构中选择该指数最小的树作为最好的树。其中,误分率需要用一个单独的剪枝集来评估。树的复杂度也通过树的终端节点个数与每个终端节点的成本的积来刻画。 而C4.5则采用了悲观剪枝法。采用树的叶节点在训练集上的错误率,在一定的置信度上根据二项式分布估计其在未知数据上的错误率上限。根据该值来确定是否进行剪枝。C4.5的剪枝过程中,可以将子树完全剪掉,也可以用该子树的某个子树来代替该子树。