介紹資訊增益之前,首先需要介紹一下熵的概念,這是乙個物理學概念,表示「乙個系統的混亂程度」。系統的不確定性越高,熵就越大。假設集合中的變數x=
,它對應在集合的概率分別是p=
。那麼這個集合的熵表示為:
舉乙個的例子:對遊戲活躍使用者進行分層,分為高活躍、中活躍、低活躍,遊戲a按照這個方式劃分,使用者比例分別為20%,30%,50%。遊戲b按照這種方式劃分,使用者比例分別為5%,5%,90%。那麼遊戲a對於這種劃分方式的熵為:
同理遊戲b對於這種劃分方式的熵為:
遊戲a的熵比遊戲b的熵大,所以遊戲a的不確定性比遊戲b高。用簡單通俗的話來講,遊戲b要不就在上公升期,要不就在衰退期,它的未來已經很確定了,所以熵低。而遊戲a的未來有更多的不確定性,它的熵更高。
介紹完熵的概念,我們繼續看資訊增益。為了便於理解,我們還是以乙個實際的例子來說明資訊增益的概念。假設有下表樣本
!第一列為qq,第二列為性別,第三列為活躍度,最後一列使用者是否流失。我們要解決乙個問題:性別和活躍度兩個特徵,哪個對使用者流失影響更大?我們通過計算資訊熵可以解決這個問題。
按照分組統計,我們可以得到如下資訊:
其中positive為正樣本(已流失),negative為負樣本(未流失),下面的數值為不同劃分下對應的人數。那麼可得到三個熵:
整體熵:
性別熵:
性別資訊增益:
同理計算活躍度熵:
活躍度資訊增益:
活躍度的資訊增益比性別的資訊增益大,也就是說,活躍度對使用者流失的影響比性別大。在做特徵選擇或者資料分析的時候,我們應該重點考察活躍度這個指標。
從表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**即可計算資訊增益。文中如有不足的地方,還請各位指正。
查詢 新增 修改 一條sql 搞定
1 不存在,則新增 不會自動修改 insert into king wz yname,title select 42 北京 from dual where not exists select id from king wz where yname 42 語句解析 select not exists ...
mysql 插入更新一條sql 搞定
插入資料時,我們經常會遇到這樣的情況 1 首先判斷資料是否存在 2 如果不存在,則插入 3 如果存在,則更新。在sql server中可以這樣處理 if not exists select 1 from t where id 1 insert into t id,update time values...
一條SQL語句搞定SQLServer分頁的幾種方式
適用於sql2000 2005 select top頁大小 from table1 where id not in select top頁大小 頁數 1 id from table1 order byid order byid 適用2000 2005 select top頁大小 from table...