关于信息增益和熵

1、信息增益
在学习决策树时接触到到了信息增益(Information Gain),由此了解到熵。不解顺序查之。
在划分数据集之前之后信息发生的变化成为信息增益。因此,在决策树的根节点,选用的判定划分的属性,在划分数据前后信息的变化越大,那该属性对数据集的划分作用越大,分类的效果越好,也就是信息增益越大。所以获得信息增益最高的特征就是选择的最好特征。
举个例子:
我们要建立的决策树的形式类似于“如果天气怎么样,去玩;否则,怎么着怎么着”的树形分叉。那么问题是用哪个属性(即变量,如天气、温度、湿度和风力)最适合充当这颗树的根节点,在它上面没有其他节点,其他的属性都是它的后续节点。借用信息论的概念,我们用一个统计量,“信息增益”(InformationGain)来衡量一个属性区分以上数据样本的能力。信息增益量越大,这个属性作为一棵树的根节点就能使这棵树更简洁,比如说一棵树可以这么读成,如果风力弱,就去玩;风力强,再按天气、温度等分情况讨论,此时用风力作为这棵树的根节点就很有价值。如果说,风力弱,再又天气晴朗,就去玩;如果风力强,再又怎么怎么分情况讨论,这棵树相比就不够简洁了。
所以,信息增益越大,信息对数据的区分能力就越强。

信息增益的公式:
这里写图片描述
其中,|S|为原集合的数量,|Sa|为分类后子集中元素的个数。Entropy(S)为原集合的熵
所以,G(S,A)是在给定属性A的值知道后,导致期望熵的减少,也就是说,若知道A的值,可以获得最大的信息增益,则属性A对数据集分类数量的降低有很大的积极作用。知道A之后,得到的信息是相对其他属性最多的。

2、熵
计算信息增益需要用到熵,集合信息的度量方式成为香农熵(熵),熵定义为信息的期望值。
符号xi的信息定义:l(xi)=-log2P(xi),其中P(xi)是选择该分类的概率。
熵的计算公式:
这里写图片描述

吴军在《数学之美系列四–怎样度量信息?》中认为信息熵的大小指的的是了解一件事情所需要付出的信息量是多少,这件事的不确定性越大,要搞清它所需要的信息量也就越大,也就是它的信息熵越大。

Matrix67在《互联网时代的社会语言学:基于SNS的文本数据挖掘》认为信息熵衡量的是在你知道一个事件的结果后平均会给你带来多大的信息量。如果一颗骰子的六个面都是 1 ,投掷它不会给你带来任何新信息,因为你知道它的结果肯定是1,它的信息熵为 - log(1) = 0 。(log是以2为底,lg是以10为底)

两种解释在不同的应用上可以有不同的理解。例如在《文本分类入门(十一)特征选择方法之信息增益》可以看出在文本分类中对信息熵的理解是第二种。不过,两种理解其实都指出了信息熵的另一个作用,就是信息熵可以衡量事物的不确定性,这个事物不确定性越大,信息熵也越大,也可以说事件的无序程度越高。

Q:可不可以理解成一件事情越复杂,信息熵越大。那么从公式上怎么看出,信息熵代表一件事的复杂程度???

A:一个事件的不确定性越大,那么一个事件可能的发生的情况越多,公式中的n越大,结果越大。
这里写图片描述

PS:关于比特
信息论中,确定了要编码集合S中任意成员的分类所需要的最少二进制位数。
为何信息熵会有这样的作用?为何它的公式这样表示?所以还需要理解信息量这一的概念。香农用“比特”这个概念来度量信息量。也即信息量的多少就是比特的多少。
32只球队共有32种夺冠的可能性,用多少信息量才能包括这32个结果?按照计算机的二进制(只有1和0)表示法,我们知道2^5=32 ,也就是需要5符号的组合结果就可以完全表示这32个变化,而这里的符号通常称之为比特。既然是这样,那么当一件事的结果越不确定时,也就是变化情况越多时,那么你若想涵盖所有结果,所需要的比特就要越多,也就是,你要付出的信息量越大,也即信息熵越大。当然,每个变化出现的概率不同,因而在香农的公式中才会用概率,所以信息熵算的是了解这件事所付出的平均信息量。比如这个例子里假设32只球队夺冠可能性相同,即Pi=1/32 ,那么按照香农公式计算:
entropy(P1,P2,…,P32)=-(1/32)log(1/32)-(1/32)log(1/32)……-(1/32)log(1/32)
=5/32+5/32…+5/32
=(5*32)/32
=5

### 信息信息增益条件的概念 #### 信息 (Entropy) 信息用于衡量系统的不确定性程度,在机器学习领域特别是决策树构建过程中起着重要作用。对于一个离散随机变量 \(X\) ,其概率分布为 \(\{p_1, p_2,...,p_n\}\),则该随机变量的信息定义如下: \[ H(X) = -\sum_{i=1}^{n}{p_i \log_b(p_i)} \] 其中,\(b\) 是对数的底数,通常取值为2或者自然常数e;当某个事件的概率为0时,默认认为对应的项等于0。 在实际应用中,比如分类问题里,如果某类别的样本占比很大,则说明这个类别很容易被预测到,此时系统整体混乱度较低,相应的信息也较小;反之亦然[^1]。 ```python import math from collections import Counter def calc_entropy(data_set): num_entries = len(data_set) label_counts = {} for feat_vec in data_set: current_label = feat_vec[-1] if current_label not in label_counts.keys(): label_counts[current_label] = 0 label_counts[current_label] += 1 entropy = 0.0 for key in label_counts: prob = float(label_counts[key]) / num_entries entropy -= prob * math.log(prob, 2) return entropy ``` #### 条件 (Conditional Entropy) 设有一个数据集 \(D\) 特征 \(A\) 。经验条件是指给定条件下子数据集中目标属性的平均不确定性。具体来说就是先按照特征的不同取值划分成若干个子集合,再分别求这些子集合中的信息并加权求得到最终的结果。 \[ H(Y|X)=\sum _{{x}}P(x)\cdot H(Y|x), \] 这里 \(H(Y|x)\) 表示已知输入 \(x\) 的情况下输出 \(Y\) 的剩余混淆度量,而 \(P(x)\) 则代表各个可能情况发生的频率比例。 ```python def split_data_set(data_set, axis, value): ret_data_set = [] for feat_vec in data_set: if feat_vec[axis] == value: reduced_feat_vec = feat_vec[:axis] reduced_feat_vec.extend(feat_vec[axis+1:]) ret_data_set.append(reduced_feat_vec) return ret_data_set def calc_conditional_entropy(data_set, i): feature_list = [example[i] for example in data_set] unique_vals = set(feature_list) new_entropy = 0.0 for value in unique_vals: sub_data_set = split_data_set(data_set, i, value) prob = len(sub_data_set)/float(len(data_set)) new_entropy += prob * calc_entropy(sub_data_set) return new_entropy ``` #### 信息增益 (Information Gain) 信息增益用来评估某一特定特征的重要性,它反映了通过引入此特征所能减少多少关于结果的知识上的模糊性。简单来讲就是在考虑了新加入的因素之后整个体系变得更加有序的程度。计算方式是从原始的数据集总减去基于所选特征分割后的各部分得出差值即为信息增益。 \[ IG(D,A)=H(D)-H(D|A). \] 这里的 \(IG(D,A)\) 就是对于数据集 \(D\) 而言由特征 \(A\) 所带来的信息增益大小[^2]。 ```python def calc_info_gain(data_set, base_entropy, i): conditional_ent = calc_conditional_entropy(data_set, i) gain = base_entropy - conditional_ent return gain ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值