SAS信用评分之番外篇异常值的识别

今天想分享给大家的是我早期建模的时候一个识别异常值的办法,也许你在“信用风险评分卡研究”看过,但是代码只能识别一个变量,我将这个代码作了改良,但是我在这里必须声明一点,就是假设你身处的公司数据并不多的话,我不建议你使用这个代码,因为我是简单粗暴的将异常值直接剔除了。

就因为我的数据不多,所以我之前在做建模的时候使用的是先等量分组再最优分段的方式来使变量不用识别异常值,说道这里,我又需要跟大家提醒一下就是关于最优分段的代码,说有过拟合的现象。这里跟大家解释一下就是关于最优分段过拟合,因为最优分段的基础是建立在等量分组的基础上,所以重点就是在等量分组上,假设你领导能接受的最小一组的总数据量的1/20,那么你就在等量分组中分20组,保证在后面的产出至少一组都是1/20以上,以此类推。

进入正题,我来讲这个识别异常值的代码,首先,这个代码只针对连续变量,而且是正态分布或者是接近正态分布的变量,若是双峰或者左偏单峰,或者右偏单峰都不适用这个代码的识别。其实这个代码有很多局限性,所以我写出来之后也不是经常的用到,所以叫做番外篇。

接下来的这个代码分为两部分,第一就是针对缺失值大于30%的变量在业务上可以解释的通的,那这个变量做异常值处理的时候就会去除缺失值做异常值处理。对于缺失值小于30%,就让其变量的缺失值跟其他值一起做异常值处理。第二就是针对判定为异常值观测不会就直接删掉,而是先输出该观测,等到全部的变量做完了异常值检查之后,再判断这个观测出现了几次的异常。这时候你定一个伐值,假设是5次就删掉,那就是只要一个观测在这批变量中出现过5次判断为异常的那就会删掉。基本思路就是这样子啦。那就上代码吧。

*%Extremes(DSin, VarX, IDVar, NSigmas, DSout);



*DSin 填入原数据集;



*VarX 要检查异常的变量;



*IDVar 数据集的主键,用于标识是那条观测;



*NSigmas 在几倍标准差内属于异常值,在后续的执行代码中,我写的是3;



*DSout输出的数据集;





%macro Extremes(DSin, VarX, IDVar, NSigmas, DSout);



proc sort data=&DSin. out=temp(keep=
&VarX. &IDVar.);by
&IDVar;



run;



 proc univariate data=temp noprint;



 var &VarX;



 output
out=temp_u  
STD=VSTD   Mean=VMean;



run;



data _null_;



 set temp_u;



 call symput('STD', VSTD);



 call symput('Mean', VMean);



run;



%let ULimit=%sysevalf(&Mean
&NSigmas * &STD);



%let LLimit=%sysevalf(&Mean -
&NSigmas * &STD);



data &DSout;



 set temp;



 if &VarX <
&Llimit or &VarX >
&ULimit;



run;



proc datasets library=work nodetails nolist ;



delete temp temp_u;



quit;



%mend;



%macro Extremes1(DSin, VarX, IDVar, NSigmas, DSout);



proc sort data=&DSin. out=temp(keep=
&VarX. &IDVar.);by
&IDVar;



run;



 proc univariate data=temp noprint;



 var &VarX;



 output
out=temp_u  
STD=VSTD   Mean=VMean;



run;



data _null_;



 set temp_u;



 call symput('STD', VSTD);



 call symput('Mean', VMean);



run;



%let ULimit=%sysevalf(&Mean
&NSigmas * &STD);



%let LLimit=%sysevalf(&Mean -
&NSigmas * &STD);



data &DSout;



 set
temp(where=(&VarX.^=.));



 if &VarX <
&Llimit or &VarX >
&ULimit;



run;



proc datasets library=work nodetails nolist ;



delete temp temp_u;



quit;



%mend;







*var_namelist(data=,coltype=,tarvar=);



*data 填入原始数据集;



*coltype 变量的类型,数值是“num”,字符是“char”;



*tarvar 填入你不要做异常值检验的变量,这里只能填一个,理论上填的是主键;



*dsor 输出的数据集;



%macro var_namelist(data=,coltype=,tarvar=,dsor=);



    %let
lib=%upcase(%scan(&data.,1,'.'));



    %let
dname=%upcase(%scan(&data.,2,'.'));



    %global
var_list var_num;



    proc sql
;



     
create table &dsor. as



       
select name



       
from sashelp.VCOLUMN



       
where left(libname)="&lib." and
left(memname)="&dname." and
type="&coltype." and
lowcase(name)^=lowcase("&tarvar.");



    quit;



%mend;









*a 填入数据集的名字即可;



%macro  ivar(data,tar_var,id);



  proc datasets lib=work;



  delete kk;



  run;



  
%var_namelist(data=&data.,coltype=num,tarvar="&tar_var.",dsor=score_total_list_1)

data _null_;



   set score_total_list_1;



   call symput
(compress("var"||left(_n_)),compress(name));



   call
symput(compress("n"),compress(_n_));



   run;



    
%do i= 2 %to &n.;



       
proc sql;



       
select count(case when
&&Var&i=. then 1
else 0 end)/count(*) into:num&i.



       
from &data.;



     
quit;



    
%if 
&&num&i.<0.3
%then %do;



     
%Extremes(DSin=&data.,
VarX=&&Var&i.,
IDVar=appl_id, NSigmas=4, DSout=aa_&i.);



      
%end;



      
%else %do;



     
%Extremes1(DSin=&data.,
VarX=&&Var&i.,
IDVar=appl_id, NSigmas=4, DSout=aa_&i.);



    
%end;



       
proc append base=kk
data=aa_&i.(keep=&id.);



      
run;



       
proc datasets lib=work;



     
delete aa_&i.;



     
run;



       
%end;





