zoukankan      html  css  js  c++  java
  • 一条SQL搞定信息增益的计算

    信息增益原理介绍

    介绍信息增益之前,首先需要介绍一下熵的概念,这是一个物理学概念,表示“一个系统的混乱程度”。系统的不确定性越高,熵就越大。假设集合中的变量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代码即可计算信息增益。文中如有不足的地方,还请各位指正。

  • 相关阅读:
    编写一个程序的步骤
    vue实现瀑布流
    Vue 解决动态生成列表点击事件无效的问题
    筛选分类列表展示
    php实现类似慕课网,php中文网的分类功能
    在一个页面修改数据,并且ajax刷新数据列表的数据实现。
    记账小程序系统简单规划
    茶叶项目---产品的规格添加
    茶叶商城开发
    后端图片上传
  • 原文地址:https://www.cnblogs.com/tangshiguang/p/6770541.html
Copyright © 2011-2022 走看看