sas构建评分卡模型过程详解(二):变量筛选及逻辑回归

上一篇已经将所有变量都转化为woe值的形式,这里再另外补充一个小技巧—dummy变量的使用。
  
  1.有时候我们的数据来源可能不是很真实,如客户自己填写的婚姻状况,假设婚姻状况不会要求客户提供证明,但此时我们想加入这个变量,可以考虑加入"是否未婚或者离异",此时认为客户填写未婚或者离异的相比填写已婚的较为真实。
  2.在上一篇连续变量分箱分箱时有说到,当变量是U型时强行改变变量的趋势可能会使iv值下降很多,造成变量失真。这时就会把有跳点的woe值变量加入logistic中,但此时该变量的系数就可能为负(为什么不能为负,不在说明),或者会影响变量的进入。此时可以考虑将变量按照分箱的切割点转换成dummy变量,全部让其进入logistic,看谁能进入模型。

/*---------分割线-----------*/

假设已经完成了上述所有步骤,此时就要进入变量筛选的过程,有以下两种筛选办法。
 1.变量iv:经过woe转换之后,每个变量都有对应的iv值,通常情况下我们可以根据是否大于0.02选择一部分变量,有时不同的卡,不同的变量来源会直接影响变量iv,如B卡的iv通常会很高,此时阈值设置为0.02好像也没啥意义。 
 2.变量聚类:varclus过程步,通常设置所有类中第二特征值的最大允许值maxeigen=0.7,相关性强的强的变量会归为一类。设置ods output RSquare=r2;选择每一类中RSquareRatio中最大的变量。

实际建模时会同时计算变量的iv和RSquareRatio,然后根据变量实际定义和时间窗口等要求,相机选择合适的变量。

模型建立:将筛选后的变量输入如下过程步

proc logistic data=&intab. desc outest=dt.test_model_tr;
	model target=&var./selection=s details lackfit stb sls=0.07 sle=0.07 maxstep=&max_var.;
	output out=dt.test_model_logi p=pred;
run;quit;

部分选项说明:outest=后面输出变量的系数;selection=s 逐步回归(很多人都会选择向后回归法);details 输出详细结果;lackfit 输出HL统计量;stb 输出标准化数据后的模型参数;sle和sls是控制逐步回归变量进入(entry)和保留(stay)的阈值;maxstep是最大步数(当筛选的变量较多时,变量之间的相关性会导致较多的变量进入模型,一定步数之后,后面进入变量系数已经为负)。

自动输出模型:
  1.ods output ParameterEstimates=pe;数据集pe会包含每一步进入和剔除的变量以及变量系数和其他的统计指标,可以写一个自动剔除第一个进入模型但是变量系数为负的变量(dummy变量系数可以为负)。
  2.有时在变量聚类之后我们会对同一类里面iv和RSquareRatio都差不多的变量或者时间窗口选择3个月、6个月、1年面临艰难的抉择。这时我们可以构建数据集,每一次logistic跑不同的变量,或者开始就剔除某一变量,然后比较每次logistic的模型ks值和验证数据的ks值,以及对应的提升曲线。

proc transpose data=var out=var1(drop=_name_ _label_) prefix=v;var varname;run;quit;
data dt.rod2_all;
    set var1;
   array x[20] v1-v20;
   n=dim(x);
   k=2;
   ncomb=comb(n,k);
   do j=1 to ncomb;
      call allcomb(j, k, of x[*]);
	  output;
   end;
run;

较早的sas版本没有comb函数,用下面的代码结果相同。

proc sql;
    create table var1 as
     select a.varname as v1,b.varname as v2
     from var a
     left join var b on 1=1
     having v1^=v2;
quit;
data var2;
    set var1;
     array ar{*} v1-v2;
       if ar[1]>ar[2] then do;
          temp=ar[1];
          ar[1]=ar[2];
          ar[2]=temp;
        end;
       drop temp;
 run;
 proc sort data=var2 nodupkey;by v1 v2;run;              

上面是一个简单的排列组合函数,能帮助实现剔除不同的变量。

参考:
1.http://www.docin.com/p-959740939-f19.html
2.http://blog.sina.com.cn/s/blog_8c0549220101n76p.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值