决策树可以用于解决分类问题,也可以用于解决连续型的回归预测问题,是业界常说的机器学习的十大算法之一。决策树也属于监督学习的一种。
在教科书里必须会出现的,常用的决策树大概有3种,分别是C4.5,ID3,CART算法。本章中都会一一详细讲述。
1. 决策树的结构
决策树是由节点和有向边组成。节点分两种类型:内部节点与叶子节点。
内部节点:表示的是一个特征
叶子节点:表示的是一个类。
也就是说样本通过内部节点的各个特征的判断,最终会到达属于它的叶子节点,从而就获得了它被分在的类别。
下面是一个决策树的图形:圆形节点表示内部节点(特征),方形节点表示叶子节点(类别)。这个决策树有两个类别:出去打球,不出去打球。有三个特征:outlook,humidity,windy。
这是一个很经典的案例,下面是原始数据。
结合数据与图形进行解析:首先拿了outlook这个特征来进行分类,outlook有三种值:sunny,overcast,rainy。当取overcast的时候,有4个样本,4个样本全是yes的类别,所以没有必要再继续使用其他特征去分类了。当取sunny的时候有5个样本,但是5个样本中类别不一致(3个no,2个yes),所以接着又选取了humidity这个特征来做分类,当outlook为sunny,humidity为high的时候,全部3个样本都为no,当humigity为normal的时候,全部2个样本为yes。既然同一个节点的类别一致了,那么分类也到此结束了。再看另一侧,当outlook为rainy的时候,仍然没有分出一致的类别,所以使用了windy这个特征进一步做分类,发现在outlook为rainy,windy为true的时候全部2个样本都是no,当为false的时候全部3个样本为yes。至此,每一个叶子节点上的类别都是一致的了,所以决策树通过这个3个特征非常准确得分出了所有样本的类别。
再通过两个图形来认识一下决策树的结构:
案例一:相亲之前通过年龄,长相,收入,是否为公务员这4个特征来分类“约会”与“不约会”的两个类别
案例二:通过个头大小,叫声,脖子长短,鼻子长短,水生与陆生这5个特征来分类动物的种类。
2. 特征的选择
上面的介绍中也看到,要做到正确的分类,大部分时候都是需要用到多个特征的,有效特征越多则分类的错误率可能就越低。
但是那么多特征,到底要先使用哪个特征后使用哪个特征呢?特征使用的先后顺序是否会对分类的准确性或是效率产生影响呢?
那必须会呀~
那要通过什么指标来衡量每个特征,并依次选出最先使用的特征呢?
本节我首先介绍一下熵的含义与计算,然后依次介绍C4.5,ID3,Cart三种算法的特征选择标准。
2.1 熵,条件熵
2.1.1熵的定义
熵entropy表示对随机变量不确定性的度量。
设X是一个取有限个值的离散随机变量。
比如下表,x取3个值,并对应了三个概率:
x= | 1 | 2 | 3 |
---|---|---|---|
p(x) | 0.1 | 0.5 | 0.4 |
那么随机变量的熵就是定义为:
那么上表中的X的熵H(x)等于:
H(X) = -0.1 * log0.1 - 0.5 * log0.5 - 0.4 * log0.4 = 0.9433
关于信息熵,还有以下几个注意点
1.通常熵计算的公式中的对数以2为底,或者以e为底。以2为底熵的单位称作比特(bit),以e为底,熵的单位为纳特(nat).
2.另外,由公式可知,熵的大小只与X 的分布概率Pi有关,与X本身的取值无关。
3.熵越大,则随机变量的不确定性就越大。
比如抛硬币,正反两面的概率都为0.5,熵为-0.5*log0.5-0.5*log0.5 = 0.6931;若正面的概率为0.7,反面的概率为0.3,那个熵就变为-0.7*log0.7-0.3*log0.3 = 0.6109,比前者的熵要小,因为不确定性降低了,我们再猜的时候更会去猜概率大的正面。
2.1.2 条件熵的定义
H(Y/X)表示在X给定的条件下Y的条件概率分布的熵对X的数学期望,公式为:
上述公式是可以简单推倒出来的:
(X,Y)发生所包含的熵,减去X单独发生包含的熵,就是在X发生的前提下,Y发生所带来的新的熵,也就是Y的条件熵:H(Y/X) = H(X,Y)-H(X)
根据H(Y/X) = H(X,Y)-H(X),我们来一步步展开:
展开与转换的过程需要用到条件概率的公式,在这里不细讲每一步,不明白的童鞋去复习一下概率论中条件概率的知识就行啦~
2.2 信息增益
2.1.1 信息增益的定义
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到的时候,所对应的熵与条件熵分别叫做经验熵与经验条件熵
信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
信息增益的定义为:
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差。
信息增益也称为互信息(mutual information)。
分析公式,H(D)是样本数据集在没有任何给定特征下的经验熵。H(D|A)是在得知了特征A的概率分布后的得到的数据集的条件经验熵。将两者相减,就是在没有任何特征下的数据集D分类的不确定性减去得知A特征的分类概率分布后数据集D的不确定性。也就是A特征的信息是的数据集D的不确定性降低的程度,如果降低的程度越大则信息增益越大,该特征的分类能力也越强。
在决策树ID3算法中,选择最优的特征就是根据信息增益来决定的。我们最先使用信息增益最大的特征来做决策树的分类,因为它会使分类的不确定性下降得最快。
2.2.2 信息增益的计算方法
首先定义一下接下去要提到的各个符号的含义:
第一步:输入数据集D
第二步:计算数据集D的经验熵
第三步:计算经验条件熵H(D|A)
第四步:计算信息增益
2.3 信息增益比
使用信息增益来进行特征选择存在一个问题,它会偏向于选择取值较多的特征。比如职业这个特征有10个值,而性别只有2个值,因为前者的取值较多所以会使得信息增益变大,所以误导选择了前者的特征,实际上可能性别的分类效果更好。
为了解决这个问题,决策树C4.5算法选择了信息增益比来选择特征。
信息增益比的定义:
特征A对训练数据集的信息增益比gr(D,A)定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵H(D)之比。
2.4 基尼系数
CART算法中特征的选择是用“基尼系数”来衡量的,另外,也用基尼系数来决定该特征的最优二值切分点。
假设有K个类,样本点属于第k类的概率为P(k),则概率分布的基尼系数定义为:
基尼系数与熵的比较:
另:在经济学意义上也有一个指标叫做基尼系数,然而此基尼系数非彼基尼系数。我们在初高中的政治课本上学过的是经济学上意义上的基尼系数。它是衡量一个的确的贫富差距的指标。
具体意义如下:
给定M个样本,计算样本的最大值与最小值,然后将所有样本等分成N份,计算每份的样本数目xi,则每份的近似概率为:
pi = xi/M, i=1,2,…M
计算累积概率为:
基尼系数的图形为:
蓝色区域B为累积概率,若B面积越大A越小,贫富差距越小。
3. 决策树的生成
这一节分别介绍ID3,C4.5,CART三类决策树生成算法。
回顾一下ID3算法使用的特征选取标准是信息增益;C4.5使用的是信息增益比,Cart使用的是基尼系数。
3.1 ID3算法
ID3算法采用了信息增益准则来进行特征的选择,其步骤如下:
第一步:输入训练数据集D,特征集A,阀值e
第二步:若D中所有实例都属于同一类Ck,则决策树T为单节点树,并将Ck作为该节点的类标记,返回决策树T。
第三步:若特征集A为空集,那么T为单节点树,并将D中的实例数最大的类Ck作为该节点的类标记,返回T。
第四步:若第二步与第三步都不满足,则计算特征集A中各个特征对D的信息增益,选择信息增益最大的特征Ag。
第五步:如果Ag的信息增益小于阀值e,则T为单节点树,并将D中的实例数最大的类Ck作为该节点的类标记,返回T。
第六步:若Ag的信息增益大于等于阀值e,对Ag的每一个可能值ai都分在一个子节点Di,将Di中实例数最大的类作为该子节点的标记。由结点与其子结点构成了树T,返回T。
第七步,对第i个结点,以Di为-训练数据集,A-{Ag}为特征集,递归地调用第二步–>第六步,得到树Ti,返回Ti。
3.2 C4.5算法
C4.5与ID3算法是类似的,唯一的不同就是使用了信息增益比来代替了信息增益来选择最优特征。
步骤与ID3同。
3.3 CART算法
CART全称为classification and regression tree.可以用于分类也可以用于回归。
CART假设决策树是二叉树,每个节点都只有“是”与“否”的两个特征值,左分支为“是”的分支,右分支为“否”的分支。也就是递归地二分每个特征,将输入空间即特征空间氛围有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
4.决策树的评价
假定样本的总类别为K个。
对于决策树的某个节点,假定该叶节点含有样本数目为n,其中第k类的样本数目为nk,k=1,2,3…K
如果某类样本nj=n,则称该节点为纯洁点,即只有一个类别
若各类样本数目n1=n2=..=nk=n/K,则称该节点为均结点
纯结点的熵Hp = 0,最小
均节点的熵Hu = lnK,最大
对所有叶子节点的熵求和,该值越小说明对样本的分类越精确。
注:若个叶子节点包含的样本数目不同,可使用样本数加权求熵和。
所以,评价函数可以写成:
由于这个评价函数越小越好,所以可以称之为损失函数。
5. 决策树的过拟合
5.1 决策树的剪枝
决策树算法递归地生成决策树,直到不能继续下去为止,能对训练数据集非常准确地分类。但是对训练数据的过于准确往往会产生过拟合的问题。为了解决这个问题,要对通过训练集生成好的复杂的决策树进行简化,也就是“剪枝”。
三种决策树的剪枝过程算法相同,区别仅仅是对于当前树的评价标准不同,分别根据信息增益,信息增益率,基尼系数。
剪枝,就是在决策树上裁掉一些叶子节点或者子树,并将原来的根节点或父节点作为叶子节点。
那么如何剪枝呢?
由完全树T0开始,剪枝部分结点得到T1,再次剪枝部分结点得到T2,…直到仅剩树根的树Tk
然后,自验证集上对这k个树分别评价,选择损失最小的树Ta
原损失函数的公式如下:
但是叶节点越多,决策树越复杂,则根据以上公式计算的损失就会越大。所以加入了一个剪枝系数α。修正后的损失函数为:
当α=0,未剪枝的决策树损失最小
当α=正无穷,单根节点的决策树损失最小
那么这个α是如何计算出来的呢?
假定当前对以r为根的子树剪枝:
剪枝后,只保留r本身而删掉所有的叶子节点
考虑以r为根的子树:
剪枝后的损失函数:
剪枝前的损失函数:
令二者相等,求得:
那么剪枝算法是如何执行的呢?
对于给定的决策树T0:
1.计算所有内部结点的剪枝系数;
2.查找最小剪枝系数的结点,剪枝得决策树Tk;
3.重复以上步骤,直到决策树Tk只有一个节点;
4.得到决策树序列T0T1T2..Tk;
5.使用验证样本集选择最优子树
使用验证集做最优子树的标准,可以使用评价函数:
6. 随机森林
6.1 bagging策略
bootstrap aggregation
这个策略是从样本中有重复的采样选出n个样本;然后再所有特征上,对着n个样本建立分类器。重复以上步骤m次,即获得了m个分类器。将数据放在这m个分类器上,最后根据这m个分类器的投票结果,决定数据属于哪一类。
6.2 随机森林
随机森林在bagging基础上做了修改。
1.从样本集中用bootstrap采样选出n个样本
2.从所有属性中随即选择k个属性,选择最佳分割属性作为结点建立CART决策树;k特征的选取可以是随机的。实际中如果特征数目本身就不多的话,也可以不对特征进行采样。
3.重复以上两步m次,即建立了m棵CART决策树
4.这m个CART形成随机森林,通过投票表决结果,决定数据属于哪一类。
采样的好处在于避免了噪声对模型的影响,也避免了过拟合。
那么怎么确定树的数量呢?这是一个超参数,可以用交叉验证来验证选取最优的数目。
怎么确定抽取的样本数?抽样数/总样本数的比例为α的话,α属于(0,1],在有些机器学习库中会开放出来让用户自定义的。
上面的决策树用的CART树,但其实也可以使用SVM,logist回归。
虽然在理论上不推荐使用它们,因为多个决策树组合就称为强分类器。而SVM,LG,本身就是强分类器,对噪声敏感,要是结合起来强强联合会对噪声更敏感
6.3 投票机制
1.简单投票机制:
一票否决
少数服从多数
阀值表决
2.贝叶斯投票机制
假定有N个用户可以为X个电影投票(假设不能同一个投票者不能给同一个电影重复投票),投票有1,2,3,4,5星供5个档。
如何根据用户投票,对电影进行排序?
可以使用以下方案:
6.4 样本不均匀的常用处理方法
假定样本恕不A类比B类多,且严重不平衡。
1.A类欠采样Undersampling
对 A类进行随机欠采样;
将A类分成若干子类,分别与B类;
基于聚类的A类分割。
2.B类过采样Oversampling
将B类已有的样本进行成倍复制
3.B类数据的合成Synthetic data generation
随机取B类中的任意两个样本点,设定一个权值,在两个样本点之间根据这个权值创建一个新的点。这个点就是新合成的点
4.代价敏感学习Cost sensitive learning
降低A类的权值,提高B类的权值