参考文章:

https://www.cnblogs.com/qcloud1001/p/6735352.html

http://blog.csdn.net/lixuemei504/article/details/7278748
http://blog.csdn.net/u013164528/article/details/44359677

信息增益原理介绍

介绍信息增益之前,首先需要介绍一下熵的概念,这是一个物理学概念,表示“一个系统的混乱程度”。系统的不确定性越高,熵就越大。假设集合中的变量X={x1,x2…xn},它对应在集合的概率分别是P={p1,p2…pn}。那么这个集合的熵表示为:

举一个的例子:对游戏活跃用户进行分层,分为高活跃、中活跃、低活跃,游戏A按照这个方式划分,用户比例分别为20%,30%,50%。游戏B按照这种方式划分,用户比例分别为5%,5%,90%。那么游戏A对于这种划分方式的熵为:

同理游戏B对于这种划分方式的熵为:

游戏A的熵比游戏B的熵大,所以游戏A的不确定性比游戏B高。用简单通俗的话来讲,游戏B要不就在上升期,要不就在衰退期,它的未来已经很确定了,所以熵低。而游戏A的未来有更多的不确定性,它的熵更高。

介绍完熵的概念,我们继续看信息增益。为了便于理解,我们还是以一个实际的例子来说明信息增益的概念。假设有下表样本

!

第一列为QQ,第二列为性别,第三列为活跃度,最后一列用户是否流失。我们要解决一个问题:性别和活跃度两个特征,哪个对用户流失影响更大?我们通过计算信息熵可以解决这个问题。

按照分组统计,我们可以得到如下信息:

其中Positive为正样本(已流失),Negative为负样本(未流失),下面的数值为不同划分下对应的人数。那么可得到三个熵:

整体熵:

性别熵:

性别信息增益:

同理计算活跃度熵:

活跃度信息增益:

活跃度的信息增益比性别的信息增益大,也就是说,活跃度对用户流失的影响比性别大。在做特征选择或者数据分析的时候,我们应该重点考察活跃度这个指标。

使用Hive SQL实现信息熵的计算

从表2中我们不难发现,在计算信息熵和信息增益之前,需要对各维度做汇总计数,计算各公式中出现的分母。Hive SQL中,cube能帮助我们很快的做汇总计算,话不多说直接上代码:


SELECT
t1.feature_name,
SUM((ea_all/es)*EA) as gain,
SUM(NVL(-(ea_all/ES)*log2(ea_all/es),0)) as info,--计算信息增益率的分母 SUM((ea_all/es)*EA)/SUM(NVL(-(ea_all/es)*log2(ea_all/es),0)) as gain_rate--信息增益率计算 FROM ( SELECT feature_name, feature_value, ea_all, --Key Step2 对于整体熵,要记得更换符号,NVL的出现是防止计算log2(0)得NULL case when feature_value='-100' then -(NVL((ea_positive/ea_all)*log2(ea_positive/ea_all),0)+NVL((ea_negative/ea_all)*log2(ea_negative/ea_all),0)) else (NVL((ea_positive/ea_all)*log2(ea_positive/ea_all),0)+NVL((ea_negative/ea_all)*log2(ea_negative/ea_all),0)) end as EA FROM ( SELECT feature_name, feature_value, SUM(case when is_lost=-100 then user_cnt else 0 end) as ea_all, SUM(case when is_lost=1 then user_cnt else 0 end) as ea_positive, SUM(case when is_lost=0 then user_cnt else 0 end) as ea_negative FROM ( SELECT feature_name, --Key Step1 对feature值和label值做汇总统计,1、用于熵计算的分母,2、计算整体熵情况 case when grouping(feature_value)=1 then '-100' else feature_value end as feature_value, case when grouping(is_lost)=1 then -100 else is_lost end as is_lost, COUNT(1) as user_cnt FROM ( SELECT feature_name,feature_value,is_lost FROM gain_caculate )GROUP BY feature_name,cube(feature_value,is_lost) )GROUP BY feature_name,feature_value ) )t1 join ( --Key Step3信息增益计算时,需要给出样本总量作为分母 SELECT feature_name,COUNT(1) as es FROM gain_caculate GROUP BY feature_name )t2 on t1.feature_name=t2.feature_name GROUP BY t1.feature_name 

数据表结构如下:

关键步骤说明:

KeyStep1:各特征的熵计算

KeyStep2:各feature下的信息增熵

信息增益计算结果:

结束语:

以上为信息熵计算过程的SQL版本,其关键点在于使用cube实现了feature和label所需要的汇总计算。需要的同学只需要按照规定的表结构填入数据,修改SQL代码即可计算信息增益。文中如有不足的地方,还请各位指正。

参考文档

