最近的计划是先将周志华先生的《机器学习》整体先过一遍,对于其中的经典算法中的一些公式进行推导和理解,并整理成笔记。关于课后习题部分先暂时放一放,留待下个月研究《Machine Learning in Action》的时候,在完成课后习题中关于编程的部分。
注:为了方便理解,我将书中的所说的属性称为特征,而可取值数目我称之为属性,这样就比较好理解一些,如特征为:色泽,他的属性有{青绿,乌黑,浅白}。
-ID3 (Iterative Dichotomiser, 迭代二分器)决策树学习算法 — 信息熵,信息增益
-C4.5决策树算法 — 增益率
-CART(Classification and Regression Tree)决策树算法 — 基尼指数
-剪枝处理 — 预剪枝, 后剪枝
-连续值与缺失值的处理
-多变量决策树
ID3算法包括后面的C4.5算法都是由澳大利亚计算机科学家罗斯·昆兰(J. Ross Quinlan)发明。
在ID3算法中最为重要的两个概念就是信息熵和信息增益。其中信息熵是信息论中的概念,在这里用于表示信息的纯度。假定当前样本集合D中第k类样本所占比例为 p k p_k pk(k=1,2…|y|),则D的信息熵可以定义为:
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D) = - \sum^{|y|}_{k=1} p_klog_2 p_k Ent(D)=−k=1∑∣y∣pklog2pk
信息增益表示表示属性a在用于划分时所获得“纯度提升”的程度,即信息增益越大,“纯度提升”越大,此时就可以选择信息增益最大的属性来进行划分。信息增益定义为:
G a i n ( D , a ) = E n t ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ E n t ( D v ) Gain(D,a) = Ent(D)-\sum_{v=1}^{V}\frac{|D^v|}{|D|}Ent(D^v) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
其实ID3算法的核心就是上述的信息熵和信息增益,其具体使用方式可以详见周志华先生的《机器学习》第75页。下面我将用简单的语言来描述信息熵和信息增益实际使用的方式(假定训练集是个二分类问题的训练集):
(1) 根据训练集可以求出正负样本所占的比例,就是上述的 p k p_k pk,然后可以得到训练集的信息熵Ent()
(2) 针对于特征a(在数据中通常表现为某一列),对应多个属性{x, y, z}
(3) 计算每个属性{x, y, z}的信息熵, 即为信息增益中的 E n t ( D v ) Ent(D^v) Ent(Dv)
(4) 计算每个属性样本数占总样本数的比例,就是信息增益中的 ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} ∣D∣∣Dv∣
(5) 计算每个特征的信息增益,选取信息增益最大的作为最优划分特征
NOTE:其实“熵”可以理解为物质的混乱程度。放在机器学习上,如果一个特征有很多的属性,如花的颜色有红色、黄色、绿色等,其属性越多,越代表这个属性越混乱,所以其信息熵也就越高。
在信息论中,我们需要对信息进行编码,如果这个信息比较混乱如花的颜色,每个颜色我们都需要进行编码,就需要更多位来对这些信息进编码,码字就会比较长。如果只是花的大小,我们用很短的码字就可以将这两种属性区别开来。
“奥卡姆剃刀”原则告诉我们:如无必要,勿增多余。其实说的也就是一个“熵”减的行为~
在信息增益的公式中,后面表示使用该特征来进行划分的时候,整体的“熵”,用原来的“熵”减去使用该特征来划分时的“熵”得到的就是这个用这个特征来划分的信息增益,其实就是表示该特征使原数据集熵下降的程度(或能力),那我当然选择能力最强的了
由于信息增益准则对可取值数目较多的属性有所偏好,为了减少这种偏好所带来的影响,C4.5算法不直接使用信息增益,而采用“增益率”来选择最优划分属性,增益率的定义如下:
G a i n r a t i o ( D , a ) = G a i n ( D , a ) I V ( a ) I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ l o g 2 ∣ D v ∣ ∣ D ∣ Gain_ratio(D,a) = \frac{Gain(D,a)}{IV(a)} \\ IV(a) = -\sum_{v=1}^{V} \frac{|D_v|}{|D|}log_2 \frac{|D^v|}{|D|} Gainratio(D,a)=IV(a)Gain(D,a)IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
其实这里的IV(a)跟信息熵的定义一样,只不过信息熵中的 p k p_k pk是正负样本所占的比例,而在IV(a)中, ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} ∣D∣∣Dv∣是特征a中所有属性对应的样本个数所占的比例,IV(a)的值越高就表示特征a中属性类别就越多,但是他处于分母上,就势必会使得增益率减小,就这样减小了信息增益“偏好”所带来的影响。
需要注意的是,增益率对属性数目较少的属性有所偏好,所以C4.5算法也不是直接选择增益率最大的特征,而是采用了一个启发式的算法:先从候选特征中找出信息增益高于平局水平的特征;再从这些特征中选取增益率最高的。
数据集D的纯度可以采用基尼值来度量:
G i n i ( D ) = ∑ k = 1 ∣ y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ y ∣ p k 2 Gini(D)= \sum_{k=1}^{|y|} \sum_{k^{'} \neq k}p_k p_k^{'} \\ = 1 - \sum_{k=1}^{|y|}p_k^{2} Gini(D)=k=1∑∣y∣k′̸=k∑pkpk′=1−k=1∑∣y∣pk2
基尼值反应了从数据集D中随机抽取两个样本,其类别标记不一致的概率,因此,基尼值越小,表示D的纯度越高。
基尼系数定义为:
G i n i i n d e x ( D , a ) = ∑ v = 1 V ∣ D v ∣ ∣ D ∣ G i n i ( D v ) Gini_index(D,a) = \sum_{v=1}^{V} \frac{|D^v|}{|D|} Gini(D^v) Giniindex(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
于是在候选集合中,选取基尼系数最小的特征作为最优划分特征。
在决策树中,剪枝是对付“过拟合”的主要手段。
预剪枝是在决策树的生成过程中,对每个节点子在划分前先进行估计,如果当前结点的划分不能带来决策树的泛化性能的提升,就停止划分,并将当前结点标记为叶结点。
所以这楼里为了验证决策树的泛化性能是否得到提升,**需要将训练集划分一部分数据作为验证集。**于是,我们可以将预剪枝总结为以下的几个步骤:
(1) 将数据集划分训练集和验证集;
(2) 按照某个规则(以信息增益最大的特征作为最优划分特征)选取划分特征;
(3) 将这个特征节点标记为叶子节点,且该叶子节点的label为训练样例数量最多的label;
(4) 计算此时的决策树在验证集上的准确度(划分前);
(5) 将该节点标记为根节点,其特征每个属性对应一个分支,每个分支上的叶子节点标记为该属性对应的训练样本中label数量最多的label;
(5) 计算此时的决策树在验证集上的准确度(划分后);
(6) 判断划分前后的准确度,如果划分后的准确度高于划分前,则进行划分;否则就标记为叶子节点,停止划分。
后剪枝是先从训练集生成一颗完整的决策树,然后自底向上的对非叶节点进行考察,若将该节点替换为叶子节点可以提升决策树的泛化性能,则将该节点替换为叶子节点,该节点原来的叶子节点就被剪去了。与预剪枝类似,我们可以写出如下的剪枝步骤:
(1) 将数据集划分训练集和验证集;
(2) 根据训练集生成一颗决策树;
(3) 自下而上的考察每一个非叶子节点;
(4) 计算此时的决策树在验证集上的准确度(剪枝前);
(5) 将该非叶子节点标记为叶子节点,label标记为此节点中训练样例中label数量最多的;
(5) 计算此时的决策树在验证集上的准确度(剪枝后);
(6) 判断剪枝前后的准确度,如果剪枝后的准确度高于剪枝前,则进行进行剪枝;否则就考察下一个非叶子节点。
预剪枝的优点:可以避免过拟合;减小训练时间。
预剪枝的缺点:可能带来欠拟合的风险。
后枝的优点:欠拟合风险小;泛化性能往往优于预剪枝。
后剪枝的缺点:时间开销大。
在处理连续值的时候,我们一般先将这n个连续值由小到大进行排序,并且选取相邻两个值的均值Ta作为划分点,这样我们可以得到n-1个这样的划分点。每个划分点都将训练集分成两个部分,我们将这两个部分标记为{-, +},那么我们的信息增益就可以这么计算:
G a i n ( D , a ) = max t ∈ T a { E n t ( D ) − ∑ λ ∈ { − , + } ∣ D λ ∣ ∣ D ∣ E n t ( D t λ ) } Gain(D, a) = \max_{t ∈ Ta} \{Ent(D) - \sum_{\lambda ∈ \{-,+\}} \frac{|D^ \lambda|}{|D|} Ent({D_t^\lambda})\} Gain(D,a)=t∈Tamax{Ent(D)−λ∈{−,+}∑∣D∣∣Dλ∣Ent(Dtλ)}
其实就是寻找能使信息增益最大的划分点Ta,其中 E n t ( D t λ ) Ent(D_t^\lambda) Ent(Dtλ)就是计算在当前某个点划分点下的信息熵,因为划分点将训练集分成了两个部分,每个部分中都有正负样本,这样就能计算此时的信息熵。
值得注意的是,与离散特征不同,连续特征还可以作为后代节点的划分特征。
在训练集上有时会出现样本中一些值缺省的情况,如果直接丢掉,则是对信息的极大浪费。在决策树中,我们同样可以使用有缺省值的样本进行训练。
给定训练集D和特征a,
令 D ′ D^{'} D′表示在特征a上没有缺省值的样本集合。
令 D v ′ D^{'}_v Dv′表示在特征a中属性为v的样本。
D k ′ D^{'}_k Dk′表示属于第k类(如正负样本)的样本。
为每一个样本都定义一个权重 w x w_x wx,**这个权重初始化为1。**于是有如下的几个参数:
p = ∑ x ∈ D ′ w x ∑ x ∈ D w x p k = ∑ x ∈ D k ′ w x ∑ x ∈ D ′ w x r v = ∑ x ∈ D v ′ w x ∑ x ∈ D ′ w x p = \frac{\sum_{x ∈ D^{'}} w_x}{\sum_{x ∈ D}w_x} \\ p_k = \frac{\sum_{x ∈ D^{'}_k} w_x}{\sum_{x ∈ D^{'}}w_x} \\ r_v = \frac{\sum_{x ∈ D^{'}_v} w_x}{\sum_{x ∈ D^{'}}w_x} p=∑x∈Dwx∑x∈D′wxpk=∑x∈D′wx∑x∈Dk′wxrv=∑x∈D′wx∑x∈Dv′wx
其中:
p可以表示为无缺失值的样本所占的比例;
p k p_k pk可以表示无缺失值的样本中,label为第k类样本所占的比例;
r v r_v rv可以表示为无缺失值样本中特征a中的属性v对应的样本数所占的比例。
基于上面的定义,我们可以将信息增益推广为:
G a i n ( D , a ) = p ∗ ( E n t ( D ′ ) − ∑ v = 1 V r v E n t D v ′ ) Gain(D,a) = p * (Ent(D^{'}) - \sum_{v=1}^{V}r_v Ent{D^{'}_v}) Gain(D,a)=p∗(Ent(D′)−v=1∑VrvEntDv′)
看到这里,可能回想,不是说也将缺省值也纳入考虑吗?到这里都没有提及缺省值的样本怎么处理。先别着急,对于有缺省值的样本,是这样处理的:
(1) 根据推广后的信息增益,我们可以选择信息增益最大特征作为最优划分特征;
(2) 没有缺省值的样本进入特征中各属性对应的叶子节点;
(3) 将有缺省值的样本同时放入该特征下所有的叶子节点中,并将权值 w x w_x wx调整为 r v ∗ w x r_v * w_x rv∗wx。
直观上来看,就是将同一个样本最终以不同的概率进入到不同的叶子节点中去。
到这里终于发现权值的作用了,没有缺省值的样本权值一直为1,但是有缺省值的样本会随着程序的运行,权值会被更改,如果缺省值比较多的样本,随着程序的运行,其权值会越来越小。所以从另一个角度来说就是:含有缺省值的样本以不同概率来影响决策树的生成,其缺省值越多,影响会越小。
如果我们将视角放在二维平面来观察决策树的分类边界,其边界的每一段都是与坐标轴平行的,呈现锯齿状。但是在学习任务的真实分类比较复杂的时候,必须使用很多段划分才能获得比较好和的近似,此时的决策树会相当复杂,需要进行大量的属性测试,预测的时间开销会很大。
因此,如果能使用斜的划分界面,就可以使模型得到简化。**所以其实多变量决策树其实就是每个非叶子节点不是某个固定的特征,而是几个特征的线性组合。**是形如 ∑ i = 1 d w i a i = t \sum_{i=1}^{d}w_ia_i = t ∑i=1dwiai=t的线性分类器。
至于多变量决策树如何生成,我这里也没有做深入的研究,多变量决策树构造算法已经得到了很多学者的重视,并且已经有了比较深入的研究和发展,主要有:
(1)Brodley C.E等人使用顺序反向删除和顺序前向选择两种策略,选择若干属性的线性组合作为分枝属性在组合系数的确定上,分别以均方误差最小和划分的复杂度最小为目标,使用了递归最小二乘法和CART方法;
(2)苗夺谦 等人提出利用粗糙集来构造多变量决策树,用相对泛化的概念构造多变量检验,提出了一种评价多变量检验的准则;
(3)Pagallo 等通过构造属性的Boolean组合,来解决重复子树的问题;
(4)赵翔等提出了基于主成分分析的多变量决策树构造方法,提取信息系统中的 若干主成分来构造决策树;
(5)吴强,王煦法等提出了基于非线性拟合方程的多变量决策树算法,选择了一个较优的属性子集,对此子集中的属性进行加权组合,用于构造决策树的节点,采用二次多项式来拟合两个属性间可能存在的相关性,从而构造出决策树。
留待之后研究,如有朋友对多变量决策树有一定的研究,还请不吝赐教~