#sas建模-建模过程介绍

学了一段时间的sas,也对基本的操作有了自己的理解与经验,上周五也进行了一次简单完整的sas建模,也顺便写一写关于这次建模的总结与教训哈哈哈。

0?wx_fmt=jpeg

建模背景:有关于一家银行的客户记录的数据,包括其储蓄卡/信用卡开卡时间,汇入汇出次数金额,取款存款次数金额,年龄,性别,不同方式(ATM,网银等)取款存款次数金额等50多个变量(对这几个变量印象较深),还有y值(1代表购买理财产品,0代表不够理财产品),然后就是使用logistics回归建立预测模型,预测客户是否会购买其理财产品。

#sas建模-建模过程介绍_第1张图片


下面我就讲下我和同伴一起建模的过程吧,顺便也梳理一下我们的一些问题点,大致按数据预处理,变量删减,变量分析,:模型建立几个环节来进行梳理,对于问题点下周回公司请教一下老司机们嘻嘻~


part 1:数据预处理

删除“未来”数据:拿到数据的一开始,老师就提示我们这堆数据里面可能会存在跨时间的“错误”数据,什么意思?简单来说吧,我们做模型的目的是基于现在的数据来预测未来的行为,所以,我们用来建立模型的输入变量数据,必须是历史数据,即当下可以拿到。


而数据的时间截点是15.9.30,但是有些客户的数据是之后才有的,所以这类的数据是不能进入到模型训练中的,应该进行标志并删除。


平衡样本:本来一开始没有删除的时候,看了一下好坏样本(即0-1的占比)占比为9:1,符合我们的建模样本要求,但是进行上一步操作后,比例就变大了,所以这里就进行样本的平衡。

proc sort data=model2_temp1 out=model2_temp2;by y;run;

proc surveyselect data =model2_temp2

    out =model3

    seed=12345

    samprate=(0.6,1);

    strata y;

run;


part 2:变量删减

删除缺失比例&同质性超90%的观测:这个就很好理解啦,因为这些数据对于目标变量没有区分度,以及缺失太多的变量会对建模造成干扰,直接删除就好了。


删除相关性较强的变量:因为工作量很多,我们使用了聚类操作,每个簇,我们尽量就保留一个变量。

/*系统聚类,需先计算各层级的目标事件占比*/

proc means data=a noprint;

    class province; /*需要分层的变量*/

    var z; /*0-1变量*/

    output out=mean_data mean=prop;

run;

/*进行聚类操作,R方越大越好,半偏R方越小越好*/

    ods output cluster history=cluster;

    proc cluster data=mean_data method=ward outtree=tree;

    freq _freq_;

    var prop;

    id province;

run;


我们一般看每一簇的1-R²,一般如果小于0.1,我们就保留其变量,但是,有的时候簇内的变量的1-R²都很大,这个时间就要结合相关性分析的表格进行判断,选出簇内两个相关性(ccorr过程步)比较小的变量(这个确实炒鸡慢,看到眼花!!!)


好呢!搞完上面的变量删减,我们从50多个变量变成了22个变量(是不是炒鸡开心哈哈哈!)


part 3:变量分析

进行完上面的操作,得到相对比较干净的数据,然后就对其进行相关性分析,包括和y值,删除强相关的一些变量,按照变量的类型分为类别变量和连续变量进行操作。

类别变量:使用freq进行计算其0-1占比,看下会不会可以进行类别的合并。

proc freq data=train;

    tables edu*z/nocol missing;

run;

#sas建模-建模过程介绍_第2张图片

连续变量:这次的变量,大多数都是连续变量,如次数金额什么的,连续变量就要用univariate啦。连续变量的处理,这里也是可以当做类别来的,但是需要是以下2种情况才可以,一个是弱同质性(超70%低90%),另一个是层级较少。

/*弱同质性*/

proc univariate data=train;

    var var1 var2 var3 var4......;  /*获得连续性变量的分位图*/

run;

/*根据实际情况,人工进行分层*/

data a;

    set train;

    if n_din>0 then numdin=1;

    else numdin=0;

run;

/*对分层后的变量进行proc freq分析*/

proc freq data=a;

    tables numdin*y/missing;

run;

/*连续变量层级较少*/

/*先把它转成类别变量进行处理,进行freq分析*/

proc freq data = train;

    tables n_csh*y/missing;

run;

/*制造0-1变量*/

data train;

    set train;

    npur_1=(n_csh<=1);

    npur_2=(n_csh=2);

run;


那么那些不能当做类别处理的连续性变量,我们就需要进行elogit转换,观察其趋势情况(这一步也是我们花费的时间比较多的,而且也是搞不出什么好结果的一步)。


我们使用rank和gplot对其进行处理和绘制散点图,但是出来的结果中,有很多“异常点”,我们对于如何处理这些“点”比较confuse,我们试了直接删除,也试了“还原到回归直线”,但是效果都是超级恶心的,可能是我们在还原的过程中出现了问题吧,这一步也是我们的瓶颈,所以最后模型的效果也不是非常好的呢~

0?wx_fmt=jpeg

不过呢,也有一点可能,就是我们前期没有对异常值进行处理,因为我们对上下3个标准差外的数据进行标记,在删除的时候,发现会删掉了超过50%的数据,所以这对数据的影响也是超级大,所以我们就选择了保留相对正常的数据,可能也是这一步导致后面的拟合不好吧。


part 4:模型建立

好了,能做的我们都做了,就直接把变量丢进去建模了,这里我们使用逐步法进行建模。proc logister data=train des;

    model y=&input./selection=stepwise sls=0.01 sle=0.01;

run;

出来的结果:C值在0.768,模型相对来说拟合效果不太好,但还可以接受吧?哈哈。因为时间限制,我们并没有被要求进行跨时间检验,所以模型验证的过程还是蛮粗糙的。

#sas建模-建模过程介绍_第3张图片

part 5:总结

好了,一个相对比较完整的模型就建立啦,整个过程还是蛮有趣的,这次的建模其实更多的是为了让我们了解建模步骤的,也是有很多的重要过程被删除了,比如前期的建模目标确定,商业问题转换为数学问题,数据清洗,关键变量衍生等等,这些都是需要扎实的业务理解才可以做出来的。


而对于上面经历的过程,我总结了一下可能还有几点需要后续去重点研究学习的:

1)异常值处理。

2)连续性变量的处理转换。

3)模型变量符合一致性检验方法。

4)WOE方法寻找变量方法。


以上的内容再加上还没有经历操作过的内容,其实还是有超多需要学习的,所以,stay hungry!stay foolish!好好加油继续学习~ 

欢迎关注,嘻嘻~

你可能感兴趣的:(#sas建模-建模过程介绍)