上面这段对话,我们可以抽象成如下的一棵树:
决策树是一种树形结构,其中每个内部节点表示一个属性上的测试,每个分支代表一个测试输出,每个叶节点代表一种类别。决策树具有监督式的特征提取与描述的功能,将输入变量根据目标设定来选择分支变量与分支方式,并以树枝状的层级架构呈现,以提取分类规则。
构建决策树目的
构建决策树的步骤
决策树的分析数据包括我们需要决策的目标变量与根据问题所选择的可以对目标变量进行决策的分支变量,我们希望分支变量容易理解与解释决策树。
有的属性取值只有二元,比如性别只能取值男女,一道题目的对错。还可以是多个属性值,比如一些学生的年级。还有些属性具有顺序,比如青年、中年、老年,我们不能将他们随意组合。
还有一种属性取值是连续的,我们可以将其表示为比如(X>a)或(X<=a)的形式,将其离散化。比如我们可以把年龄分成【0,18】,【19,28】,【29,38】等,而不是把每一岁作为一个属性值,就显得非常臃肿与不必要了。
训练集与测试集:拿到一份数据,我们需要将其分为训练集合与测试集,比例一般7:3开都可以。训练集用来训练模型,这里就是构建决策树;测试集用来做测试,根据训练的模型来作预测,进而评价模型的好坏。如果发现模型不很好,就需要适当修剪决策树。
决策树的分支准则可以决定树的大小,包括树的宽度与深度。这里介绍几种常用的分支准则:信息增益、信息增益比、Gini系数。在决策树的分支过程中,分支属性可以重复出现,也就是说一个属性可以在不同层使用。
任意一条数据有多个不同的属性,当然还有一个目标变量,我们需要根据这些属性提取分类规则,来对目标变量进行分类。这里只拿其中一个属性说明,实际中有几个属性就需要做相同工作几次。对于任意属性A,它可能有多个属性值比如颜色这个属性,就有比如红色、蓝色等属性值。我们可以抽象的描述任一属性与目标变量类别关系表如下:
这里属性A有m个属性值,整个数据共有n个类别,N为所有数据记录数,Xij表示属性值为Ai、类别为Cj的样本数,X.j表示第Cj类的样本数,同理Xi.表示属性值为Ai的样本总数,第j类出现的概率为Pj = X.j/N,做了这样的约定后,我们就可以进行后面的工作了。
如果数据带来的各种信息概率一致,根据信息熵的公式与数学知识,我们知道这时的获得的信息量最大。信息增益最大对应的属性就是需要选择的该节点属性。
样本集合C的信息熵为:
对于任一属性A有,有m个属性值,则用属性A对样本进行划分获得的信息熵为:
这里|Ai|取模表示在属性A上取值为Ai的样本数,同理|A|表示样本总数,这个比值再乘以属性值为Ai的信息熵,相当于用info(C)这个信息熵定义做递归。info(Ai)就是把info(C)里面的参数C换成Ai,Ai这个属性值也会有多个类别,分别求出每个类别的比例,这里求比例时总体就不是N了,而是X1.,进而比例乘以比例的对数求内积即可。
最终的信息增益为:
信息增益会倾向找到具有较多深综指的分支变量,信息增益比会考虑属性本身所携带的信息,比如属性值数量是否均匀。
信息增益率公式给出如下:
分支变量的属性水平越多,表示使用该变量越容易获得较大的熵,同时亦代表该分支属性分支特性不显著,因此会倾向选择具有较小熵值的属性为分支变量。而信息增益比的衡量准则倾向于选择具有较小熵值的属性,而较不会考虑具有较高信息增益值的属性,特别是当熵值趋近于0时;为了避免,故先计算出所有候选属性所带来的平均信息增益值,并仅从具有高于平均信息增益值的候选属性中,找出具有最小熵值的属性作为分支变量。
Gini系数是衡量数据集合对于所有类别的不纯度,不纯度越小的属性越应该作为分支属性。定义如下:
Gini(C)反映从数据C中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(C)越小,则数据集C的纯度越高,每次应选基尼指数最高的那个属性作为分支变量。属性A的基尼指数定义为:
与上面一样,这里Gini(Aj)还是递归Gini(C)公式,把参数C换成Ai,即Aj这个属性值对于所有类别的不纯度。
假设有如下数据,我们分别就其计算相应信息增益、信息增益比、Gini系数,展示决策树构建过程的详细计算过程。
这里有10条数据,目标分类变量是表现,我们根据几种分支准则做相应手动计算说明。
目标有两种分类:优等和普通,一共是10条数据。
资历有3个属性值:
5年以下(5条)
|--- 优等(3) 3/5
|---普通(2) 2/5
5年至10年(3条)
|---优等(1) 1/3
|---普通(2) 2/3
10年以上(2条)
|---优等(1) 1/2
|---普通(1) 1/2
教育程度有2个属性值
有无经验有2个属性值
【信息增益】
这里只展示计算在资历(A)这个属性的信息增益
属性A的信息增益为:
同理,可以计算得到教育程度与经验这两个属性的信息增益为
Gain(教育程度,C) = 0.396
Gain(经验,C) = 0.125
显然,教育程度的信息增益最大,即教育程度作为分支属性能得到较多信息,因此以教育 程度作为分支变量。
【信息增益比】
还是只展示资历这个属性的信息增益比
资历(A)这个属性信息增益比为6
同理,可以计算得到教育程度与经验这两个属性的信息增益为
Gain_ratio(教育程度,C) = 0.396/0.881 = 0.449
Gain_ratio(经验,C) = 0.125/0.971 = 0.129
由教育程度的信息增益比(0.449)最大可知,以教育程度作为分支属性能得到较多信息。
【Gini系数】
还是只展示资历这个属性的Gini系数
计算结果:
这里,计算Gini(Ai)时还是把参数C换成Ai就行了,方法一样,完成递归。
同理,可以计算得到教育程度与经验这两个属性的Gini系数为
Gini(教育程度,C)=0.396/0.881 = 0.286
Gini(经验,C)=0.125/0.971 = 0.417
显然,“教育程度”这个属性Gini系数越小,则根据数据集的纯度越高,每次应选基尼指数最高的那个属性作为分支变量知:选择“教育程度”作为分支变量。
可以看到,不管是信息增益还是信息增益指数,还是基尼指数,得到的都是,以教育程度作为第一个分支条件。
我们以信息增益为例再做一次计算,
可以得到10条数据的笫一次分支结果:
笫一次分支
第一次分支结果
第二次分支
由于父亲节点是教育程度(共有7条数据),那么子节点就不考虑教育程度这个属性,因为已经分过了,它每个分支在教育程度上属性值是一个,熵就为0。
研究所这个分支父亲节点信息熵为:
-2/7*log2(2/7)-5/7*log2(5/7) = 0.8631
(1)、对资历的信息增益计算如下:
职员 资历 教育程度 有无经验 表现
1 5年以下 研究所 是 优等
3 5年以下 研究所 是 优等
5 5年以下 研究所 否 优等
10 5年以下 研究所 是 普通
信息熵:info(5年以下)
-3/4*log2(3/4)-1/4*log2(1/4) = 0.8113
职员 资历 教育程度 有无经验 表现
8 5年至10年 研究所 是 优等
信息熵:info(5年至10年) = 0
职员 资历 教育程度 有无经验 表现
2 10年以上 研究所 否 普通
6 10年以上 研究所 是 优等
信息熵:info(10年以上) = -2*1/2*log2(1/2) = 1
最终在资历这个属性上信息增益为:
0.8631-4/7x0.8113-2/7x2 = 0.1138
(2)、对有无经验的信息增益计算如下:
职员 资历 教育程度 有无经验 表现
1 5年以下 研究所 是 优等
3 5年以下 研究所 是 优等
6 10年以上 研究所 是 优等
8 5年至10年 研究所 是 优等
10 5年以下 研究所 是 普通
信息熵:info(有经验)=
-4/5*log2(4/5)-1/5*log2(1/5) = 0.7219
职员 资历 教育程度 有无经验 表现
2 10年以上 研究所 否 普通
5 5年以下 研究所 否 优等
信息熵:info(无经验) = 2*(-1/2*log2(1/2)) = 1
最终在资历这个属性上信息增益为:
0.8631-5/7x0.7219-2/7x1 = 0.0617<0.1138
根据选择信息熵大的作为分支节点,那么就选择资历作为下一个分支节点。
对于大专这个分支,已经不用分支了,已经分类唯一,就是叶节点。
职员 资历 教育程度 有无经验 表现
4 5年以下 大专 是 普通
7 5年至10年 大专 否 普通
9 5年至10年 大专 否 普通
第二次分支结果
后面的分支就是前面的一个递归过程了,注意每次的总体应该是每一个属性值对应的样本数。