[1] 算法杂货铺——分类算法之决策树(Decision tree)

http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html

[2] c4.5为什么使用信息增益比来选择特征?

https://www.zhihu.com/question/22928442

【结合实例】信息增益的计算相关推荐

  1. SQL2005使用游标的实例(SBO中计算到期应收账款)

    SQL2005使用游标的实例(SBO中计算到期应收账款) 我的SQL语言的查询做得并不好.但我可以用游标来实现之.实现之后才发现,无论多么复杂的查询,利用游标也都会更容易理解.虽然使用游标可能会牺牲一 ...

  2. 利用python计算圆球的体积_Python 实例:概率计算

    原标题:Python 实例:概率计算 将理想状态绝对无误差的10个同样的小球从1-10标号,然后随机从中选出1个小球.如果选取的次数足够多,就可以计算各个小球被选取出来的概率. 1.Project分析 ...

  3. C语言经典实例005:计算正方形的周长

    实例005:计算正方形的周长 实例说明: -已知正方形的边长为4,根据已知条件计算出正方形的周长并输出. 实现过程: #include <stdio.h>main() {int a, b; ...

  4. *(Virtual.Lab Acoustics声学仿真计算高级应用实例声学仿真计算从入门到精通.光盘下载链接)**

    (Virtual.Lab Acoustics声学仿真计算高级应用实例&声学仿真计算从入门到精通.光盘下载链接) http://pan.baidu.com/s/1c05tpVa 感谢这位大神分享 ...

  5. [Dask使用实例]Dask简单计算实例(map, submit)

    Dask简单计算实例 from dask.distributed import Client if __name__ == '__main__':client = Client()a = client ...

  6. 用户、配额管理 、 云主机类型管理 、 镜像管理 、 网络管理 、 安全和实例管理 、 计算节点扩容案例

    Top NSD CLOUD DAY03 案例1:管理项目 案例2:新建云主机类型 案例3:上传镜像 案例4:创建网络 案例5:管理浮动IP地址 案例6:创建安全组及规则 案例7:创建云主机 案例8:安 ...

  7. vasp算表面吸附流程_VASP实例分析表面吸附计算

    本文主要为了记录在学习Vasp计算过程中如何设置INCAR中的一些参数,并不着重讲解其含义,详见可自行到vasp官网查阅. 其次关于建模部分也不做细致讨论,一般结构可从Materials Studio ...

  8. python数学计算例子_Python OpenCV实例:直方图计算(数学公式简单实现)

    #coding:utf-8 ''' 直方图 ''' import cv2 import numpy as np import matplotlib.pyplot as plt ''' 计算RGB图像每 ...

  9. 实例004:计算正方形的周长

    已知正方形的边长4,根据已知条件计算出正方形的周长并输出.

最新文章

  1. Current Biology | 以退为进——白逢彦组揭示酿酒酵母通过基因网络的逆向进化适应环境的新机制...
  2. Cisco 3640策略路由配置
  3. python自动化办公 书籍-python自动化办公知识点整理汇总
  4. 回学校之前在家的清理计划
  5. em算法怎么对应原有分类_[PRML]序列数据 HMM维特比算法及扩展
  6. windows下连接smb服务器
  7. php如何跟踪调试,PHP使用debug_backtrace方法跟踪调试代码调用详解
  8. leetcode 《简单》 设计问题 Python实现
  9. python的sift算法_opencv python SIFT(尺度不变特征变换)
  10. postman下载文件
  11. git push 报错 remote: error: hook declined to update
  12. Privates下载
  13. 实现安全登录的两种方法
  14. 《父与子的编程之旅——Python》(一)序章-第一章-第二章
  15. BZOJ3161 : 孤舟蓑笠翁
  16. 【R代码 (葡萄酒)及其可视化分析 #随机森林-支持向量机】
  17. 在win10上通过usb连接树莓派
  18. MariaDB/MySQL中的变量
  19. 【淘宝】从开店到运营 - 开店前期知识(天猫、淘宝店铺介绍)
  20. Ubuntu18编译Kalibr报错总结

热门文章

  1. 推荐搜索炼丹笔记:双塔模型在Airbnb搜索排名中的应用
  2. iPhone X适配小结
  3. linux下elasticsearch 安装、配置及示例
  4. 量子计算101:浅谈其需求、前景和现实
  5. Windows 蠕虫首次现身 Mac 电脑:伪装成 Adobe Flash 软件
  6. 记录一次postfix无法收取邮件和mysql异常不能启动
  7. 转 :Vim文件编码识别与乱码处理
  8. looper message handler之间的关系
  9. Office远程代码执行漏洞补丁(905413)
  10. django-vue-admin脚手架快速开发CRUD教程