楼主: 698348
23029 1

[学习分享] Gini指数:Gini指数的意义和Gini指数的计算 [推广有奖]

副教授

38%

还不是VIP/贵宾

-

威望
0
论坛币
53 个
通用积分
6.5568
学术水平
67 点
热心指数
82 点
信用等级
30 点
经验
8631 点
帖子
451
精华
1
在线时间
155 小时
注册时间
2017-2-7
最后登录
2021-1-29

楼主
698348 在职认证  发表于 2017-9-21 20:36:40 |只看作者 |坛友微信交流群|倒序 |AI写论文
相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

Gini指数:Gini指数的意义和Gini指数的计算



(一)、gini指数的意义
      其实gini指数最早应用在经济学中,主要用来衡量收入分配公平度的指标。在决策树算CART算法中用gini指数来衡量数据的不纯度或者不确定性,同时用gini指数来决定类别变量的最优二分值得切分问题。

     在分类问题中,假设有K个类,样本点属于第k类的概率为Pk,则概率分布的gini指数的定义为:

QQ截图20170921203152.png


      如果样本集合D根据某个特征A被分割为D1,D2两个部分,那么在特征A的条件下,集合D的gini指数的定义为:

QQ截图20170921203157.png


gini指数Gini(D,A)表示特征A不同分组的数据集D的不确定性。gini指数值越大,样本集合的不确定性也就越大,这一点与熵的概念比较类似。

(二)、基尼指数的计算
      所以在此,基于以上的理论,我们可以通过gini指数来确定某个特征的最优切分点(也即只需要确保切分后某点的gini指数值最小),这就是决策树CART算法中类别变量切分的关键所在。是不是对于决策树的CART算法有点小理解啦!其实,这里可以进一步拓展到我们对于类别变量的粗分类应用上来。比如我某个特征变量下有20多个分组,现在我只想要5个大类,如何将这个20多个类合并为5个大类,如何分类最优,以及如何找到最优的分类。这些建模初期的数据预处理问题其实我们都可以用gini指数来解决。

今天第一部门先分享gini指数的计算方法,下次的第二部分分享利用gini指数来将类别变量最优分类的SAS方法。

分享数据集中某特征变量下每一个组的gini指数以及此数据集总体gini指数的计算方法的SAS代码。

/*分类变量基于gini指数的计算方法*/
/*indata表示输入数据集*/
/*var表示某个特征变量*/
/*tar_var表示目标变量*/
/*outdata表示输出数据集*/
options mlogic mprint symbolgen;
%macrogini_fz(indata=,var=,tar_var=,outdata=);
libname data"/folders/myfolders/data/";
data temp;
    set data.xinyong;
run;
%local m n;
proc sql noprint;
    select max(&var.) into: m from temp;/*取分组变量的最大值*/
    select min(&var.) into: n from temp;/*取分组变量的最小值*/
    select count(&var.) into:total from temp;/*取总体数量*/
   
    %do i = &n. %to &m.;
    select sum(&tar_var.) into:T_&i._1 from temp where&var.=&i.;/*违约客户的数量*/
    select count(&tar_var.)-sum(&tar_var.) into: T_&i._0 fromtemp where &var.=&i.;/*非违约客户的数量*/
    select count(&tar_var.) into:T_&i._s from temp where&var.=&i.;/*该分组下的违约和非违约客户的的总数量*/
    select sum(&tar_var.) into:T_1 from temp;/*总体中违约客户的数量*/
    select count(&tar_var.)-sum(&tar_var.) into:T_0 from temp;/*总体中非违约客户的数量*/
    ;
    %end;
quit;
%put &m. &n. &total. &T_1.&T_0.;
/*分别计算每组中的样本占比*/
%do i=&n. %to &m.;
   %local g_&i.;
   %let g_&i.=0;
   
   %do j=0 %to 1;
       %letg_&i.=%sysevalf(&&g_&i.+&&T_&i._&j.*&&T_&i._&j.);
    %end;
   
   %letg_&i.=%sysevalf(1-&&g_&i./(&&T_&i._s*&&T_&i._s));
%end;
/*计算总体中的占比*/
%local g;
%let g=0;
%do j=0 %to 1;
    %let g=%sysevalf(&&g.+&&T_&j.*&&T_&j.);
%end;
%letg=%sysevalf(1-&&g./(&&total.*&&total.));
%put &g.;
/*计算各分组下的gini系数*/
%local g_k;
%let g_k=0;
%do i=&n. %to &m.;
    %letg_k=%sysevalf(&&g_k.+&&T_&i._s*&&g_&i./&&total.);
%end;
%letg_value=%sysevalf(1-&&g_k./&&g.);
%put &g_value.;
/*生成数据集*/
data &outdata.;
       %doi=&n. %to &m.;
           fenzu=&i.;
           bad=&&T_&i._1;
           good=&&T_&i._0;
           g_b_total=&&T_&i._s;
           g=&&g_&i.;
           g_total=&g_k.;
           output;
       %end;
run;
proc sort data=&outdata. ; bydescending g;run; /*按照每个分组的gini系数降序排列*/

%mend;
%gini_fz(indata=data.xinyong,var=address,tar_var=default,outdata=g_out);

输出数据集结果:
fenzu表示address特征下的所有类别;bad表示坏客户数量;good表示好客户数量;g_b_total表示该分组下总体客户数;g是该组下的gini指数;g_total表示数据总体的gini指数。

QQ图片20170921203209.png



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:proc sql address options Default libname Gini指数 Gini指数意义 Gini指数计算 Gini

沙发
pengch39 发表于 2018-7-31 18:09:46 |只看作者 |坛友微信交流群
谢谢分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-20 05:12