gini指数的定义和基本计算方法
这次更新gini指数的相关内容,打算分为两篇来更新,第一篇为gini指数的理论、单个数据集的gini指数的计算、以及数据集分组下的总体gini指数的计算。第二篇主要在第一篇的基础之上做一个对特征变量最优分类的问题。
(一)、gini指数的意义
其实gini指数最早应用在经济学中,主要用来衡量收入分配公平度的指标。在决策树算CART算法中用gini指数来衡量数据的不纯度或者不确定性,同时用gini指数来决定类别变量的最优二分值得切分问题。
在分类问题中,假设有K个类,样本点属于第k类的概率为Pk,则概率分布的gini指数的定义为:
如果样本集合D根据某个特征A被分割为D1,D2两个部分,那么在特征A的条件下,集合D的gini指数的定义为:
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;
%macro gini_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 from temp 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;
%let g_&i.=%sysevalf(&&g_&i.+&&T_&i._&j.*&&T_&i._&j.);
%end;
%let g_&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;
%let g=%sysevalf(1-&&g./(&&total.*&&total.));
%put &g.;
/*计算各分组下的gini系数*/
%local g_k;
%let g_k=0;
%do i=&n. %to &m.;
%let g_k=%sysevalf(&&g_k.+&&T_&i._s*&&g_&i./&&total.);
%end;
%let g_value=%sysevalf(1-&&g_k./&&g.);
%put &g_value.;
/*生成数据集*/
data &outdata.;
%do i=&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. ; by descending 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指数。
转载请注明:数据分析 » gini指数的定义和基本计算方法