缺失值处理

处理思路

在数据预处理过程中,难免会有数据的确实情况,无论是自己爬虫获取的还是从公开数据源上获取的数据集,都不能保证数据集是完全准确的,难免会有一些缺失值。而以这样数据集为基础进行建模或者数据分析时,缺失值会对结果产生一定的影响,所以提前处理缺失值是十分必要的。

常用的处理思路主要有:

  1. 填充处理:数值变量、类别变量、时间序列
  2. 删除处理:按行删除、按列删除
  3. 不做处理

一、填充处理

常用的填充方法有:

  • 统计量填充:如均值、中位数、众数、最值等
  • KNN填充
  • 预测填充

pandas中用于填充缺失值的方法:
df.fillna()参数解释:
在这里插入图片描述

对于数值型变量

1 统计量填充:

**均值填充:**
缺点:容易受到异常值的影响
df[col].fillna(value=df[col].mean(),inplace=True)

**中位数填充**
df[col].fillna(value=df[col].median(),inplace=True)

**众数填充**
缺点:众数结果可能有多个,需要取第一个df.mode(numeric_only=False)[0]
df[col].fillna(value=df[col].mode()[0],inplace=True)

**最大值填充**
df[col].fillna(value=df[col].max(),inplace=True)

**最小值填充**
```python
df[col].fillna(value=df[col].min(),inplace=True)

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

缺点:基于欧式距离找找最相邻的K个点的均值做填充,不能填充类别变量,并且进入KNN模型的数据也不能有非数值变量。

import pandas as pd
import numpy as np
from fancyimpute import KNN
data = pd.DataFrame([[3, 2, 4, 0],
                    [3, np.nan, 3, 1],
                    [5, np.nan, np.nan, 1],
                    [5, 5, 3, 4]],
                   columns=list('ABCD'))
print(data)
# fancyimpute填补缺失值时会自动删除列
data = pd.DataFrame(KNN(k=6).fit_transform(data),columns=data.columns)print(data)

3 预测填充

from sklearn.ensemble import RandomForestRegressor

def set_missing_ages(df):
	#把数值型特征都放到随机森林里面去,除了Age其他四个特征均无缺失值
    age_df=df[['Age','Fare','Parch','SibSp','Pclass']]
    known_age = age_df[age_df.Age.notnull()].as_matrix()
    unknown_age = age_df[age_df.Age.isnull()].as_matrix()
    y=known_age[:,0]#y是年龄,第一列数据
    x=known_age[:,1:]#x是特征属性值,后面几列
    rfr=RandomForestRegressor(random_state=0,n_estimators=2000,n_jobs=-1)
    #根据已有数据去拟合随机森林模型
    rfr.fit(x,y)
    #预测缺失值
    predictedAges = rfr.predict(unknown_age[:,1:])
    #填补缺失值
    df.loc[(df.Age.isnull()),'Age'] = predictedAges
    
    return df,rfr
对于类别型变量

1 出现频率最高的变量填充(相当于众数)

data["D"] = data["D"].fillna(data["D"].value_counts().index[0])

2 将缺失作为一个特定的类别
把缺失当作一种特定的状态,
比如对于账户信息的收集,其中有些是选填项,这些特征肯定会存在缺失,我们可以把它当作一个”保密“的类别。

3 预测填充

对于时间序列

由于时间序列的特殊性,相邻的点相关性比较大。所以,对于时间序列的缺失值的处理方式会与数值型缺失值处理方式不同,往往会用相邻的点填充。
前一个值填充

df["col"] = df["col"].fillna(df["col"].fillna(method='ffill'))

后一个值填充

df["col"] = df["col"].fillna(df["col"].fillna(method='bfill'))

线性插值

df["col"] = df["col"].fillna(df["col"].interpolate())

二、删除处理

按列删除

某一列缺失数据较多,比如缺失率高达80%以上时,往往会删除整列特征

按行删除

对于重要的唯一标识ID特征存在缺失,比如我的建模目标是预测每个用户的消费能力。每个用户ID唯一标识一个特定的用户,若用户ID存在缺失直接删除缺失所在行。

三、不处理

其实对于树模型来说是支持缺失值的,但是建模效果可能会差于处理后建模。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

现实、狠残酷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值