关于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值的数量:
接下来我们根据之前的EDA结果开始进行数据清洗工作。
Pregnancies(怀孕次数),根据EDA结果,范围应该为0~13。因此将>13的结果进行指标拉回处理,亦将>13的数据赋值为13。下图为该字段清洗前后的分布差异;
Glucose(葡萄糖含量),根据EDA结果,其中有5条样本为0(异常值),上限值未发现异常。因此将5条数据修正为IQR下限值37.125,考虑到数据形态分布,此处采取中位数替换形式进行修正,修正前后结果如下:
接下来我们观察以下该数据的分布情况,如下图所示:
BMI(体重指数),根据EDA结果,数据为0的异常样本共11条,上限值暂未发现异常,因此将异常数据通过数据中位数的值进行填充。结果如下表所示:
接下来我们观察以下该数据的分布情况,如下图所示:
接下开始修正问题数据占比较高的特征。这里我们尝试使用回归分析来进行数据填补('·'谁让我爱折腾呢'·'),不废话,直接上结果。
BloodPressure(血压),根据EDA结果,存在35条样本的0值。此处采用与之前不同的处理方法来对数据进行处理(回归预测添补法)。这里采用的是LightGBM进行回归预测,先通过数据集切分和特征提取,结果如下图:
在此说明一下为什么只选择了者5个特征:
1、这5个特征是经过之前的EDA和数据清洗后可用的数据;
2、Outcome为我们的最终预测目标,如果加入进行预测BloodPressure可能会影响到最终的预测结果;
3、除上图5个特征以外的特征还未进行数据清洗,可能会影响到最终的结果;
接下来简单介绍一下数据预处理与回归预测的方法:
1、选择建模使用特征;
2、通过数据标准化处理数据,将数据拉到相同维度;
3、通过网格搜索进行简单超参选择;
4、搭建回归模型;
5、计算数据误差;
6、通过模型预测结果;
以下为模型计算的RMSE指标:
The rmse of prediction is: 10.460150358058625
模型预测结果展示:
通过BloodPressure修正分布图来看,发现修正后数据整体分布更加接近正态分布,且将异常数据进行了修正。
SkinThickness(皮下脂肪厚度,单位mm),根据EDA结果,存在227条样本的0值,占整体近30%的数据。再此
The rmse of prediction is: 4.6980404261770
此处采用上述相同方法进行预测填补,操作流程和步骤与上一步相同,此处不再废话,直接上结果:
看到上面诡异的预测结果发现数据预测有问题,检查预测之后整体的数据分布,如下图:
通过上图发现,预测填补的数据造成了数据的双峰分布,且主要分布在30的位置。而87的第二波峰由于预测结果导致的。由此发现,虽然模型计算出来的rmse评估相对较低,但是最终填补模型时导致数据形态变化较大。因此放弃预测填补方法,而是采用去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的数据分布情况,如下图:
经过上图观察发现,由于0占比较多,已经将整体的数据样本分布拉偏,因此需要进行数据的调整优化;
由于需要修补的数据较多,因此采用之前的思路,随机插补法来对数据进行修复;只不过这里我们进行一点方法的改进,运用定向随机插补发,也就是在一定范围内选择随机数进行填补。直接上我做的步骤:
1、计算非0数据的1/4和3/4分为数;
2、每个值采用有放回抽样的方式,从分为数范围内进行数据随机抽取;
3、将抽取到的数据进行数据替换;
下图为Insulin非0数据的数据分布:
通过上述方法进行数据抽样,我们先生从目标范围内抽取一批与需要替换数量相同的数据列表,结果如下:
我们将抽样得到的结果对目标数据进行替换,下图为替换为的数据分布:
经过上述定向随机抽样法修复数据后我们发现,整体数据分布更加接近正态分布,修复方法已对检测出的异常方法有较好的效果。但其中存在大部分的长尾数据,因此还需要后续通过特征工程的方法对数据进行处理。
五、总结
到此为止,我们已经完成了数据清洗的工作。通过下表回顾一下在该数据集中我们都用了哪些数据清洗方法:
从整体来看,数据清洗建立在我们之前的EDA基础上,且需要尝试不同方法对数据进行清洗,这样才能够获得相对较高质量的数据;
六、后续
EDA我们差不多到这里,接下来我们根据EDA结果进行各个特征的DC(数据清洗),可以关注后续的《关于Pima数据集研究(中)--DC(数据清洗)篇》。