熵概念
一条信息的不确定性和它的不确定性有直接关系。比如一个非常不确定的信息,为了弄懂它,我们需要了解大量关于它的信息,信息量的度量就等于信息的不确定性大小(熵的大小)。
例如:班级里谁会当选班长?
用比特还衡量信息的多少:
-(p1 * log_2(p1) + p2 * log_2(p2) + …+ pn * log_2(pn))
用上方的公式来衡量熵的值。
pn指的是第n个人当选上班长的可能性
决策树归纳算法(ID3)
大家可以看见文头的一张图,它所描述的是使用决策树算法解决的一个实际问题,那么为什么它的根结点会是那个信息而不是其他的信息呢?如果换成其他的信息会效果怎么样呢?
概念:
信息获取量(Information Gain):Gain(A) = Info(D) - info_A(D)
假设有一个数据集合D, 它依据某种特征已经被分类,也可以在分好类的基础上依据其他的属性分类。
这个公式的含义是:根据A属性分类的信息获取量的值,等于,原始的信息获取量(不添加额外的属性),减去,在原始状态下加上A属性分类之后的状态的信息获取量。
说着有点绕,看例子:
数一数发现有5个“no”,9个"yes"那么最终的结果是no的概率是5/14, 结果是yes的概率是9/14, 这样可以计算出原始信息量:
在是否购买电脑的基础上,再添加一个信息age ,根据信息age再次将数据集合分类。其实这么说也不准确,实际上我们常常把一开始分好类的那个依据作为基本条件,后加的分类依据作为外加条件,我们首先将数据集合依据外加条件分类,比如这里先将数据集合分为三大类:youth, middle_aged, senior三大类,分别占的比例是:5/14, 4/14, 5/14.然后将这分好的三类分别再依据基本条件分类,作为理科生或者工科生,用例子讲解再好不过了:
然后二者的差值:
就是依据youth 分类, 从数据集中所获取的信息量。
同理依据其他的属性计算出来的获取的信息量为:
比较发现,依据age分类所获取的信息量最大,所以根结点就是age.
分类之后长啥样呢?
发现分为了三类,其中middle_aged类别的最终结果相同,都是yes, 而其他两个分支仍然有两种情况,这样一说聪明的你一定才出来了怎么处理吧。
没错就是再次依据前面的游戏规则,对左右的分支再次分类,直到每一个的叶子结点所包含的数据的最终结果相同为止。还有一种情况是,属性都用完了,但是还没有达到分支完成的目的,这种情况呢,使用多数表决的方法来决定划分情况,也就是说,如果最后有一个或者几个叶结点含有3个yes, 1个no,那么就将这个叶结点归类为yes,而不继续新插入属性划分了。
用比较专业化的语言说就是酱:
相信大家看懂之后心里或多或少有点不服气,凭啥就依据你说的那种方式确定树的根结点嘞?首先这方法不是我想出来的哈,这是一位牛人所创造的一种取点方式,与大家一样,有不少大咖就是不服气,也创造了许多比较实用的选出根结点的度量方法,如下(举出部分例子):
有兴趣可以了解一下。
在实际过程中会出现这样的情况:由于训练的数据分的太细了,导致树的细枝末叶过多,在最终的测试集上效果并不好,也就是出现过拟合,这样的情况下所采取的方法~呼之欲出,修剪一些细枝末叶的东西。这剪树叶也有讲究,分为先剪枝和后剪枝。
- 先剪枝:
在细分分到一定的程度之后停止细分。 - 后剪枝:
等树全部生长好了,根据一定的规则将树叶剪掉一部分。
好了,说了这么多大家也会发现,决策树的优点是:
直观,便于理解,在小数据集的规模下有效。
有啥缺点呢?
处理连续变量不好,因为我们要将它分类,就需要划分阈值,这个阈值对之中的结果影响很大。
当类别较多的时候,错误增加的比较快。
可规模性一般,在小数据集的情况下效果比较好,数据集大的时候算法的复杂度增加很快。
好啦,本期的笔记到这里啦,下期的笔记我们用python代码搞定它!