关于Pima数据集研究(2)--DC(数据清洗)篇

关于Pima数据集研究共分为4个篇幅来进行研究:

《关于Pima数据集研究(1)--EDA(探索性数据分析)篇》

《关于Pima数据集研究(2)--DC(数据清洗)篇》

《关于Pima数据集研究(3)--FE(特征工程)篇》

《关于Pima数据集研究(4)--Model(模型搭建与预测)篇》

一、前情提要

    该数据集最初来自美国国立糖尿病与消化与肾脏疾病研究所。数据集的目的是基于数据集中包含的某些诊断指标,诊断性的预测患者是否患有糖尿病。从较大的数据库中选择这些实例受到一些限制。特别是,这里的所有患者均为皮马印第安人血统至少21岁的女性。


二、内容

    本次主要承接之前的《关于Pima数据集研究(上)--EDA篇》做后续探索研究,主要内容是关于Pima数据的EDA结果进行针对性的数据清洗与深入探索。


三、研究方法

    本人是python系,本课题的研究方法与方案均是基于python进行扩展,研究工具包括Anaconda、panda、numpy、sklearn等第三方成熟开源框架。


四、数据清洗(DC)

    根据之前的EDA结果发现,数据集中的数据存在部分问题。如果我们直接将本结果带入到后续的统计分析或模型搭建中,势必会得出不可置信结果。因此需要通过数据清洗方法将数据进行处理,我们先来回顾一下字段中0值的数量:

字段值为0的统计数

    接下来我们根据之前的EDA结果开始进行数据清洗工作。


    Pregnancies(怀孕次数),根据EDA结果,范围应该为0~13。因此将>13的结果进行指标拉回处理,亦将>13的数据赋值为13。下图为该字段清洗前后的分布差异;

数据修正前后差异图

    Glucose(葡萄糖含量),根据EDA结果,其中有5条样本为0(异常值),上限值未发现异常。因此将5条数据修正为IQR下限值37.125,考虑到数据形态分布,此处采取中位数替换形式进行修正,修正前后结果如下:

数据修正前后对比

    接下来我们观察以下该数据的分布情况,如下图所示:

Glucose数据处理前后分布

    BMI(体重指数),根据EDA结果,数据为0的异常样本共11条,上限值暂未发现异常,因此将异常数据通过数据中位数的值进行填充。结果如下表所示:

数据修正前后对比

  接下来我们观察以下该数据的分布情况,如下图所示:

BMI修复前后分布图

    接下开始修正问题数据占比较高的特征。这里我们尝试使用回归分析来进行数据填补('·'谁让我爱折腾呢'·'),不废话,直接上结果。

     BloodPressure(血压),根据EDA结果,存在35条样本的0值。此处采用与之前不同的处理方法来对数据进行处理(回归预测添补法)。这里采用的是LightGBM进行回归预测,先通过数据集切分和特征提取,结果如下图:

BloodPressure预测特征

    在此说明一下为什么只选择了者5个特征:    

1、这5个特征是经过之前的EDA和数据清洗后可用的数据;

2、Outcome为我们的最终预测目标,如果加入进行预测BloodPressure可能会影响到最终的预测结果;

3、除上图5个特征以外的特征还未进行数据清洗,可能会影响到最终的结果;


    接下来简单介绍一下数据预处理与回归预测的方法:

1、选择建模使用特征;

2、通过数据标准化处理数据,将数据拉到相同维度;

3、通过网格搜索进行简单超参选择;

4、搭建回归模型;

5、计算数据误差;

6、通过模型预测结果;

以下为模型计算的RMSE指标:

The rmse of prediction is: 10.460150358058625

    模型预测结果展示:

BloodPressure预测填补结果
BloodPressure修复前后效果对比图

    通过BloodPressure修正分布图来看,发现修正后数据整体分布更加接近正态分布,且将异常数据进行了修正。


     SkinThickness(皮下脂肪厚度,单位mm),根据EDA结果,存在227条样本的0值,占整体近30%的数据。再此

The rmse of prediction is: 4.6980404261770

    此处采用上述相同方法进行预测填补,操作流程和步骤与上一步相同,此处不再废话,直接上结果:

SkinThickness预测填补结果 

    看到上面诡异的预测结果发现数据预测有问题,检查预测之后整体的数据分布,如下图:

