面试不仅仅是一个找工作的过程,还是一个向面试官交流学习的过程。之前的某次面试中,聊到了缺失值填充方法,经面试官指点学到了一些技能,下面简要总结一下。

常见的缺失值填充方法有填充默认值、均值、众数、KNN填充、以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较。

1. 数据集介绍

数据集来源于 天池精准医疗大赛——人工智能辅助糖尿病遗传风险预测。该数据集共有1000条数据,特征共83维,加上id和label共85列,每维特征缺失数量范围为0~911。为了简单比较各种填充方法的效果,我们选取最简单的二分类模型(逻辑回归),选取F1 score作为评测指标。

读取数据集代码如下:

train_data = pd.read_csv('train_data.csv', encoding='gbk') # 读取数据集filter_feature = ['id','label'] # 过滤无用的维度
features = []
for x in train_data.columns: # 取特征if x not in filter_feature:features.append(x)train_data_x = train_data[features]
train_data_y = train_data['label']
X_train, X_test, y_train, y_test = train_test_split(train_data_x, train_data_y, random_state=1) # 划分训练集、测试集

2. 常见的填充方法

(1)填充固定值

选取某个固定值/默认值填充缺失值。

train_data.fillna(0, inplace=True) # 填充 0

(2)填充均值

对每一列的缺失值,填充当列的均值。

train_data.fillna(train_data.mean(),inplace=True) # 填充均值

(3)填充中位数

对每一列的缺失值,填充当列的中位数。

train_data.fillna(train_data.median(),inplace=True) # 填充中位数

(4)填充众数

对每一列的缺失值,填充当列的众数。由于存在某列缺失值过多,众数为nan的情况,因此这里取的是每列删除掉nan值后的众数。

train_data.fillna(train_data.mode(),inplace=True) # 填充众数,该数据缺失太多众数出现为nan的情况
features_mode = {}
for f in features:print f,':', list(train_data[f].dropna().mode().values)features_mode[f] = list(train_data[f].dropna().mode().values)[0]
train_data.fillna(features_mode,inplace=True)

(5)填充上下条的数据

对每一条数据的缺失值,填充其上下条数据的值。

train_data.fillna(method='pad', inplace=True) # 填充前一条数据的值,但是前一条也不一定有值
train_data.fillna(0, inplace=True)train_data.fillna(method='bfill', inplace=True) # 填充后一条数据的值,但是后一条也不一定有值
train_data.fillna(0, inplace=True)

(6)填充插值得到的数据

用插值法拟合出缺失的数据,然后进行填充。

for f in features: # 插值法填充train_data[f] = train_data[f].interpolate()train_data.dropna(inplace=True)

(7)填充KNN数据

填充近邻的数据,先利用knn计算临近的k个数据,然后填充他们的均值。(安装fancyimpute)除了knn填充,fancyimpute还提供了其他填充方法。

from fancyimpute import KNNtrain_data_x = pd.DataFrame(KNN(k=6).fit_transform(train_data_x), columns=features)

(8)填充模型预测的值

把缺失值作为新的label,建立模型得到预测值,然后进行填充。这里选择某个缺失值数量适当的特征采用随机森林RF进行拟合,其他缺失特征采用均值进行填充。

new_label = 'SNP46'
new_features = []
for f in features:if f != new_label:new_features.append(f)new_train_x = train_data[train_data[new_label].isnull()==False][new_features]
new_train_x.fillna(new_train_x.mean(), inplace=True) # 其他列填充均值
new_train_y = train_data[train_data[new_label].isnull()==False][new_label]new_predict_x = train_data[train_data[new_label].isnull()==True][new_features]
new_predict_x.fillna(new_predict_x.mean(), inplace=True) # 其他列填充均值
new_predict_y = train_data[train_data[new_label].isnull()==True][new_label]rfr = RandomForestRegressor(random_state=666, n_estimators=10, n_jobs=-1)
rfr.fit(new_train_x, new_train_y)
new_predict_y = rfr.predict(new_predict_x)new_predict_y = pd.DataFrame(new_predict_y, columns=[new_label], index=new_predict_x.index)
new_predict_y = pd.concat([new_predict_x, new_predict_y], axis=1)
new_train_y = pd.concat([new_train_x, new_train_y], axis=1)
new_train_data = pd.concat([new_predict_y,new_train_y]) train_data_x = new_train_data[features]
train_data_y = train_data['label']

3. 实验对比

(1)评测指标

选取F1 score进行评测。

def countF1(train, predict):count = 0 # 统计预测的正确的正样本数for i in range(len(train)):if predict[i] == 1 and train[i] == 1:count += 1pre =  count * 1.0 / sum(predict) # 准确率recall =  count * 1.0 / sum(train) # 召回率return 2 * pre * recall / (pre + recall)

(2)对比结果

填充方式 训练集_F1 测试集_F1
默认值0 0.70516717 0.59689922
均值(mean) 0.70186335 0.67768595
中位数(median) 0.70826833 0.67479675
众数(mode) 0.70479134 0.68852459
上一个数据(pad) 0.70409712 0.62711864
下一个数据(bfill) 0.66981132 0.60169492
插值 0.69018405 0.61333333
KNN_3 0.71076923 0.66393443
KNN_6 0.70897833 0.68852459
KNN_10 0.70479134 0.68032787
随机森林_feature3 0.571428571 0.4
随机森林_feature46 0.585139319 0.41509434

(3)实验小结

