登录
首页精彩阅读sas信用评分之不用检查异常值的最优分组
sas信用评分之不用检查异常值的最优分组
2017-05-29
收藏

sas信用评分之不用检查异常值的最优分组

今天的更新比以往晚了一天,假期综合症第一天,我到现在已经喝了第三杯咖啡,实现上周的预告,这种更新一个不用检查异常值的数值变量最优分组。其实这代码我本来不想拿出来,我觉得这代码估计能卖点钱,但是介于我是一个不敢赚你们钱的博主,所以还是拿出来吧。本篇文章最后有惊喜。

首先我们先说下,这的代码的思路,为什么不用检查异常值呢。其实是这样子的,我把等量分组和最优分组结合起来了,即保证了最小组的数量也保证了不要因为某些异常值导致分组的过拟合。也少去人工的手动分组。

譬如,有一个年龄的分组,那么我会先用等量分组先分成20组,这时候注意了,就是前后会有极小极大值,就算是异常值,这时候因为你分成了20组,所以极小值以及极大值就被包含在第一组以及最后一组中,以1和20代替了。我相信我这么说你应该可以理解。

至于这等量分组的代码用的是proc rank过程去分的,具体可以参考:proc rank过程

等量分组的代码在这篇文章中:sas信用评分之手动对数值变量分组

然后将产出的结果映射到原数据中再丢进去最优分组,最优分组的代码在这篇文章中:sas信用评分之第二步变量筛选。再丢进去最优分组的代码的时候,需要将等量分组映射到原数据集中,映射代码如下:


/*这个宏是在%data_split后面的执行的,所以这里需要的数据集有%data_split中产生的以"_iv"为后缀的,"_RANK"的数据集*/

data:填入原数据集

id:填入主键

ddvar:因变量

%macro map(data,id,ddvar);

proc sql noprint;

select col_name into: varlist separated by ' ' from &data._IV;

%let nVar=&SQLOBS;

quit;/*从细分后的字典表中得到待填充的变量*/

%put &varlist.;

data  &data._woe;

set &data.(keep=&id. &ddvar.);

run;/*首先获取相应的识别标识及Y值*/


data &data._1(drop=i);

set &data.;

array arr1{*} _NUMERIC_;

do i = 1 to dim(arr1);

if missing(arr1(i)) then do;

arr1(i)=-999;

end;

end;

run;

%do i=1 %to &nVar;

%let var = %scan(&varlist, &i);

data V ;

set &data._1(keep=&id. &var.);

run;/*找出待填充变量的取值,将空值填充为1000000000*/


data rank;

set &data._RANK;

where col_name="&var.";

run;/*找出待填充变量的配置表相关信息*/


proc sql noprint;

create table WOE AS 

select I.&id., B.clus as &var.

from V AS I

left join rank AS B 

ON I.&var. > b.low AND I.&var. <= B.up

;

quit;/*通过上、下界进行填充*/

proc sort data=WOE;

by &id.;

run;

proc sort data=&data._woe;

by &id.;

run;


data &data._woe;

merge &data._woe woe;

by &id.;

run;/*合并所有的变量woe*/

%end;

%mend;

我希望你们真心想用这部分代码分组的,你们要自己看懂代码,学习这种东西不是问出来,都是要自己动手琢磨的。我自认为我不是一个聪明的人,但我是喜欢的东西,我会很乐于去探索,所以你也可以。



数据分析咨询请扫描二维码

客服在线
立即咨询