本站分享:AI、大数据、数据分析师培训认证考试,包括:Python培训Excel培训Matlab培训SPSS培训SAS培训R语言培训Hadoop培训Amos培训Stata培训Eviews培训

gini指数的定义和基本计算方法

sas培训 cdadata 23045℃

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指数的定义和基本计算方法

转载请注明:数据分析 » gini指数的定义和基本计算方法

喜欢 (2)or分享 (0)