机器学习实战系列之学习笔记主要是本人进行学习机器学习的整理。本系列所有代码是用python3编写,并使用IDE Pycharm在Windows平台上编译通过。本系列所涉及的所有代码和资料可在我的github或者码云上下载到,gitbub地址:https://github.com/mcyJacky/MachineLearning,码云地址:https://gitee.com/mcyHome/MachineLearning,如有问题,欢迎指出~。
决策树(Decision tree),分类的决策树模型是一种描述对实例进行分类的树形结构,是一种基本的分类与回归方法。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal)和叶结点(leaf node),内部结点表示一个特征或属性,叶结点表示一个类。
用决策树进行分类,从根结点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每个子节点对应着该特征的一个取值,如此递归地对实例进行测试并分配,直到达到叶结点。最后将实例分到叶结点的类中。如下图1.1为决策树示意图。图中圆和方框表示内部结点和叶结点。
决策树还表示给定特征条件下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分(partition)上。将特征空间划分为互不相交的单元(cell)或区域(region),并在每个单元定义一个类的概率分布就构成了一个条件概率分布。决策树的一条路径对应于划分的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。假设 X X 为表示特征的随机变量, Y Y 为类的随机变量,那么这个条件概率分布可以表示 P(Y|X) P ( Y | X ) 。 X X 取值于给定划分下单元的集合, Y Y 取值于类的集合。各个叶结点上的条件概率往往偏向某一个类,即属于某一个类的概率较大,决策树分类时将该结点的实例强行分到条件概率大的那一类去。如下图1.2定义了特征空间的划分.图中大正方形表示特征空间。这个大正方形被若干个小矩形分割,每个小矩形表示一个单元。类别假设有两个类:A和B。图1.3即为图1.2所表示的条件概率分布的决策树。
决策树的学习,假设给定训练数据集
决策树学习本质上是从训练数据集中归纳出一组分类规则,与训练数据集不相矛盾的决策树(即能对训练数据进行正确分类的决策树)可能有多个,也可能一个也没有。我们需要的是一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。从一个角度看,决策树学习是由训练数据集估计条件概率模型。基于特征空间划分的类的条件概率模型有无穷多个,我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。决策树学习用损失函数表示这一目标,决策树学习的损失函数通常是正则化的极大似然函数,决策树学习的策略是以损失函数为目标函数的最小化。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。开始,构建根结点,将所有训练数据集放在根结点,选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下的最好的分类。如果这些子集已经能够被基本确定分类,那么构建叶结点,并将这些子集分到所对应的叶结点中去;如果还有子集不能被基本确定分类,那么就对这些子集选择新的最优特征,继续对其进行分割构建相应的结点,如此递归地进行下去,直到所有训练数据子集被基本正确分类,或没有合适的特征为止。最后每个子集都被分到叶结点上,即都有了明确的类,生产了一颗决策树。以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据未必有很好的分类能力,即可能发生过拟合现象。我们需要对已生成的数自下而上进行剪切,将数变得更简单,从而使它具有更好的泛化能力。具体地就是去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点。决策树学习的常用算法包括ID3、C4.5、CART三种。而决策树学习算法包含:
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别则这个特征是没有分类能力的。下面通过一个例子来说明特征选择问题。
表2.1是一个由14个样本组成的判断是否适合打网球(playtennis)数据集。数据包括Outlook、Temperature、Humidity、Wind4个特征属性。每个特征属性包括不同的特征向量。表最后一列就是表示分类结果:yes|no。
Day | Outlook | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|---|
D1 | Sunny | Hot | High | Weak | No |
D2 | Sunny | Hot | High | Strong | No |
D3 | Overcast | Hot | High | Weak | Yes |
D4 | Rain | Mild | High | Weak | Yes |
D5 | Rain | Cool | Normal | Weak | Yes |
D6 | Rain | Cool | Normal | Strong | No |
D7 | Sunny | Cool | Normal | Strong | Yes |
D8 | Overcast | Mild | High | Weak | No |
D9 | Sunny | Cool | Normal | Weak | Yes |
D10 | Rain | Mild | Normal | Weak | Yes |
D11 | Sunny | Mild | Normal | Strong | Yes |
D12 | Overcast | Mild | High | Strong | Yes |
D13 | Overcast | Hot | Normal | Weak | Yes |
D14 | Rain | Mild | High | Strong | No |
我们希望通过所给的训练数据学习一个打网球判断的决策树,用以对未来某天气特征能否进行打网球进行分类。下图2.1表示从表2.1数据学习到的两个可能的决策树,分别由两个不同的根结点构成。图2.1(a)根结点的特征是Outlook,有三个取值;图2.1(b)根结点的特征是Wind,有两个取值。对应于不同的取值有不同的子结点,两个决策树都可以从此延续下去。问题是:究竟选择哪个特征会更好些呢?这就要求确定选择特征的准则。直观上,如果一个特征具有更好的分类能力,或者说,按照这一特征将训练数据集分割成子集,使得各个子集在当前条件下有最好的分类,那就应该寻找这个特征。而信息增益(Information gain)就能很好的表达这一准则。
1)信息论(Information Theory)
在讨论信息增益之前,我们先引入几个概念,我们用最通俗易懂的话语来说明。什么叫信息论,也就是可以理解为一件事件所包含的信息量理论。那怎么看待一件事件所包含的信息量呢?首先,比如你收到两件事件的信息:①你妈妈打电话叫你冬天了多注意保暖;②你班主任打电话给你说你得了最高奖学金。对于第一件事件,你是会经常收到你妈妈的问候的,也就是概率极高。而第二件事件是你得了最高奖学金这件事情是很不容易发生的,也就是概率极低。我们可以认为第二件事件所包含的信息量更大。同时,如果问你这两件事件的信息总量是多少,我们可以将第一件事件和第二件事件的信息量进行相加。最后,信息量肯定是大于零。根据这三点,我们假设事件1的信息量为 H(x1) H ( x 1 ) ,事件2的信息量为 H(x2) H ( x 2 ) ,我们假设事件发生的概率为 p(x) p ( x ) ,我们会得出如下:
根据以上三点,我们刚好可以用 H(x)=log1p(x) H ( x ) = log 1 p ( x ) 来匹配上述的条件。
2)熵(Entropy)
在信息论与概率统计中,熵是表示随机变量不确定性的度量,当 X X 取有限个值的离散随机变量时,其概率分布为:
如当随机变量只取两个值,例如1,0时,即 X X 的分布为:
当 p=0 p = 0 或 p=1 p = 1 时 H(p)=0 H ( p ) = 0 ,随机变量完全没有不确定性。当 p=0.5 p = 0.5 时, H(p)=1 H ( p ) = 1 ,熵取值最大,随机变量不确定性最大。
3)条件熵
设有随机变量 (X,Y) ( X , Y ) ,其联合概率分布为:
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy).此时,如果有0的概率,令 0log0=0 0 log 0 = 0 。
4)信息增益
信息增益表示得知特征 X X 的信息而使得类 Y Y 的信息的不确定性减少的程度。设特征 A A 对训练数据集 D D 的信息增益 g(D,A) g ( D , A ) ,定义为集合 D D 的经验熵 H(D) H ( D ) 与特征 A A 给定条件下 D D 的经验条件熵 H(D|A) H ( D | A ) 之差,即
决策树学习可以应用信息增益准则选择特征。给定训练数据集 D D 和特征 A A ,经验熵 H(D) H ( D ) 表示对数据集 D D 进行分类的不确定性。而经验条件熵 H(D|A) H ( D | A ) 表示在特征 A A 给定的条件下对数据集 D D 进行分类的不确定性。那么它们的差,即信息增益,就表示由于特征 A A 而使得对数据集 D D 的分类的不确定性减少的程度。显然,对于数据集而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益,信息增益大的特征具有更强的分类能力。
根据信息增益准则的特征的选择方法:对训练数据集(或子集) D D ,计算其每个特征的信息增益,并并比较它们的大小,选择信息增益最大的特征。
设训练数据集为 D D , |D| | D | 表示其样本容量。设有 K K 个类 Ck,k=1,2,..,K,|Ck| C k , k = 1 , 2 , . . , K , | C k | 为属于类 Ck C k 的样本个数, ∑Kk=1|Ck|=|D| ∑ k = 1 K | C k | = | D | 。设特征 A A 有 n n 个不同的取值 {a1,a2,...an} { a 1 , a 2 , . . . a n } ,根据特征 A A 的取值将 D D 划分为 n n 个子集 D1,D2,...Dn D 1 , D 2 , . . . D n , |Di| | D i | 为 Di D i 的样本个数, ∑ni=1|Di|=|D| ∑ i = 1 n | D i | = | D | 。记子集 Di D i 中属于类 Ck C k 的样本的集合为 Dik D i k ,即 Dik=Di D i k = D i ∩ ∩ Ck C k , |Dik| | D i k | 为 Dik D i k 的样本个数。于是信息增益的具体算法如下:
①经验熵:
②经验条件熵:
③计算信息增益:
下面对表2.1中Wind特征进行信息增益的计算:
5)信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比(information gain ratio)可以对这个问题进行校正,这是特征选择的另一个准则。
定义:特征 A A 对训练数据集 D D 的信息增益比 gR(D,A) g R ( D , A ) 为信息增益 g(D,A) g ( D , A ) 与训练数据集 D D 关于特征 A A 的值的熵 HA(D) H A ( D ) 之比,即:
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止;最后得到一个决策树。
算法步骤:
输入:训练数据集 D D ,特征集 A A ,阈值 ε ε ;
输出:决策树 T T .
(1)若 D D 中所有实例属于同一类 Ck C k ,则 T T 为单结点树,并将类 Ck C k 作为该结点的类标记,返回 T T .
(2)若 A=∅ A = ∅ ,则 T T 为单结点树,并将 D D 中实例最大的类 Ck C k 作为该结点的类标记,返回 T T .
(3)否则,按信息增益算法计算 A A 中各特征对 D D 的信息增益,选择信息增益最大的特征 Ag A g .
(4)如果 Ag A g 的信息增益小于阈值 ε ε ,则置 T T 为单结点树,并将 D D 中实例数最大的类 Ck C k 作为该结点的类标记,返回 T T .
(5)否则,对 Ag A g 的每一可能值 ai a i ,依 Ag=ai A g = a i 将 D D 分割为若干非空子集 Di D i ,将 Di D i 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成数 T T ,返回 T T .
(6)对第 i i 个子结点,以 Di D i 为训练集,以 A−{Ag} A − { A g } 为特征集,递归地调用步骤(1)~(5),得到子树 Ti T i ,返回 Ti T i 。
注意:ID3算法容易产生过拟合现象。
C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进,C4.5算法在生成过程中,用信息增益比来选择特征。
算法步骤:
输入:训练数据集 D D ,特征集 A A ,阈值 ε ε ;
输出:决策树 T T .
(1)若 D D 中所有实例属于同一类 Ck C k ,则 T T 为单结点树,并将类 Ck C k 作为该结点的类标记,返回 T T .
(2)若 A=∅ A = ∅ ,则 T T 为单结点树,并将 D D 中实例最大的类 Ck C k 作为该结点的类标记,返回 T T .
(3)否则,按信息增益比算法计算 A A 中各特征对 D D 的信息增益比,选择信息增益比最大的特征 Ag A g .
(4)如果 Ag A g 的信息增益比小于阈值 ε ε ,则置 T T 为单结点树,并将 D D 中实例数最大的类 Ck C k 作为该结点的类标记,返回 T T .
(5)否则,对 Ag A g 的每一可能值 ai a i ,依 Ag=ai A g = a i 将 D D 分割为若干非空子集 Di D i ,将 Di D i 中实例数最大的类作为标记,构建子结点,由结点及其子结点构成数 T T ,返回 T T .
(6)对第 i i 个子结点,以 Di D i 为训练集,以 A−{Ag} A − { A g } 为特征集,递归地调用步骤(1)~(5),得到子树 Ti T i ,返回 Ti T i 。
决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现,设树T的叶结点个数为 |T| | T | , t t 是树 T T 的叶结点,该叶结点有 Ni N i 个样本点,其中 k k 类的样本有 Ntk N t k 个, k=1,2,...K k = 1 , 2 , . . . K , Ht(T) H t ( T ) 为叶结点t上的经验熵, α≥0 α ≥ 0 为参数,则决策树学习的损失函数可以定义为:
剪枝,就是当 α α 确定时,选择损失函数最小的模型,即损失函数最小的树。当 α α 确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。图4.1为决策树剪枝的示例模型。
除了信息增益好信息增益比进行特征选择时,我们还可以使用基尼指数,我们常常把它用于CART算法。
定义:分类中,假设有 K K 个类,样本点属于第 k k 类的概率为 pk p k ,则概率分布的基尼指数定义为:
而对于给定的样本集合 D D ,其基尼指数为:
基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)表示精A=a分割后集合D的不确定性。基尼指数值越大,样本集合的不确定性也就越大。
我们也可以通过分类误差率进行特征选择,假设有 K K 个类,样本点属于第 k k 类的概率为 pk p k 分类误差率的公式如下:
运用熵、基尼指数、分类误差率进行二类分类分类时,得到的结果是一样的。从下图5.1可以知道三条曲线取到最值的时候是相同的。
【参考】:
1. 《统计学习方法》作者:李航 第5章 决策树
2. 《机器学习》作者:周志华
3. 视频《机器学习全新升级版Ⅰ》(决策树)秦曾昌
转载声明:
版权声明:非商用自由转载-保持署名-注明出处
署名 :mcyJacky
文章出处:https://blog.csdn.net/mcyJacky