缺失值处理

data foundation 实训记录
https://work.datafountain.cn/forum?id=578&type=1&source=2

import pandas as pd
##读取原始数据
data = pd.read_csv('./datasets/loan.csv')    # 读取数据
data1 = data.sample(int(data.shape[0]*0.01)) # Kagging test 随机取出data里的数据
data1.head(10)   # 查看部分数据

在这里插入图片描述

##查看数据缺失情况
nulldf=data.isnull()
data_miss=data.isnull().sum().sort_values(ascending=False).reset_index()#sort_values(ascending是否按指定列的数组升序排列,默认为True,即升序排列,此处为降序)
data_miss.columns=['feature','miss_value']
data_miss['miss_percent']=data_miss['miss_value']/data.shape[0]#1、缺失值比例2、使用shape[0]读取矩阵第一维度的长度
data_miss.head(10)
print("原始数据集144列特征中:\n" )
print("有%d列特征含有缺失值" % data_miss[data_miss['miss_value'] > 0].shape[0])
print("有%d列的特征缺失值比例在30%%以上" % data_miss[data_miss['miss_percent'] > 0.3].shape[0])

在这里插入图片描述

原始数据集144列特征中:112列特征含有缺失值
有58列的特征缺失值比例在30%以上
##对于缺失值过多的特征直接删除
thr = (1 - 0.3) * data.shape[0]  # 可以根据实际情况设定不同阈值, 此处设为30%, 则非缺失值的数量大于70%
data = data.dropna(thresh=thr, axis=1) #1、若某一列数据缺失的数量超过阀值就会被删除 2、thresh:非空元素最低数量。int型,默认为None。如果该行/列中,非空元素数量小于这个值,就删除该行/#print("去除掉缺失值占比大于0.3的特征之后,当前还剩%d列特征" %(data.shape[1]))

### 缺失特征过多的样本可以考虑直接整行删除
data['row_missing'] = data.apply(lambda x: x.isnull().sum(), axis=1).to_frame()   # 400000万条样本,计算每条样本的缺失值列数
print(data['row_missing'])
print(data['row_missing'].value_counts())    # 观察所有样本行的缺失值情况
##1、lambda x:x。isnull().sum() 对每行求空值的列数量
##2、将函数应用到由各列或行形成的一维数组上,由apply实现
##3、to.frame --Convert Series to DataFrame.

data = data[data['row_missing'] < 35]       # 删掉缺失值大于等于35列的样本,总计4241条,约占1%
data.drop(['row_missing'], axis=1, inplace=True)    # 删掉刚刚加入原始数据集的统计列
print("去除掉缺失特征大于35列的样本之后,当前还剩%d行数据" % data.shape[0])

在这里插入图片描述
在这里插入图片描述

去除掉缺失特征大于35列的样本之后,当前还剩395625行数据

固定值填充

### 特征emp_length中的缺失值n\a->UnKnown可以尝试用特殊字符表示,代表独立的一类特征值。
print("原始数据集的emp_length特征取值情况:\n", data['emp_length'].value_counts())
data.loc[data['emp_length']=='n/a', 'emp_length'] = 'Unknown'    # 将emp_length特征列中的缺失值替换为特殊字符'Unknown'
print("\n使用固定值填充后emp_length特征取值情况:\n", data['emp_length'].value_counts())

统计值填充

### dti属性是数值特征,可以使用均值或中位数进行填充
print("dti特征列有%d个缺失值\n" % data['dti'].isnull().sum())
print("dti特征列的统计信息:\n", data['dti'].describe())
data['dti'].fillna(data['dti'].median(), inplace=True)    # 这里采用中位数填充
print("\n填充中位数后dti特征列的统计信息:\n", data['dti'].describe())
print("\n此时dti特征列有%d个缺失值\n" % data['dti'].isnull().sum())

建模填充
用其他无缺失值的原特征作为新特征去预测缺失值

### 以revol_util(信用账户的使用率)特征为例,导入sklearn的随机森林算法预测缺失值
from sklearn.ensemble import RandomForestRegressor    

rfDf = data.copy()
# 用revol_util特征值非空的样本构建训练集,revol_util特征值缺失的样本构建测试集
rfDf_train = rfDf.loc[rfDf['revol_util'].notnull()]
rfDf_test = rfDf.loc[rfDf['revol_util'].isnull()]
col = ['loan_amnt', 'int_rate', 'installment', 'revol_bal', 'collection_recovery_fee']    # 原始数据集中的无缺失数值特征
# 划分训练数据和标签(label)
X = rfDf_train[col]
y = rfDf_train['revol_util']
# 训练过程
rf = RandomForestRegressor(n_estimators=100,n_jobs=-1)    # 这里重在理解过程,因此仅简单选取部分参数
rf.fit(X, y)
# 预测过程
pred = rf.predict(rfDf_test[col])
rfDf.loc[(rfDf['revol_util'].isnull()), 'revol_util'] = pred    # 填补缺失值
print("此时的revol_util特征统计指标:\n")
print(rfDf['revol_util'].describe()) 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值