对于缺失值的处理,除了直接删除缺失严重的特征外,还可以选择各种各样的填充方法。对于每一种填充方式而言,都有其适用的场景,没有绝对的好坏之分,因此在做数据预处理时,要多尝试几种填充方法,选择表现最佳的即可。

本文完整代码已上传至git(https://github.com/AHNU/fill_missing_values)

参考文献

1. 训练模型填充空值(fill null)的几种方法

2. https://www.kaggle.com/pmarcelino/comprehensive-data-exploration-with-python

缺失值填充的几种方法相关推荐

  1. 数据分析--缺失值填充的几种方法

    常见的缺失值填充方法有填充默认值.均值.众数.KNN填充.以及把缺失值作为新的label通过模型来预测等方式,为了介绍这几种填充方法的使用以及填充效果,本文将在真实数据集上进行简单比较. 1 数据集介 ...

  2. python填充空值_python缺失值填充的几种方法

    常见的数据缺失填充方式分为很多种,比如删除法.均值法.回归法.KNN.MICE.EM等等.R语言包中在此方面比较全面,python稍差. python目前已有的两种常见的包,第一个是impyute,第 ...

  3. ML之FE:特征工程中数据缺失值填充的简介、方法、全部代码实现之详细攻略

    ML之FE:特征工程中数据缺失值填充的简介.方法.全部代码实现之详细攻略 目录 特征工程中数据缺失值填充的简介.方法.经典案例

  4. 计算机被填充背景花束纹理在那,为艺术字设置纹理填充的两种方法

    Word2007系统中的纹理效果同样可以应用于艺术字的填充.文字表面添加纹理填充使文字看起来富于质感和立体感,word文档自带的已经有很多可供选择的漂亮纹理,用户在使用中根据其展示效果选择需要的纹理填 ...

  5. 面经|缺失值填补的7种方法(使用场景+Python代码)

    新专栏<数据挖掘(分析)面经> 第一篇:缺失值处理方法 对于从事数据相关工作的小伙伴,面试的时候经常会被问到如何进行缺失值/异常值的处理,本文来梳理一下填补缺失值的7种方法. 示例数据 本 ...

  6. 计算机图案填充的两种方法,计算机图形学课件 第9讲 区域填充和字符处理.ppt...

    计算机图形学课件 第9讲 区域填充和字符处理 信息科学与工程学院 1999年7月 5.4.1 多边形的扫描转换 多边形的两种表示方法: 顶点表示:用多边形的顶点序列来刻划多边形.直观.几何意义强.占内 ...

  7. Python基础----字符串填充的几种方法

    背景介绍 在有些时候,我们需要固定长度的字符串作为某些后续步骤的输入,但是手头的字符串很可能是变长的,因此在这种情况下,我们就需要使用某些方法对字符串进行填充,使其长度符合要求.下面介绍几种在pyth ...

  8. 可以操作excel吗_Excel快速填充,这四种方法你会吗?操作逆天告别加班

    在Excel的表格制作中,仅仅会复制粘贴可是不够的,还需要掌握更多的技能,来提升我们的工作效率! 我们在进行Excel报表制作的时候,如果要批量填充序号,有多少种方法呢?下面给大家简单介绍一下这四种方 ...

  9. python 标签_Python DataFrame中 打标签/归类 的6种方法

    1. 单字段打是否标签----Numpy.where 公式:Numpy.where(判断条件,条件为真时的值,条件为假时的值) 例子:我需要新增一列目标变量,逾期30天以上的定义为坏客户,标签为1,否 ...

  10. 机器学习中处理缺失值的7种方法

    机器学习中处理缺失值的7种方法 转载 |  https://cloud.tencent.com/developer/article/1680427 作者 | Satyam Kumar 编译 | VK ...

最新文章

  1. mysql事务的4大特性
  2. 网页截图工具CutyCapt
  3. SpaceX再送4人上太空,马斯克保证这次飞船厕所不会漏了
  4. Redux源码浅析系列(二):`combineReducer`
  5. 为什么单模光端机价格比多模光端机价格高
  6. android UI进阶之布局的优化
  7. 尝试搭建Apache+Tomcat负载均衡
  8. 汇编学习 step by step
  9. 华为悦盒6108V9-V9U-V9_PUB-6108V9C-非高安版-通刷精简固件及教程
  10. 如何根据图片找到图中的地点
  11. 内存带宽测试工具 mbw
  12. 【Sass/SCSS】我花4小时整理了的Sass的函数
  13. 不得不知的101种心理防御机制,识别并超越它们
  14. 30分钟教你写出10分的淘宝标题
  15. 禾赛科技“梦碎”科创板:营收递增、由盈转亏,在专利官司中败退
  16. SOUKE组合营销软件v9.1官方版
  17. 修复录音笔或其它录音设备损坏的WAV/MP3录音文件或0kb字节文件
  18. python 视频下载神器(you-get)
  19. 12.9 Daily Scrum
  20. 桐桐的计算(第三章第1课)

热门文章

  1. Python攻城师的成长——ORM(choices字段)、AJAX
  2. PHP 计算当前时间是这一年的第几周
  3. U3D教程宝典之两步实现超实用的XML存档
  4. lisp 圆柱螺旋线_AutoCAD.Lisp等距3D螺旋线
  5. SpringBoot项目怎么重命名
  6. c语言编写fac函数 计算阶乘,编写一个计算阶乘的函数fac
  7. 闲鱼怎么用快手做引流,快手怎么找痛点引流
  8. 交换机putty怎么调试_debian10使用putty配置交换机console口
  9. PIL(pillow)读取图片自动旋转的问题
  10. 大数据分析引擎-Doris简要介绍