码迷,mamicode.com
首页 > 其他好文 > 详细

[梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树

时间:2019-11-09 12:07:05      阅读:97      评论:0      收藏:0      [点我收藏+]

标签:解释   统计信息   取值   相同   传统   贪心   算法   details   期望   

记录对概念的理解,用梁山好汉做例子来检验是否理解正确。

1. 事物的信息和信息熵

a. 事物的信息(信息量越大确定性越大):

信息会改变你对事物的未知度和好奇心。信息量越大,你对事物越了解,进而你对事物的好奇心也会降低,因为你对事物的确定性越高。如果你确定一件事件的发生概率是100%,你认为这件事情的信息量为0——可不是吗,既然都确定了,就没有信息量了;相反,如果你不确定这件事,你需要通过各种方式去了解,就说明这件事是有意义的,是有信息量的。

b. 信息熵:
为了抽象上述模型,聪明的香农总结出了信息熵这个概念。信息熵用以表示一个事物的不确定程度,如果该事物的非确定性越高,你的好奇心越重,该事物的信息熵就越高。一场势均力敌的比赛结果的不确定性高于一场已经被看到结果的比赛,多么符合直观理解啊!

也就是说,信息量的多少与事件发生概率的大小成反比。比如太阳从东方升起这个事件,概率很大,信息量就会很少。相反,太阳从西方升起,概率很小,信息量就会很多(世界要随之发生巨大变化)。所以信息熵常被用来作为一个系统的信息含量的量化指标,从而可以进一步用来作为系统方程优化的目标或者参数选择的判据。或者说信息熵用来度量一个事件可能具有多个状态下的信息量,也可以认为是信息量关于事件概率分布的期望值:H(x) = -Σp*log(p)。

其中事件x共有n个状态,i表示第i个状态,底数b通常设为2,也可设为10或e。H(x)即用以消除这个事件的不确定性所需要的统计信息量,就是信息熵。还要说明的是,当这个事情一定发生的时候,发生的概率就为1,那么它的信息量为0,信息熵就为0。

 

2. 为什么信息熵要定义成-Σp*log(p)?

有以下几种解释:

a.
一条信息的可能性数量随着位数的增加是指数的。如果用二进制bit表示,1bit有2个状态,2bit有4个状态,Nbit有2^N个可能状态。可能性的数量随指数上升,指数那么变回线性的形式就是log。至于对数的底是e还是2无所谓,只是一个比例因子而已。一条信息是log,N条信息就是Nlog咯。最后,熵表示混乱度,考虑到符合物理意义理解的话,加上负号。

b.
信息熵代表编码长度,编码越长,信息量越大,信息熵也就越大。所以有这样一个等式:
p=1/a^n
p表示取到某个值的概率,a表示存储单元能够存储的数量,如果是bit那就是2,n表示编码长度,可以用信息熵来理解,所以总的可能性应该是a^n,那取到单个值的概率就是p=1/a^n。反推信息熵的公式就是:n=-loga(p)

c.
第一信息量应该依赖于概率分布,所以说熵的定义应该是概率的单调函数。
第二假设两个随机变量是相互独立的,那么分别观测两个变量得到的信息量应该和同时观测两个变量的信息量是相同的。即:h(x+y)=h(x)+h(y)。
第三信息量应该要大于0
第四信息量应当连续依赖于概率变化。
可以证明满足以上条件的函数形式是唯一的-logx,当然还可以乘上任意常数。

d.
由上面太阳东升西落,西升东落很容易看出,信息量是随着发生的概率的增大而减少的,而且不能为负。另外,如果我们有两个不相关事件A和B,那么可以得知这两个事情同时发生的信息等于各自发生的信息之和。即h(A,B) = h(A) + h(B)。而且,根据贝叶斯定理,p(A,B) = p(A) * p(B)。根据上面说到的说熵的定义应该是概率的单调函数。我们很容易看出结论熵的定义 h 应该是概率 p(x) 的 log 函数,因此一个随机变量的熵可以使用以下定义:h(x)=-log_2p(x)。此处的负号,仅仅是为了保证熵为正数或者为零,而log函数的基数2可以使任意数,只不过根据普遍传统,使用2作为对数的底。我们用熵来评价整个随机变量x平均的信息量,而平均最好的量度就是随机变量的期望。

e.
如果世界杯有 32 支球队参赛,有些球队实力很强,拿到冠军的可能性更大,而有些队伍拿冠军的概率就很小。
准确的信息量应该是: H = -(p1 * logp1 + p2 * logp2 + ... + p32 * logp32),其中 p1, ..., p32 分别是这 32 支球队夺冠的概率。当每支球队夺冠概率相等都是 1/32 的时候,H = -(32 * 1/32 * log1/32) = 5,根据最大熵原理,每个事件概率相同时,熵最大,这件事越不确定。
这里我们只是说了如何计算,那么为什么求总信息量就是所有 -p*logp 再求和呢?维基百科一句话就让我明白了:-logp 就是一种可能性的信息量啊,一个事件总的信息量就是每一种可能的情况的信息量乘以它们发生的概率,其实就是信息量的数学期望。


3. 决策树ID3算法对应的熵

a. 熵(entropy),它刻画了任意样例集的纯度(purity)。熵量化了存在于样本集合中的均匀性,越纯,熵越低。

假设一个集合S。如果S的所有成员属于同一类,则Entropy(S)=0;如果S的正反样例数量相等,则Entropy(S)=1;如果S的正反样例数量不等,则Entropy(S)介于0,1之间;

即:当所有成员属于同一组时,该集合的熵为0。这个0值表示在这个集合中没有杂质,这个示例中所有的成员均为真。在第二个例子中,有一半的成员是正值,一半的成员是负值,这种情况下熵的值最大,为1。在二元分类中,集合熵的范围是从0到1。

b. 信息增益的度量标准:熵(entropy)。一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低(或者说,样本按照某属性划分时造成熵减少的期望)。也就是,数据集变得有序了多少。

c. 决策树的灵魂:依靠某种指标进行树的分裂达到分类/回归的目的,总是希望纯度越高越好。

d. ID3算法的核心思想就是以信息增益度量属性选择,选择分裂后信息增益最大的属性进行分裂。
ID3算法将信息增益做贪心算法来划分算法,总是挑选是的信息增益最大的特征来划分数据,使得数据更加有序。即如果该属性能获得最大预期的熵减,那么这个属性的位置更接近根节点。
Gain(子树的信息增益) = 现在熵 - 如果按照某一个特征来分类得到子树熵 = 熵的变化值

4. 推论
信息增益(熵减)越大越好 ----> 子树的熵越小越好 -----> 树越不平均越好(越不平均表示纯度越高效果越好,越平均表示某值属于各种不同分类的可能性越大则熵最大) ----> 通过这个特性越能强烈区分开对象越好。

比如用染色体判断男女,分成两群,"女"那一群肯定都是女的,"男"那一群肯定都是男的。这个效果是最好。
用是否穿裙子来判断男女,则两群中肯定各有男女,这样判断标准就不好。

5. 如何计算熵?

def calc_shannon_ent(dataset):
  entropy = 0
  for 所有类别:
    p(本类概率,或者说本类数据在所有数据中的比例) = 本类别出现的个数 / 所有数据个数
    entroy -= p * math.log(p,2)

比如数据集是[1, "yes"], [1, "yes"]. 则所有数据个数是2,只有这一类数据"yes",所以p = 2/2 = 1。entroy = 1 * log(1,2) = 0。
比如数据集是[1, "yes"], [1, "yes"], [1, "no"]. 则所有数据个数是3,有两类数据"yes","no",p分别是2/3和1/3。entroy = - (2/3) * log((2/3), 2) - (1/3) * log((1/3), 2) = 0.918.
这个公式的奥秘在于,2/3是属性取值为yes的个数占总记录的比例,同样1/3是其取值为no的记录个数与总记录数之比。


6. 用梁山好汉来看如何选择属性

梁山好汉吃晚饭,是否吃煎饼卷大葱。
现在有如下头领:鲁智深,武松,公孙胜,宋江,吴用,朱仝,李应,燕顺,乐和, 阮小七

对应代码是
_data_set = [
[0, 1, "yes"], #宋江
[0, 1, "yes"], #吴用
[0, 1, "yes"], #朱仝
[0, 1, "yes"], #李应
[0, 1, "yes"], #燕顺
[0, 1, "yes"], #乐和
[0, 1, "yes"], #阮小七
[1, 1, "yes"], #武松
[1, 0, "no"], #鲁智深
[1, 0, "no"]] #公孙胜
_labels = ["Buddhist", "山东"]

Yes表示吃大葱,No表示不吃大葱。原有的熵就用吃不吃大葱的比例来计算。

Entropy(原有的熵) = Entropy(Yes) + Entropy(No) = 8/10 * log(8/10,2) + 2/10 * log(2/10, 2) = 0.8 * log(0.8,2) + 0.2 * log(0.2, 2) = 0.721928

a. 如果按照“是否是出家人”来区分,则
出家人:鲁智深,公孙胜 ---> 不吃大葱 / 武松 ---> 吃大葱
俗人:宋江,吴用,朱仝,李应,燕顺,乐和 ---> 吃大葱

我们发现: 出家人一个人吃大葱,两个人不吃大葱 / 俗人都吃大葱。看起来按照出家人来分比较靠谱。

这时候熵怎么计算?

俗人:7个人,7个yes。
出家人:3个人,其中1yes,2no
Entropy(按出家人分) = Entropy(俗人) + Entropy(出家人) = (7/10) * Entropy(7 yes) + (3/10) * Entropy(1 yes, 2 no)
Entropy(7 yes) = 7/7 * log(7/7,2) = 0
Entropy(1 yes, 2 no) = 1/3 * log(1/3, 2) + 2/3 * log(2/3, 2) = 0.918
Entropy(按出家人分) = 0.7 * 0 + 0.3 * 0.918 = 0.2754

Gain(按出家人分) = Entropy(原有的熵) - Entropy(按出家人分) = 0.721928 - 0.2754

b. 如果按照"籍贯"来区分
鲁智深(甘肃平凉),公孙胜(天津蓟县) ---> 不吃大葱
宋江,吴用,朱仝,李应,燕顺,乐和,武松 (宋朝时候全是山东人) ---> 吃大葱
这样区分更好更彻底。

所以属性按照籍贯判断更好更彻底。

这时候熵怎么算?

非山东:2个人,2个no。
山东:8个人,8yes
Entropy(按籍贯分) = Entropy(非山东) + Entropy(山东) = (2/10) * Entropy(2 no) + (8/10) * Entropy(8 yes)
Entropy(2 no) = 2/2 * log(2/2,2) = 0
Entropy(8 yes) = 8/8 * log(8/8, 2) = 0
Entropy(按籍贯分) = 0 + 0 = 0

Gain(按籍贯分) = Entropy(原有的熵) - Entropy(按籍贯分) = 0.721928 - 0

数据也证明了要按照籍贯分。

总的来说,搞明白分枝是如何产生的,就理解了ID3算法。该方法选择分枝(属性)的方式是通过计算每个属性的信息增益,选择信息增益最高的属性为新的划分。该算法认为属性的重要性的体现方式是通过对系统熵的影响,如果可以降低很多不确定性,那么它就是一个重要的属性。


参考
https://blog.csdn.net/gadwgdsk/article/details/79450950
https://blog.csdn.net/qq_36330643/article/details/77415451
https://blog.csdn.net/wendingzhulu/article/details/42045137
https://www.cnblogs.com/wkang/p/10068475.html
https://www.cnblogs.com/daguonice/p/11179662.html
https://www.jianshu.com/p/7ac73fe5b180
https://www.jianshu.com/p/4e2be2b562b0
https://www.zhihu.com/question/30828247/answer/61047733
http://tieba.baidu.com/p/5851144895
https://blog.csdn.net/taoqick/article/details/72852255

[梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树

标签:解释   统计信息   取值   相同   传统   贪心   算法   details   期望   

原文地址:https://www.cnblogs.com/rossiXYZ/p/11824359.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!