基于缺失值与异常值的分析对Lending Club数据进行预处理(有源码和数据)

任务描述:数据是机器学习的源头和根基,将高质量的数据进行特征提取输入机器学习模型中,更容易得到令人满意的结果。然而,现实世界中数据总会由于各种原因导致大体上都是不完整,不一致的脏数据,无法直接进行数据挖掘,或挖掘结果差强人意。为了提高数据挖掘的质量产生了数据预处理技术。其中,缺失值与异常值是需要重点处理的两个问题。

本文源代码和数据到github下载github地址



一、数据

在这里插入图片描述

1数据缺失原因

造成缺失的原因由于数据采集设备、传输线路故障等机械原因或者记录失误等人为原因,数据缺失通常难以避免。造成缺失值的原因通常有以下几种:

  1. 数据暂时无法获取
  2. 数据在采集过程中被遗漏或丢弃
    • 某些对象的部分特征值不存在
    • 获取数据较为困难

2数据处理方法

缺失的一般处理方法缺失值过多将严重影响预测结果的精度,出现偏差甚至错误,因此有必要在前期对缺失值进行处理,通常采用的处理方法有:

  1. 直接删除:当少数样本存在多列特征缺失时,可以将这些样本整行删除;当某列特征大部分缺失时,可将这列属性整列删除。
  2. 数据填补:可根据原始数据集中其他样本的取值分布情况进行缺失值填充,通常有以下几类方法:
  3. 固定值填充:若缺失值本身含有一定的信息,则可将缺失值作为一种特征值进行标记,比如0或一些特殊字符。
  4. 统计值填充:将数据集中的特征分为数值特征和类别特征,数值特征可以采用其他样本的均值或中位数进行填充;类别特征可采用众数进行填充。
  5. 热卡填充:也称就近补齐,找到最相似的样本的特征值进行填充。
  6. 建模填充:利用机器学习算法对缺失值进行预估,例如KNN、线性回归、随机森林等。

不处理:有些算法具备处理缺失值的能力,例如XGBoost、LightGBM、贝叶斯网络、人工神经网络等,此时可不处理缺失值。

3.数据准备

原始数据数据准备下面我们采用Lending Club贷款数据集进行举例说明缺失值处理的过程。

数据来源背景Lending Club 创立于2006年,主营业务是为市场提供P2P贷款的平台中介服务,公司总部位于旧金山。因此合理地对用户进行信用等级划分对贷款业务有着至关重要的意义。
主要字段说明

二、缺失值处理

1.读取数据并查看

import numpy as np    # Python中进行数值计算的库
import pandas as pd    # Python中进行数据处理的库
import warnings
warnings.filterwarnings('ignore') #  忽略弹出的warnings

data = pd.read_csv('Lending_Club.csv',encoding="ISO-8859-1")#这里注意,一定要把encoding设置为ISO-8859-1
data.shape #查看数据量大小

(130772, 145)

#查看部分数据
data.head(4)#可以看出有很多确实值

在这里插入图片描述

2.查看缺失值情况

### 查看数据集缺失情况
missingDf = data.isnull().sum().sort_values(ascending=False).reset_index()#常用的数据缺失值查看方法,ascending=False是降序排列
missingDf.columns = ['feature', 'miss_num']    
missingDf['miss_percentage'] = missingDf['miss_num'] / data.shape[0]    # 缺失值比例
missingDf.head(10)    # 缺失值最多的前十列特征

在这里插入图片描述

print("原始数据集144列特征中:\n" )
print("有%d列特征含有缺失值" % missingDf[missingDf['miss_num'] > 0].shape[0])
print("有%d列的特征缺失值比例在30%%以上" % missingDf[missingDf['miss_percentage'] > 0.3].shape[0])

原始数据集144列特征中:

有60列特征含有缺失值
有43列的特征缺失值比例在30%以上

3.缺失值处理

3.1直接删除

thr = (1 - 0.3) * data.shape[0]  # 可以根据实际情况设定不同阈值, 此处设为30%, 则非缺失值的数量大于70%
data = data.dropna(thresh=thr, axis=1)     #若某一列数据缺失的数量超过阀值就会被删除
print("去除掉缺失值占比大于0.3的特征之后,当前还剩%d列特征" %(data.shape[1]))

去除掉缺失值占比大于0.3的特征之后,当前还剩102列特征

### 缺失特征过多的样本可以考虑直接整行删除
data['row_missing'] = data.apply(lambda x: x.isnull().sum(), axis=1).to_frame()     # 计算每条样本的缺失值列数
print(data['row_missing'].value_counts())    # 观察所有样本行的缺失值情况

在这里插入图片描述
缺失列数在8列以上的样本有114条,缺失值较多且样本数较少,因此可以考虑将这些样本直接删除。

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

3.2使用固定值填充缺失值

数值特征通常采用其他样本的均值或中位数进行填充。以dti为例,它代表贷款人每月还款占其收入的比例(去掉百分号后的值),观察其统计信息。可知该列最大值为999.000000,很明显这是一个极大的异常值,如果对该列采用均值进行填充,会受到极端值的影响,故此处选用中位数进行填充。当然,这种简单的方法还有提升的空间,例如像dti这种特征可以结合贷款人的收入水平(annual_inc)进行先分组后填充。

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

在这里插入图片描述

3.3建模预测缺失值并填充

这种方法我们平时使用的并不多,这里介绍一下,意思就是使用不含缺失值的样本去预测部分样本中的缺失值,然后直接将预测的结果去填充缺失值。

### 以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()) 

在这里插入图片描述

三、异常值处理

1.异常值判断方法

