特征工程中缺失值处理

缺失值处理

信息系统往往是不完备的,经常会有数据缺失。产生数据缺失一般有两种原因,第一种是有些信息暂时无法获取,例如一个单身人士的配偶或者一个儿童的收入等;第二种是有些信息被遗漏或者错误的被处理了。

数据缺失是不可避免的,我们经常要做缺失数据的处理,处理缺失数据通常有三种方法:
1、第一种是不处理,例如单身人士的配偶,不存在是很正常的。
2、第二种是删除缺失值所对应的行,这种方法在样本数据较少时,谨慎使用。
3、第三种是数据补齐,使用规则或模型,对缺失的数据进行补齐。

下面使用代码一一实现这三种方法:
示例数据:
在这里插入图片描述
数据中“年龄”和“工资”两列分别有一个缺失值。

删除缺失值所在的行:

操作非常简单,直接使用DataFrame模块中的dropna函数即可。

import pandas as pd 
data = pd.read_csv(
    '../form/缺失值.csv')
#直接删除缺失值
dropNaData = data.dropna()

执行代码,可以得到删除后的数据:
在这里插入图片描述

均值/众数/中值填充

在sklearn模块中,使用Imputer函数对数据中的缺失值进行填充。

sklearn.preprocessing.Imputer(strategy = ‘mean’)

参数说明
strategy数据填充方式,默认使用均值填充,可选:median和most_frequent
from sklearn.impute import SimpleImputer
#使用均值填充缺失值
simpleImputer = SimpleImputer(strategy = 'mean')
data['年龄_imputer'] = simpleImputer.fit_transform(data[['年龄']])
data['工资_imputer'] = simpleImputer.fit_transform(data[['工资']])     

执行代码,可以得到填充后的数据:
在这里插入图片描述

模型填充

训练模型使用有监督的方式填充缺失值

步骤:
1、确定要填充哪列的缺失值

2、把要处理的列作为目标列,其他列作为特征列。清除特征列中的缺失值

3、把目标列中的缺失值过滤出来,作为预测数据,其他数据作为训练数据进行建模

4、对训练数据进行特征处理

5、训练模型,对缺失值进行预测

下面按照步骤对年龄进行填充。

#先处理年龄的缺失值
data_predict_年龄 = data.dropna(subset = ['工资'])
#找出剩下数据中,年龄缺失值所在位置
NA_index = data_predict_年龄.年龄.isna()
#获取训练数据和预测数据
data_predict_年龄_fit = data_predict_年龄[~NA_index]
data_predict_年龄_predict = data_predict_年龄[NA_index]

开始进行线性回归建模

from sklearn.preprocessing import OneHotEncoder 
#对训练数据进行特征处理
oneHotEncoder = OneHotEncoder()
oneHotData_fit = oneHotEncoder.fit_transform(
    data_predict_年龄_fit[['国家','购买']])

将独热编码所得的数据和工资数据进行合并
独热编码

from scipy.sparse import hstack
x_fit = hstack([
    oneHotData_fit,
    data_predict_年龄_fit.工资.values.reshape(-1,1)])
y_fit = data_predict_年龄_fit['年龄']

训练线性回归模型,对缺失值进行预测

from sklearn.linear_model import LinearRegression
linearRegression = LinearRegression()
linearRegression.fit(x_fit,y_fit)
#处理要预测的数据的特征
oneHotData_predict = oneHotEncoder.transform(
    data_predict_年龄_predict[['国家','购买']])

x_predict = hstack([
    oneHotData_predict,
    data_predict_年龄_predict.工资.values.reshape(-1,1)
])
#预测缺失值
linearRegression.predict(x_predict)

执行代码,可以看到,通过模型预测的年龄缺失值为31.65,而通过均值填充的年龄缺失值为38.78,很明显模型预测的年龄缺失值更加合理,但是工作量比较大。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值