1. 决策
我理解的决策就是根据当前已有的条件,得出一个结果。
如以下这个简单的例子:
ID | Leg | Color | Bite | Type |
---|---|---|---|---|
1 | short | yellow | yes | cat |
2 | long | black | yes | cat |
3 | long | yellow | yes | cat |
4 | short | yellow | no | cat |
-1 | long | yellow | no | dog |
-2 | short | white | yes | dog |
-3 | long | white | yes | dog |
-4 | long | white | no | dog |
-5 | short | black | no | dog |
以上这个也叫做决策表。通过 腿长
,颜色
,是否咬人
来判断是 猫
还是 狗
。
2. 决策树
我们可以将以上的表格转换成一棵树:
每次决策的时候从根节点出发,根据属性值选择子树,直到叶子节点就是一个决策。
3. ID3算法
构建树的时候,把哪个属性放在根节点,哪个属性放在第二层节点,就值得我们思考了。可以预想到,根据不同的顺序,构建出来的决策树的构造可能是不一样的。如果树中的节点越少,那么平均每次决策所需要的判断次数也就越少,算法的效率就越高。
ID3算法就是为了构造出一棵较优的(注意,不一定最优)的树,使得每次决策的平均判断次数更少。
3.1 信息熵
在高中学过,熵 表示一个系统的无序程度。比如刚整理好的房间的熵值就比你住过两周不收拾以后的房间的熵值要小。
而 信息熵 是类似的,其定义为离散随机事件出现的概率,一个系统越是有序,信息熵就越低,反之一个系统越是混乱,它的信息熵就越高。
假设一个随机变量 的取值为 ,每一种取到的概率为 ,那么 的熵值为:
注意,虽然前面有个负号,但是熵值是正的。
以上面的决策为例,,其概率分别是 ,那么其熵值为:
3.2 条件熵
还是以上的例子,如果把所有的样本仅按照 Leg
进行分类的话,可以分成两类:
分别计算熵值,可得:
因此,划分后的熵值为:
因此信息增益为:
3.3 ID3 算法
ID3 算法就是找出信息增益最大的属性,然后将其当成根节点,然后对于由此划分得到的子数据,重复以上的步骤。
同样的方法计算 Color
属性的信息增益:
再算Bite
属性的信息增益:
很明显,Color
属性以绝对的优势胜出,当选根节点。
于是数据被 Color
分成了三部分,对每一部分数据 ,去除 Color
属性的影响,按以上的方法递归生成决策树,这里就不赘述了。
但是ID3算法的缺点是很明显的(虽然我自己不觉得明显,但是书上都这么说):
-
ID3算法不能处理连续的数据
这个很好理解,假设有一个属性是精确到小数点后三位的体重值,那么可能所有样本的值都不一样,则该属性的信息增益最大。ID3算法就会仅使用该属性,把每个样本都分到单独的一类中。即,反正体重都不一样,那根据体重来判断就完事了~
-
ID3算法倾向于选择取值较多的属性
信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大。
4. C4.5算法
为了克服 “ID3算法倾向于选择取值较多的属性” 的缺点,C.45算法使用了信息增益率来代替信息增益。其思想就是,增加一个惩罚,取值越多的属性惩罚越大,以此来平衡其选择。
如果使用C.45的话,上面的公式就变成:
复习一下, 就是将样本按照属性 Leg
划分以后的信息熵。
可以得到:
同样的方法计算 Color
属性的信息增益率:
再算Bite
属性的信息增益率:
可以看到,虽然还是 Color
属性的信息增益率最高,但是值已经被压缩了,而另外两个属性的值得到了小幅度的上升,各个属性之间的差异更小了。
5. CART 算法
上述两个算法生成的树中,一个节点有几个子节点取决于该属性的取值数量,而CART算法生成的则是二叉树。
Chart算法则使用了一个叫做 Gini系数 的东西,假设一个随机变量 的取值为 ,每一种取到的概率为 ,那么 的为:
如果根据属性 把数据 划分为 ,则:
则Gini系数增益为:
按照惯例,使用上面的例子计算一下:
首先算出整个数据集的 Gini 系数:
对于 Leg
属性:
对于 Color
属性,就比较麻烦了,因为有三个取值,但是CART生成的是二叉树,因此就会有三种情况。
- case 1:
- case 2:
- case 3:
对于 Bite
属性:
可以看出,当根节点为 Color
属性并且左边是 white
,右边是 yellow & black
时,Gini系数增益最大。