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. Maven中央仓库地址大全,Maven中央仓库配置示例

    < Maven 中央仓库地址大全 > 在上一篇文章中完成了 < Maven镜像地址大全 >,后来又花了时间又去收集并整理了关于 maven 远程仓库地址,并整理于此,关于 Ma ...

  2. 用windows命令解压chm文件

    Windows里有这样一个工具:hh.exe.hh.exe最重要的功能就是用来关联CHM文件,当你运行一个chm文件的时候,系统就是用这个工具来打开的. 其实它还有另外一个功能——解压CHM文件在CM ...

  3. Leetcode216. Combination Sum III组合总数3

    找出所有相加之和为 n 的 k 个数的组合.组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字. 说明: 所有数字都是正整数. 解集不能包含重复的组合. 示例 1: 输入: k = ...

  4. 好用的Win10快捷键

    好用的Win10快捷键 Top 01 基础按键 Win+E: 打开"资源管理器". Win+R: 打开"运行"对话框. Win+L: 锁定当前用户. Win+D ...

  5. jeecms系统使用介绍——jeecms中的内容、栏目、模型之间的关系

    转载:https://blog.csdn.net/dongdong9223/article/details/76578120 jeecms是一款很不错的cms产品,之前在文章<基于Java的门户 ...

  6. MySQL笔记<一>创建数据库和表

    参考博客 https://www.cnblogs.com/sqbk/p/5806797.html https://www.cnblogs.com/tomasman/p/7151962.html

  7. Python3数据分析与挖掘建模实战

    Python3数据分析与挖掘建模实战  整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程本身没问题,大家看的时 ...

  8. 常用命令6--文件搜索命令4-grep

    查找不包含size字符串的文件.

  9. 使用neo4j-import导入数据及关系

    背景 上节我们了解了什么是图数据库,作为研究对象的neo4j的特点,优缺点以及基本的环境搭建. 现在我们要讲存储在csv中的通话记录数据导入到neo4j中去,并且可以通过cql去查询导入的数据及关系 ...

  10. 2019.8.14 NOIP模拟测试21 反思总结

    模拟测试20的还没改完先咕着 各种细节问题=错失190pts T1大约三分钟搞出了式子,迅速码完,T2写了一半的时候怕最后被卡评测滚去交了,然后右端点没有初始化为n…但是这样还有80pts,而我后来还 ...