转自:https://cloud.tencent.com/developer/article/1016341

在我们搜集样本时,许多样本中一般都含有缺失值,这种情况在现实问题中非常普遍,这会导致一些不能处理缺失值的分析方法无法应用,因此,在信用风险评级模型开发的第一步我们就要进行缺失值处理。缺失值处理的方法,包括如下几种。 (1) 直接删除含有缺失值的样本。 (2) 根据样本之间的相似性填补缺失值。 (3) 根据变量之间的相关关系填补缺失值。 直接删除含有缺失值的样本时最简单的方法,尤其是这些样本所占的比例非常小时,用这种方法就比较合理,但当缺失值样本比例较大时,这种缺失值处理方法误差就比较大了。在采用删除法剔除缺失值样本时,我们通常首先检查样本总体中缺失值的个数,在R中使用complete.cases()函数来统计缺失值的个数。

>GermanCredit[!complete.cases(GermanCredit),]
>nrow(GermanGredit[!complete.cases(GermanCredit),]
>GermanCredit<-na.omit(GermanCredit)    #删除包含缺失值的样本
>View(GermanCredit)                     #查看结果

根据样本之间的相似性填补缺失值是指用这些缺失值最可能的值来填补它们,通常使用能代表变量中心趋势的值进行填补,因为代表变量中心趋势的值反映了变量分布的最常见值。代表变量中心趋势的指标包括平均值、中位数、众数等,那么我们采用哪些指标来填补缺失值呢?最佳选择是由变量的分布来确定,例如,对于接近正态分布的变量来说,由于所有观测值都较好地聚集在平均值周围,因此平均值就就是填补该类变量缺失值的最佳选择。然而,对于偏态分布或者离群值来说,平均值就不是最佳选择。因为偏态分布的大部分值都聚集在变量分布的一侧,平均值不能作为最常见值的代表。对于偏态分布或者有离群值的分布而言,中位数是更好地代表数据中心趋势的指标。对于名义变量(表3.1中的定性指标),通常采用众数填补缺失值。 我们将上述分析放在一个统一的函数centralImputation()中,对于数值型变量,我们用中位数填补,对于名义变量,我们用众数填补,函数代码如下:

centralImputation<-function(data){for(i in seq(ncol(data)))if(any(idx<-is.na(data[,i]))){data[idx,i]<-centralValue(data[,i])}data}centralValue<-function(x,ws=NULL){if(is.numeric(x)){if(is.null(ws)){median(x,na.rm = T)}else if((s<sum(ws))>0){sum(x*(ws/s))}else NA}else{x<-as.factor(x)if(is.null(ws)){levels(x)[which.max(table(x))]}else{levels(x)[which.max(aggregate(ws,list(x),sum)[,2])]}}}

调用上述函数对缺失值进行填补,代码如下:

x<-centralImputation(GermanCredit)
View(x)     #查看填补结果

上述按照中心趋势进行缺失值填补的方法,考虑的是数据每列的数值或字符属性,在进行缺失值填补时,我们也可以考虑每行的属性,即为我们要讲述的第三种处理缺失值的方法,根据变量之间的相关关系填补缺失值。 当我们采用数据集每行的属性进行缺失值填补时,通常有两种方法,第一种方法是计算k个(本文k=10)最相近样本的中位数并用这个中位数来填补缺失值,如果缺失值是名义变量,则使用这k个最近相似数据的加权平均值进行填补,权重大小随着距离待填补缺失值样本的距离增大而减小,本文我们采用高斯核函数从距离获得权重,即如果相邻样本距离待填补缺失值的样本的距离为d,则它的值在加权平均中的权重为:

在寻找跟包含缺失值的样本最近的k个邻居样本时,最常用的经典算法是knn(k-nearest-neighbor) 算法,它通过计算样本间的欧氏距离,来寻找距离包含缺失值样本最近的k个邻居,样本x和y之间欧式距离的计算公式如下:

式中:δ_i ( )是变量i的两个值之间的距离,即

在计算欧式距离时,为了消除变量间不同尺度的影响,通常要先对数值变量进行标准化,即:

我们将上述根据数据集每行的属性进行缺失值填补的方法,封装到knnImputation()函数中,代码如下:

knnImputation<-function(data,k=10,scale=T,meth="weighAvg",distData=NULL)
{n<-nrow(data)if(!is.null(distData)){distInit<-n+1data<-rbind(data,distData)}else{disInit<-1}N<-nrow(data)ncol<-ncol(data)nomAttrs<-rep(F,ncol)for(i in seq(ncol)){nomAttrs[i]<-is.factor(data[,1])}nomAttrs<-which(nomAttrs)hasNom<-length(nomAttrs)contAttrs<-setdiff(seq(ncol),nomAttrs)dm<-dataif(scale){dm[,contAttrs]<-scale(dm[,contAttrs])}if(hasNom){for(i in nomAttrs)dm[,i]<-as.integer(dm[,i])}dm<as.matrix(dm)nas<-which(!complete.cases(dm))if(!is.null(distData)){tgt.nas<-nas[nas<=n]}else{tgt.nas<-nas}if(length(tgt.nas)==0){warning("No case has missing values. Stopping as there is nothing to do.")}xcomplete<-dm[setdiff(disInit:N,nas),]if(nrow(xcomplete)<k){stop("Not sufficient complete cases for computing neighbors.")}for(i in tgt.nas){tgtAs<-which(is.na(dm[i,]))dist<-scale(xcomplete,dm[i,],FALSE)xnom<-setdiff(nomAttrs,tgtAs)if(length(xnom)){dist[,xnom]<-ifelse(dist[,xnom]>0,1,dist[,xnom])}dist<-dist[,-tgtAs]dist<-sqrt(drop(dist^2%*%rep(1,ncol(dist))))ks<-order(dist)[seq(k)]for(j in tgtAs) if(meth=="median"){data[i,j]<-centralValue(data[setdiff(distInit:N,nas),j][ks])}else{data[i,j]<-centralValue(data[setdiff(distInit:N,nas),j][ks],exp(-dist[ks]))}}data[1:n,]
}

调用knnImputation()函数,用knn方法填补缺失值,代码如下:

d<-knnImputation(GermanCredit)
View(d)     #查看填补结果

如果使用k近邻的中位数来填补缺失值,可使用如下代码:

d<-knnImputation(GermanCredit,k=10,meth=”median”)
View(d)

综上,我们共讲述了三种缺失值的处理方法,当我们决定采用哪种方法来填补缺失值时,通常需要根据所分析领域的具体情况来确定。 缺失值处理完毕后,我们还需要进行异常值处理。异常值是指明显偏离大多数抽样数据的数值,异常值处理见下篇: http://write.blog.csdn.net/mdeditor#!postId=76599792

评分卡模型开发(一)--用户数据缺失值处理相关推荐

  1. 信用评分卡模型开发及评估指标

    版权声明:本文为博主原创文章,未经博主允许不得转载. 一.信用风险评级模型的类型 信用风险计量体系包括主体评级模型和债项评级两部分.主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用&qu ...

  2. 评分卡模型开发(十)--总体流程

    转自: https://blog.csdn.net/lll1528238733/article/details/76602006 一.信用风险评级模型的类型 信用风险计量体系包括主体评级模型和债项评级 ...

  3. 信用标准评分卡模型开发及实现

    一.信用风险评级模型的类型 信用风险计量体系包括主体评级模型和债项评级两部分.主体评级和债项评级均有一系列评级模型组成,其中主体评级模型可用"四张卡"来表示,分别是A卡.B卡.C卡 ...

  4. 信用评分卡模型开发中双峰分布原因及解决方案

    信用评分卡模型开发中双峰分布原因及解决方案   文: 郑旻圻 邹钰 刘巧莉 转自:  数信互融 在信用评分卡模型开发过程中,正态性是检验模型信用评分分布是否有效的一个重要指标.正常情况下,标准的正态分 ...

  5. 评分卡模型开发(二)--用户数据异常值处理

    转自:https://cloud.tencent.com/developer/article/1016342 用户数据缺失值处理见上篇: https://cloud.tencent.com/devel ...

  6. 评分卡模型开发(五)--定性指标筛选

    转自:https://cloud.tencent.com/developer/article/1016327 定量指标是数值型的,我们还可以用回归的方法来筛选,那么定性的指标怎么办呢? R里面给我们提 ...

  7. 评分卡模型开发(六)--WOE值计算

    转自:https://cloud.tencent.com/developer/article/1016331 对入模的定量和定性指标,分别进行连续变量分段(对定量指标进行分段),以便于计算定量指标的W ...

  8. 评分卡模型开发(八)--主标尺设计及模型验证

    转自:https://blog.csdn.net/lll1528238733/article/details/76601930 上一步中开发的信用风险评分卡模型,得到的是不同风险等级客户对应的分数,我 ...

  9. 评分卡模型开发(四)--定量指标筛选

    模型开发的前三步主要讲的是数据处理的方法,从第四步开始我们将逐步讲述模型开发的方法.在进行模型开发时,并非我们收集的每个指标都会用作模型开发,而是需要从收集的所有指标中筛选出对违约状态影响最大的指标, ...

  10. 评分卡模型开发(七)--基于逻辑回归的标准评分卡实现

    由逻辑回归的基本原理,我们将客户违约的概率表示为p,则正常的概率为1-p.因此,可以得到几率,也叫对数比率: 此时,客户违约的概率p可表示为: 评分卡设定的分值刻度可以通过将分值表示为比率对数的线性表 ...

最新文章

  1. jfinal框架下使用c3P0连接池连接sql server 2008
  2. 使用指针判断数组是否为上三角矩阵
  3. 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
  4. 【转】简单的java缓存实现
  5. java 拼图_我最喜欢的Java拼图2 + 1 = 4
  6. 【渝粤题库】广东开放大学 C语言程序设计 形成性考核
  7. python去重语句_Python对列表去重的多种方法(四种方法)
  8. labelme实例分割_MaskRCNN在多个实例数据集上实践
  9. EXCHANGE 系列
  10. android factory,“工厂映像”(factory image)是什么?你所不知道的Android问题
  11. linux信号(二)--unix环境高级编程读书笔记
  12. MainStoryboard.storyboard could not be opened
  13. ASP.NET Core Razor 页面入门
  14. 微雪云进销存ERP功能很强大,你忍一下。
  15. 英语它在计算机旁边怎么读,计算机的英语怎么读?
  16. 生产环境CPU飙高问题解决,记一次完整解决过程
  17. Splash抓取jd
  18. 基于OpenCV的人脸识别考勤系统
  19. 使用remix发布部署 发币 智能合约
  20. bootstrap实战--微金所项目(轮播图1)

热门文章

  1. Gerrit代码提交: [remote rejected] prohibited by gerrit: ref update access denied报错解决
  2. Win10之WSL编译Android7.1源码
  3. 在iOS端使用AVSampleBufferDisplayLayer进行视频渲染
  4. nginx之反向代理配置
  5. UE4之windows.h冲突
  6. staruml 为类的属性指定数据类型_关于python的数据类型
  7. casio wrist怎么调时间_价格便宜量也足,小米有品TIMEROLLS COB时间轨迹石英腕表体验...
  8. 编译原理-提取左公因子---消除左递归(自己看)
  9. 360手机浏览器_UC、QQ、华为、360、搜狗、小米、vivo、OPPO等8款手机浏览器被纳入首批传播秩序专项整治...
  10. ubuntu mysql 编译_Ubuntu下mysql编译安装