社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

机器学习基础:缺失值的处理技巧(附Python代码)

小白学视觉 • 3 年前 • 446 次点击  

点击上方小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

在数据分析和建模中,经常会遇到变量值缺失的情况,这是非常常见的。为了保证数据指标的完整性以及可利用性,通常我们会采取特殊的方式对其进行处理。

1、缺失查看

首先,需要查看缺失值的缺失数量以及比例(#数据使用的kaggle平台上预测房价的数据)

import pandas as pd
# 统计缺失值数量missing=data.isnull().sum().reset_index().rename(columns={0:'missNum'})# 计算缺失比例missing['missRate']=missing['missNum']/data.shape[0]# 按照缺失率排序显示miss_analy=missing[missing.missRate>0].sort_values(by='missRate',ascending=False)# miss_analy 存储的是每个变量缺失情况的数据框

柱形图可视化

import matplotlib.pyplot as pltimport pylab as pl
fig = plt.figure(figsize=(18,6))plt.bar(np.arange(miss_analy.shape[0]), list(miss_analy.missRate.values), align = 'center',color=['red','green','yellow','steelblue'])
plt.title('Histogram of missing value of variables')plt.xlabel('variables names')plt.ylabel('missing rate')# 添加x轴标签,并旋转90度plt.xticks(np.arange(miss_analy.shape[0]),list(miss_analy['index']))pl.xticks(rotation=90)# 添加数值显示for x,y in enumerate(list(miss_analy.missRate.values)): plt.text(x,y+0.12,'{:.2%}'.format(y),ha='center',rotation=90) plt.ylim([0,1.2])
plt.show()

这样的统计计算以及可视化基本已经看出哪些变量缺失,以及缺失比例情况,对数据即有个缺失概况。下面将对缺失变量进行相应处理。

2、缺失处理

方式1:删除

直接去除含有缺失值的记录,这种处理方式是简单粗暴的,适用于数据量较大(记录较多)且缺失比较较小的情形,去掉后对总体影响不大。一般不建议这样做,因为很可能会造成数据丢失、数据偏移。

func: df.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
# 1、删除‘age’列df.drop('age', axis=1, inplace=True)
# 2、删除数据表中含有空值的行df.dropna()
# 3、丢弃某几列有缺失值的行df.dropna(axis=0, subset=['a','b'], inplace=True)

直接去除缺失变量,基于第一步我们已经知道每个变量的缺失比例,如果一个变量的缺失比例过高,基本也就失去了预测意义,这样的变量我们可以尝试把它直接去掉。

# 去掉缺失比例大于80%以上的变量data=data.dropna(thresh=len(data)*0.2, axis=1)

方式2:常量填充

在进行缺失值填充之前,我们要先对缺失的变量进行业务上的了解,即变量的含义、获取方式、计算逻辑,以便知道该变量为什么会出现缺失值、缺失值代表什么含义。比如,‘age’ 年龄缺失,每个人均有年龄,缺失应该为随机的缺失,‘loanNum’贷款笔数,缺失可能代表无贷款,是有实在意义的缺失。

全局常量填充:可以用0,均值、中位数、众数等填充。

平均值适用于近似正态分布数据,观测值较为均匀散布均值周围;中位数适用于偏态分布或者有离群点数据,中位数是更好地代表数据中心趋势;众数一般用于类别变量,无大小、先后顺序之分。

# 均值填充data['col'] = data['col'].fillna(data['col'].means())# 中位数填充data['col'] = data['col'].fillna(data['col'].median())# 众数填充data['col'] = data['col'].fillna(stats.mode(data['col'])[0][0])

也可以借助Imputer类处理缺失:

from sklearn.preprocessing import Imputerimr = Imputer(missing_values='NaN', strategy='mean', axis=0)imputed_data =pd.DataFrame(imr.fit_transform(df.values),columns=df.columns)imputed_data

方式3:插值填充

采用某种插入模式进行填充,比如取缺失值前后值的均值进行填充:

#  interpolate()插值法,缺失值前后数值的均值,但是若缺失值前后也存在缺失,则不进行计算插补。df['a'] = df['a'].interpolate()
# 用前面的值替换, 当第一行有缺失值时,该行利用向前替换无值可取,仍缺失df.fillna(method='pad')
# 用后面的值替换,当最后一行有缺失值时,该行利用向后替换无值可取,仍缺失df.fillna(method='backfill')#用后面的值替换

方式4:KNN填充

利用knn算法填充,其实是把目标列当做目标标量,利用非缺失的数据进行knn算法拟合,最后对目标列缺失进行预测。(对于连续特征一般是加权平均,对于离散特征一般是加权投票)

fancyimpute 类

from fancyimpute import KNNfill_knn = KNN(k=3).fit_transform(data)data = pd.DataFrame(fill_knn)

sklearn类

from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True): # params: x_train 为目标列不含缺失值的数据(不包括目标列) # params: y_train 为不含缺失值的目标列 # params: test 为目标列为缺失值的数据(不包括目标列) if dispersed: knn= KNeighborsClassifier(n_neighbors = k, weights = "distance") else: knn= KNeighborsRegressor(n_neighbors = k, weights = "distance")
knn.fit(x_train, y_train) return test.index, knn.predict(test)

方式5:随机森林填充

随机森林算法填充的思想和knn填充是类似的,即利用已有数据拟合模型,对缺失变量进行预测。

from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier
def knn_filled_func(x_train, y_train, test, k = 3, dispersed = True): # params: x_train 为目标列不含缺失值的数据(不包括目标列) # params: y_train 为不含缺失值的目标列 # params: test 为目标列为缺失值的数据(不包括目标列) if dispersed: rf= RandomForestRegressor() else: rf= RandomForestClassifier()
rf.fit(x_train, y_train) return test.index, rf.predict(test)

3、缺失衍生

有时候,可以根据某个字段是否缺失,进行新变量的衍生,比如,"信用卡数量",若该字段缺失,代表'无信用卡',则可以根据"信用卡数量"是否缺失衍生'有无信用卡'字段,这种衍生很可能是很有效果的。

4、总结

总之,处理缺失值是需要研究数据规律与缺失情况来进行处理的,复杂的算法不一定有好的效果,因此,还要具体问题具体分析,尤其是要搞明白字段含义以及缺失意义,这往往容易被忽略。个人经验,数据处理需要去探索,没有一成不变的万全之策。

作者:星星之火

https://zhuanlan.zhihu.com/p/98007066

END

好消息!

小白学视觉知识星球

开始面向外开放啦👇👇👇




下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲
小白学视觉公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲
小白学视觉公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群


欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/146462
 
446 次点击