学了一段时间的sas,也对基本的操作有了自己的理解与经验,上周五也进行了一次简单完整的sas建模,也顺便写一写关于这次建模的总结与教训哈哈哈。
建模背景:有关于一家银行的客户记录的数据,包括其储蓄卡/信用卡开卡时间,汇入汇出次数金额,取款存款次数金额,年龄,性别,不同方式(ATM,网银等)取款存款次数金额等50多个变量(对这几个变量印象较深),还有y值(1代表购买理财产品,0代表不够理财产品),然后就是使用logistics回归建立预测模型,预测客户是否会购买其理财产品。
下面我就讲下我和同伴一起建模的过程吧,顺便也梳理一下我们的一些问题点,大致按数据预处理,变量删减,变量分析,:模型建立几个环节来进行梳理,对于问题点下周回公司请教一下老司机们嘻嘻~
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;
连续变量:这次的变量,大多数都是连续变量,如次数金额什么的,连续变量就要用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,我们试了直接删除,也试了“还原到回归直线”,但是效果都是超级恶心的,可能是我们在还原的过程中出现了问题吧,这一步也是我们的瓶颈,所以最后模型的效果也不是非常好的呢~
不过呢,也有一点可能,就是我们前期没有对异常值进行处理,因为我们对上下3个标准差外的数据进行标记,在删除的时候,发现会删掉了超过50%的数据,所以这对数据的影响也是超级大,所以我们就选择了保留相对正常的数据,可能也是这一步导致后面的拟合不好吧。
part 4:模型建立
好了,能做的我们都做了,就直接把变量丢进去建模了,这里我们使用逐步法进行建模。proc logister data=train des;
model y=&input./selection=stepwise sls=0.01 sle=0.01;
run;
出来的结果:C值在0.768,模型相对来说拟合效果不太好,但还可以接受吧?哈哈。因为时间限制,我们并没有被要求进行跨时间检验,所以模型验证的过程还是蛮粗糙的。
part 5:总结
好了,一个相对比较完整的模型就建立啦,整个过程还是蛮有趣的,这次的建模其实更多的是为了让我们了解建模步骤的,也是有很多的重要过程被删除了,比如前期的建模目标确定,商业问题转换为数学问题,数据清洗,关键变量衍生等等,这些都是需要扎实的业务理解才可以做出来的。
而对于上面经历的过程,我总结了一下可能还有几点需要后续去重点研究学习的:
1)异常值处理。
2)连续性变量的处理转换。
3)模型变量符合一致性检验方法。
4)WOE方法寻找变量方法。
以上的内容再加上还没有经历操作过的内容,其实还是有超多需要学习的,所以,stay hungry!stay foolish!好好加油继续学习~
”欢迎关注,嘻嘻~”