信息增益(Info Gain), 信息增益率(Info Gain Ratio)和 基尼指数(Gini Index)都是在做决策树时试用的分支选择策略, 下面我们试用numpy来实现这几个指标, 以便加深对这些指标的理解。
下面我们来引入用到的库:
1 | import numpy as np |
案例和数据集
学习决策树常用的一个数据集就是”机器学习(周志华)》 西瓜数据集3.0”, 下面我把数据粘贴出来, 你们就不必下载了, 直接硬编码到python种使用:
1 | data_str = output = io.StringIO('''编号,色泽,根蒂,敲声,纹理,脐部,触感,密度,含糖率,好瓜 |
色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好瓜 | |
---|---|---|---|---|---|---|---|---|---|
编号 | |||||||||
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.460 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.774 | 0.376 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 0.403 | 0.237 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 0.481 | 0.149 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 0.437 | 0.211 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 0.666 | 0.091 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 0.243 | 0.267 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 0.245 | 0.057 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 0.343 | 0.099 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 0.639 | 0.161 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 0.657 | 0.198 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 0.360 | 0.370 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 0.593 | 0.042 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 0.719 | 0.103 | 否 |
该数据集通常是使用前几个西瓜属性预测最后一个指标”好瓜”.
信息熵怎么算
要计算信息增益的话, 首先要知道怎么算信息熵, 它的公式是:
$$ H(X) = \sum_{i \in X} p_i log p_i $$
1 | def entropy(data, att_name): |
好瓜的信息熵:
0.8760918930634294
使用scipy内置的stats.entropy
验证我们的函数:
1 | def entropy_scipy(data, att_name): |
条件信息熵怎么算
已知条件Y, 求X的概率就是P(X|Y), 知道的信息越多,随机事件的不确定性就越小。
书中定义:在Y条件X的条件熵:(二元模型)
引自维基百科:
因为我们已经有了交叉熵的公式, 所以我们其实可以直接算出$H(Y|X=x)$
1 | def conditional_entropy(data, xname, yname): |
触感条件下, 好瓜的信息熵:
0.8462465738213797
信息增益
理论上我们可以证明$H(Y)>=H(Y|X)$
1 | def gain(data, xname, yname): |
触感的引入导致的信息增益:
0.029845319242049695
属性的信息增益与属性的类别数的关系
属性的类别越多, 根据该属性就可以把数据切分的更细, 这样往往导致信息的混乱程度降低, 所以类别多的属性的信息增益较大, 我们可以用代码实验一下:
1 | data['testCol'] = 0 |
0.00011925580490779186
0.0018253756129741339
0.605797499372304
信息增益率
信息增益率的提出是为了规避信息增益种属性类别数目造成的影响, 它的计算公式是:
$$ GainRatio(Y, X) = {Gain(Y, X) \over SplitInfo(X)} $$
其中:
$$ SplitInfo(X)= \sum_{i \in X} p_i log p_i = H(X) $$
1 | def gain_ratio(data, xname, yname): |
信息增益率:
0.04926616447405919
注意
本文由jupyter notebook转换而来, 您可以在这里下载notebook
统计咨询请加QQ 2726725926, 微信 mllncn, SPSS统计咨询是收费的
微博上@mlln-cn可以向我免费题问
请记住我的网址: mlln.cn 或者 jupyter.cn