预测数据修正前后分布

    通过上图发现,预测填补的数据造成了数据的双峰分布,且主要分布在30的位置。而87的第二波峰由于预测结果导致的。由此发现,虽然模型计算出来的rmse评估相对较低,但是最终填补模型时导致数据形态变化较大。因此放弃预测填补方法,而是采用去0后的中位数进行填补,结果如下:

SkinThickness修正前后对比结果表
中位数修正前后对比结果图

    通过中位数对SkinThickness进行修正后对比其他结果有相对较好的正态分布效果,但由于值的占比过大,因此呈现出较高峰值,因此此方法对数据处理的效果仍然不是太理想,此时我们需要通过其他方式尝试对异常数据填补;

    考虑再三,此时考虑引入之前均未尝试过的方法,也就是随机插补法对数据进行修复。顾名思义,也就是通过从非0数据中随机抽取数据对目标数据进行修复;接下来我们观察一下该方法的数据分为数统计结果,如下表:

SkinThickness非0数据分为数统计

    经过上述统计结果我们发现了一个较为诡异的数据,也就是该特征的max(最大值),之前在进行EDA的时候并未发现该数据异常。但从数据来看,99%的数据值才到53.2,与最大值差距较大。因此需要进行进一步IQR检验来判断改值是不是超出了正常范围内。结果进行计算发现IQR的上限值只有57而已,果然存在部分数据远远超出了IQR范围,此时为了后续数据的分布有效性,在此将该部分数据也同样进行处理;效果如何,如下图所示:

随机插补法修复前后分布效果图

    通过上图我们不难发现,该方法相比于中位数和预测填补法的效果都要好得多,且几乎呈现出正态分布的样式。


    Insulin(餐后2小时血清胰岛素含量),根据EDA结果,存在374条样本的0值,占整体近一半的数据。我们先来尝试使用回归预测的方式进行数据填补,结果如下:

The rmse of prediction is: 90.29597227916564

    根据模型计算得到的rmse来看,效果很不理想,因此此处放弃使用模型预测。此处根据EDA的结果发现,需要进行填补修复的数据较多,若采用之前的中位数填补势必会影响到整体的数据分布,效果如下图所示:

采用中位数填补数据效果对比

    通过上图发现,采用中位数对异常数据进行填补后,会造成整体数据的波峰异常高,且出现部分锯齿状数据,这样对整体数据效果会有影响,我们先来观察一下Insulin特征含0和非含0的数据分布情况,如下图:

Insulin含0(蓝)和不含0的数据分布

    经过上图观察发现,由于0占比较多,已经将整体的数据样本分布拉偏,因此需要进行数据的调整优化;

    由于需要修补的数据较多,因此采用之前的思路,随机插补法来对数据进行修复;只不过这里我们进行一点方法的改进,运用定向随机插补发,也就是在一定范围内选择随机数进行填补。直接上我做的步骤:

1、计算非0数据的1/4和3/4分为数;

2、每个值采用有放回抽样的方式,从分为数范围内进行数据随机抽取;

3、将抽取到的数据进行数据替换;

    下图为Insulin非0数据的数据分布:

Insulin非0数据统计 

    通过上述方法进行数据抽样,我们先生从目标范围内抽取一批与需要替换数量相同的数据列表,结果如下:

抽样结果样例

    我们将抽样得到的结果对目标数据进行替换,下图为替换为的数据分布:

定向随机抽样法修正前后数据分布

    经过上述定向随机抽样法修复数据后我们发现,整体数据分布更加接近正态分布,修复方法已对检测出的异常方法有较好的效果。但其中存在大部分的长尾数据,因此还需要后续通过特征工程的方法对数据进行处理。


五、总结

    到此为止,我们已经完成了数据清洗的工作。通过下表回顾一下在该数据集中我们都用了哪些数据清洗方法:

特征数据清洗方法说明表

    从整体来看,数据清洗建立在我们之前的EDA基础上,且需要尝试不同方法对数据进行清洗,这样才能够获得相对较高质量的数据;

六、后续

    EDA我们差不多到这里,接下来我们根据EDA结果进行各个特征的DC(数据清洗),可以关注后续的《关于Pima数据集研究(中)--DC(数据清洗)篇》。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。