%mend;



ivar(data,tar_var,id);

data:输入你的数据集。

Tar_var:输入你的因变量。

Id:输入你的主键。

输出的数据集是主键,对其计数就知道他在多少个变量里面表现为异常值,再根据自己判断的伐值进行删除。

我个人觉得这个代码的对于逻辑回归模型的可用性不是太强,因为逻辑回归中对于变量并没与太多的要求,若是你建模用的模型是线性回归估计可能对你有用。那么这次的分享就到这里吧。

SAS信用评分之番外篇异常值的识别的更多相关文章

  1. SAS信用评分之逻辑回归的变量选择

    SAS信用评分之逻辑回归的变量选择 关于woe的转化,这一部在之前的这篇文章:sas批量输出变量woe值中已经写了,woe也只是简单的公式转化而已,所以在这系列中就不细究了哈.这次的文章我想来讲逻辑回 ...

  2. sas信用评分之第二步变量筛选

    sas信用评分之第二步变量筛选 今天介绍变量初步选择.这部分的内容我就只介绍information –value,我这次做的模型用的逻辑回归,后面会更新以基尼系数或者信息熵基础的筛选变量,期待我把. ...

  3. 【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  4. iOS冰与火之歌(番外篇) - 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权

    iOS冰与火之歌(番外篇) 基于PEGASUS(Trident三叉戟)的OS X 10.11.6本地提权 蒸米@阿里移动安全 0x00 序 这段时间最火的漏洞当属阿联酋的人权活动人士被apt攻击所使用 ...

  5. 给深度学习入门者的Python快速教程 - 番外篇之Python-OpenCV

    这次博客园的排版彻底残了..高清版请移步: https://zhuanlan.zhihu.com/p/24425116 本篇是前面两篇教程: 给深度学习入门者的Python快速教程 - 基础篇 给深度 ...

  6. 可视化(番外篇)——在Eclipse RCP中玩转OpenGL

    最近在看有关Eclipse RCP方面的东西,鉴于Gephi是使用opengl作为绘图引擎,所以,萌生了在Eclipse RCP下添加画布,使用opengl绘图的想法,网上有博文详细介绍这方面的内容, ...

  7. 可视化(番外篇)——SWT总结

    本篇主要介绍如何在SWT下构建一个应用,如何安装SWT Designer并破解已进行SWT的可视化编程,Display以及Shell为何物.有何用,SWT中的常用组件.面板容器以及事件模型等. 1.可 ...

  8. 【重走Android之路】【番外篇】关于==和equals

    [重走Android之路][番外篇]关于==和equals   在实际的编程当中,经常会使用==和equals来判断变量是否相同.但是这两种比较方式也常常让人搞得云里雾里摸不着头脑.下面是我个人做的总 ...

  9. 【重走Android之路】【番外篇】有关于null的一些知识点

    [重走Android之路][番外篇]有关于null的一些知识点   1.首先,到底什么是null? null是Java中的一个关键字,用于表示一个空对象引用,但其本身并不是任何类型也不是属于任何对象. ...

随机推荐

  1. pip安装requests报错unicodeEncodeError:'ascii' codec can\t encode charactesers in position 9-12:ordinal not in range(128)

    前提 : 已经安装pip(pip的安装我参考的是本博客转载脚本之家的步骤,实验可以成功) 1. 在cmd输入命令转到pip安装目录: 2. 运行后出现错误 3. 步骤2中的错误应该和编码有关.搜索百度 ...

  2. tensorflow高效地推导pb模型,完整代码

    from matplotlib import pyplot as plt import numpy as np import os import six.moves.urllib as urllib ...

  3. Linux User and Group Management

    linux is a multi-user and multitasking OS. In Linux, you can create any number of user account and g ...

  4. Django项目:CRM(客户关系管理系统)--51--42PerfectCRM实现AJAX全局账号注册

    #urls.py """PerfectCRM URL Configuration The `urlpatterns` list routes URLs to views. ...

  5. ES6--反引号的使用

    /*动态初始退出登出框话模态框*/ /*动态的初始化退出登陆模态框 反引号ES6语法 * 为什么在使用字符串格式直接创建模态框 * 1.不能在html页面中创建模板,因为如果换一个页面就没有对应的模板 ...

  6. laravel--request类获取传值

    request类获取传值 Request类的方法很多,常用的有如下几个: Request -> all() : 表示一次性获取所有的传值(包括get和post,但不能获取参数) Request ...

  7. ngVerify - 更高效的 angular 表单验证

    ngVerify v1.5.0 a easy Angular Form Validation plugin.简洁高效的__angular表单验证插件__ See how powerful it.看看它 ...

  8. Python各种转义符

    文章来源:https://www.cnblogs.com/luckyplj/p/9792658.html 谢谢作者:雨后观山色

  9. HTML5属性

    HTML5同时增加和废除了很多属性.下面介绍一些常用的属性. 1.表单属性 为input(type=text).select.textarea与button元素新增了autofocus属性.(它以指定 ...

  10. day37 06-Hibernate二级缓存:更新时间戳区

    二级缓存区:类缓存区,集合缓存区,更新时间戳区. 它会记录一个时间T1.其实在我们查询之后它会记录一个时间.假设时间叫做T1.就是你查询完之后的当前时间是T1.当我们自己手动在下面做了一个更新之后,它 ...