评分卡模型开发-数据集缺失值处理

更新内容:missingno库可视化缺失值


在实际的应用过程中,样本由于各种原因缺少一个或多个值的情况并不少见,其主要原因有:在数据收集过程中出现了错误,常用的度量方法并不适用于某些特征,或在某些调查过程中有些数据未被填写,等等。我们见到的缺失值是数据表中的空值,或者是类似于NaN的占位符。
有些时候缺失值的存在是合乎逻辑的,比如婚姻状态是未婚,则孩子数量不填是很正常的,但是有些缺失值我们忽略之后会让机器学习算法的效能大打折扣,所以我们必须采取一些措施来处理缺失值。
关于处理缺失值的方案在当我们在谈论数据时我们应该谈些什么?有提及,这里就不赘述了。

数据集的准备

改数据来与R中的“klaR”包中的German credit data

install.packages("klaR")
library(klaR)
write.csv(GermanCredit,file="C:\\Users\\Administrator\\OneDrive\\步履不停\\评分卡制作\\数据\\GermanCredit.csv")

或者也可以直接去http://archive.ics.uci.edu/ml/datasets/Statlog+(German+Credit+Data)下载
关于数据集中各个属性所代表的含义可以去https://pan.baidu.com/s/1o8aaGXk下载doc文件查看

一、缺失值的识别

  • 在python中缺失值可以用pandas中的isnull()
import pandas as pd
df = pd.read_csv("C:\\Users\\Administrator\\OneDrive\\步履不停\\评分卡制作\\数据\\GermanCredit.csv",engine='python')
df.isnull().sum()

得到如下结果,可以看到没有缺失值。没办法,这个数据应该是事先被处理过的,方便建模。总之,呵呵。。。。。。

Unnamed: 0                 0
status                     0
duration                   0
credit_history             0
purpose                    0
amount                     0
savings                    0
employment_duration        0
installment_rate           0
personal_status_sex        0
other_debtors              0
present_residence          0
property                   0
age                        0
other_installment_plans    0
housing                    0
number_credits             0
job                        0
people_liable              0
telephone                  0
foreign_worker             0
credit_risk                0
dtype: int64
  • 还可以用missingno这个库图形化缺失值
import missingno
missingno.matrix(data)

那我们可以自己构造数据

import pandas as pd 
from io import StringIO
csv_data='''A,B,C,D
1,2,3,4
5,6,7,8
0,11,12,'''
data = pd.read_csv(StringIO(csv_data))
data
    A   B   C   D
0   1   2   3.0 4.0
1   5   6   NaN 8.0
2   0   11  12.0NaN
data.isnull().sum()
A    0
B    0
C    1
D    1
dtype: int64

二,将存在缺失值的特征或样本删除

  • 优点:简单方便
  • 缺点:可能会删除过多的样本,导致分析结果可靠性不高
    在python中可以用DataFrame.dropna()方法删除缺失值
#删除存在缺失值的行
data.dropna()
     A  B   C   D
0   1   2   3.0 4.0
data.dropna(axis=1) #删除存在缺失值的列
df.dropna(how='all') #删除所有列都是缺失值的行
df.dropna(thresh=4) #删除没有至少4个非NaN值的行
df.dropna(subset=['C']) #删除指定列中存在缺失值的行

三,缺失值的填充

在不能剔除缺失值的时候,我们可以使用不同的插值技术,通过数据集中其他训练样本的数据来估计缺失值。对于数值型数据来说,通常使用能代表变量中心趋势的值来填补。通常有平均值,中位数,众数等。选择哪种中心趋势值来填充需要观察变量的分布。因为平均值易受极端值影响,在这中偏态数据中,我们可以用中位数来填充,而在正态分布下我们可以用平均值。对于定性数据来讲,我们可以用众数来填充
在numpy中,缺失值可以用numpy.NaN或者numpy.nan来表示
在scikit-learn中,有可以实现的类-Imputer

  • 平均值

from sklearn.preprocessing import Imputer
#axis=0,代表用列的均值来进行相应的替换,等于1代表用行的均值来替换
imr = Imputer(missing_values='NaN',strategy='mean',axis=0)
imr.fit(data)
imputed_data = imr.transform(data.values)
imputed_data
  • 中位数
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN',strategy='median',axis=0)
imr.fit(data)
imputer_data = imr.transform(data.values)
imputer_data
  • 众数
from sklearn.preprocessing import Imputer
imr = Imputer(missing_values='NaN',strategy='most_frequent',axis=0)
imr.fit(data)
imputer_data = imr.transform(data.values)
imputer_data

也可以使用pandas 中的相关方法,具体可以参考这篇文章http://blog.csdn.net/helen1313/article/details/53304641

  • 采用拉格朗日插值法
#构建数据
import numpy as np
sales = pd.DataFrame(data={'sale_money':[3442.1,3393.1,3136.6,3744.1,6607.4,4060.3,3614.7,3295.5,2332.1,2699.3,np.nan,3036.8]})

#导入库
from scipy.interpolate import lagrange #导入拉格朗日插值函数

#过滤异常值,将其变为空值
sales['sale_money'][(sales['sale_money']<400) | (sales['sale_money']>5000)]=None


#自定义函数
##导入拉格朗日插值函数
from scipy.interpolate import lagrange
def ployinterp_columns(s,n,k=5):
    #s为列向量,n为缺失值位置,K为取前后的数据个数。默认为5
    y = s[list(range(n-k,n))+list(range(n+1,n+1+k))] #取数
    y=y[y.notnull()] #剔除空值
    return(lagrange(y.index,list(y))(n))
#逐个列逐个行判断是否需要插值
for i in sales.columns:
    for j in range(len(sales)):
        if(sales[i].isnull())[j]:
            sales[i][j] = ployinterp_columns(sales[i],j)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 193,968评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,682评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,254评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,074评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,964评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,055评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,484评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,170评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,433评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,512评论 2 308
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,296评论 1 325
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,184评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,545评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,150评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,437评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,630评论 2 335

推荐阅读更多精彩内容