异常值的分析判别方法主要有以下几种:

  1. 简单统计分析 对特征进行描述性的统计分析,观察是否有不合理的特征值。
  2. 3σσσ原则 如图所示,如果数据服从正态分布,则与均值μμμ的差超过三倍标准差σσσ的特征值,可以视作异常值;
    若数据不服从正态分布,亦可通过远离平均距离若干倍的标准差来判定,倍数的取值根据经验和实际情况确定。
    在这里插入图片描述
  3. 箱型图 如图所示,箱型图用到统计学中的四分位间距(IQR)概念,IQR是第三四分位数(Q3)与第一四分位数(Q1)的差值,即IQR =
    Q3 - Q1。 从而,低于箱型图下须(Q1-1.5IQR)或高于箱型图上须(Q3+1.5IQR)的观测值被定义为异常值。
    在这里插入图片描述
  4. 建模法 可以采用线性回归(基于偏差)、聚类算法(基于密度)、KNN(基于距离)等机器学习算法进行异常值的判别。

2.异常值处理方法

异常值的处理异常值通常需要进行处理,否则在某些场景中会导致预测结果受到负面影响。处理方法通常有以下几种:

  1. 直接删除异常样本:当异常值数量不多且易于判断时,可以直接删除。 用均值替代异常样本
  2. 视为缺失值:某些情况下,可以将异常值当成缺失值处理,利用缺失值的填充方法处理异常。

对异常值的不同处理方法,下面我们采用Lending Club贷款数据集中的数据进行举例说明。

3.异常值处理

3.1异常值处理1–简单统计分析 & 删除异常值

Lending Club贷款数据集中的revol_util特征为例,它表示信用账户的使用率(去掉百分号),因此容易理解这列特征的值不应超过100。观察到异常样本有1300条,占总样本的比例很小,可以将这些样本直接删除。

print("revol_util特征列的异常样本数为: ", data[data['revol_util'] > 1].shape[0]) #数据使用的是小数,所以大于1的就是异常数据
data.drop(data[data['revol_util'] > 1].index, inplace = True)    # 根据索引删除样本

3.2异常值处理2–3σ原则 & 均值替代异常样本

以dti特征为例,它表示贷款人每月还款占其收入的比例(去掉百分号后的值),容易理解这列特征的值不应超过100,将超过100的值视为无意义的异常值

import seaborn as sns
import matplotlib.pyplot as plt    # 可视化
# 在Jupyter notebook里嵌入图片
%matplotlib inline

ax = sns.distplot(data['dti'],kde=True,hist=False)
plt.show()

在这里插入图片描述

# 去掉高于100的部分再次观察
norDf = data[data['dti'] <= 100.0]
sns.distplot(norDf['dti'],kde=True,hist=False)
plt.show()

在这里插入图片描述

3.3异常值处理3–箱型图 & 视为缺失值

以annual_inc为例,它表示贷款人的年收入。

# 绘制箱型图分析
bp_list = list(data['annual_inc'])

plt.figure(figsize=(20,4)) # 建立图像
plt.boxplot(bp_list, vert=False, flierprops = {"marker":"o","markerfacecolor":"steelblue"})
plt.show() # 展示箱型图

在这里插入图片描述

# 箱型图的边界
q1 = data['annual_inc'].describe()['25%']
q3 = data['annual_inc'].describe()['75%']
iqr = q3 - q1
print("箱型图上须:", q3 + 1.5*iqr)
print("箱型图下须:", q1 - 1.5*iqr)

在这里插入图片描述
由上述可见大多数贷款人的年收入都在150万以下,与Lending Club的主业中小额贷款也较为相符,可以将箱型图中的大于150万的异常值进行一定的处理。这里将其视为缺失值,采用固定值进行替代,统一定为150万。

data.loc[data['annual_inc'] > 1500000.0, 'annual_inc'] = 1500000.0    # 固定值替代
print("此时annual_inc特征列还有%d个大于150万的特征值" % (data[data['annual_inc'] > 1500000.0]).shape[0])

四、总结

本章节主要介绍了数据预处理中常见的两种问题–缺失值和异常值。我们利用Lending Club贷款数据集进行了两种问题的分析,并对两种问题提出了相对应的解决方法。其中对于缺失值,我们注意介绍了采用直接删除,数据填补和不处理三种方法进行处理。而异常值的处理我们注意介绍了:直接删除异常样本,用均值替代异常样本,视为缺失值这三种解决方法。

记录时间:2020年11月28日

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lending Club是一个在线借贷平台,允许个人和企业通过网上借贷市场借款和投资。Lending Club数据分析可以提供有关借款人和借款的有价值的见解,这对于借贷机构、投资者和借款人都非常重要。以下是Lending Club数据分析的一些研究意义: 1. 风险分析Lending Club数据可以用来分析借款人的信用风险,这对于借贷机构和投资者来说非常重要。通过分析借款人的历史借贷和还款记录、收入、就业情况等因素,可以预测借款人未来的偿还能力和信用状况。 2. 利率分析Lending Club数据可以用来分析借款人的贷款利率,这对于借贷机构和投资者来说非常重要。通过分析借款人的信用得分、就业情况、收入等因素,可以预测借款人未来的偿还能力和信用状况,从而确定正确的贷款利率。 3. 信用评估:Lending Club数据可以用来分析借款人的信用评估,这对于借贷机构和投资者来说非常重要。通过分析借款人的信用得分、就业情况、收入等因素,可以评估借款人的信用状况,从而确定是否给予贷款。 4. 投资分析Lending Club数据可以用来分析投资者在平台上的投资情况,这对于投资者来说非常重要。通过分析投资者的投资组合、收益等因素,可以帮助投资者优化其投资策略,从而获得更高的收益。 总之,Lending Club数据分析对于借贷机构、投资者和借款人都非常重要,可以帮助他们更好地理解借贷市场的情况,从而做出更明智的决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值