关于Pima数据集研究共分为4个篇幅来进行研究:
《关于Pima数据集研究(1)--EDA(探索性数据分析)篇》
《关于Pima数据集研究(2)--DC(数据清洗)篇》
《关于Pima数据集研究(3)--FE(特征工程)篇》
《关于Pima数据集研究(4)--Model(模型搭建与预测)篇》
一、前情提要
该数据集最初来自美国国立糖尿病与消化与肾脏疾病研究所。数据集的目的是基于数据集中包含的某些诊断指标,诊断性的预测患者是否患有糖尿病。从较大的数据库中选择这些实例受到一些限制。特别是,这里的所有患者均为皮马印第安人血统至少21岁的女性。
二、内容
本次主要承接之前的《关于Pima数据集研究(2)--DC(数据清洗)篇》做后续探索研究,主要内容是关于Pima数据的EDA和DC结果进行针对性的数据清洗与深入探索。
三、研究方法
本人是python系,本课题的研究方法与方案均是基于python进行扩展,研究工具包括Anaconda、panda、numpy、sklearn等第三方成熟开源框架。
四、FE(特征工程)
根据之前的DC结果,我们已经获得较为干净,相对可用的数据集。我们先来观察一下DC之后的数据集,展示如下:
接下来我们开始对每个特征进行特征工程。
Pregnancies_fix,我们先来观察一下数据的分布情况,如下图所示:
根据上图展示,修复后的数据范围在0~13,数据类型为整数离散型变量。其中数据主要集中在0~2之间,且呈现依次递减。由于样本分布不均衡,此时我们使用分箱的方法将数据进行不同归类,形成新的数据特征,先观察一下20%、40%、60%、80%分位数的数据统计情况,如下所示:
根据分位数统计,我们将各个分位数设置为分类阈值,最终将数据做成5个分箱,规则如下:
根据分箱规则,我们新生成一个特征为Pregnancies_fix_bin,且将数据进行不同分箱。下图为最终的分箱统计结果:
根据分箱后的结果来看,相对比较均衡了,没有出现样本量差异性过大的情况,这样,我们就可以通过one-hot的方法将数据进行处理了,处理结果如下:
最后我们将数据结果拼接到原有数据中。
Glucose_fix,我们先来观察一下数据分布,如下图所示:
根据上图发现,数据几乎已是正态分布,暂时不用进行处理。我们来延用之前分箱操作的思想进行特征的外延,只不过这里用的方法为聚类算法,这里我们就是用最传统的Kmeans来进行计算。首先最为核心的问题是聚类个数k计算,这里没有先验知识能够告诉我们聚类个数k的选取,所以我们使用较为常用的“手肘”方法来计算相对较优的k值(这里不介绍该方法的原理)。
从上图发现,斜率转折较大点在3,因此我们的聚类数量用3即可,如下图所示。
根据上图发现,已通过聚类算法将原有的连续型变量转换为类别型变量,并新增到数据集中待后续使用。
BloodPressure_pre,我们来看一下数据的分布,如下图所示:
根据上图我们发现,经过之前的数据清洗工作后,已将数据处理为接近正太分布的数据。在此延用之前的聚类算法进行特征扩展,我们先用手肘方法对k进行选择,如下图:
很不幸,从上图中实在很难发现最佳的拐点位置,我们不能够很好的对k进行选取。这里我们引入另一个选择方法“轮廓系数法”,该方法的核心公式如下(我们不会展开讨论原理):
根据核心公式我们来绘制每个K的轮廓系数值,如下图:
根据上图我们发现,随着k的增加,轮廓系数增加。此时我们选择上图中增幅较大的点,也就是使用k=6(这里说明一下,首先,聚类算法属于无监督学习,我们只需要选择相对较优即可。聚类算法的还有一个目的是对变量进行降维,如果选择的聚类数量过多,则达不到降维的目的)进行聚类计算。
根据上图显示,BloodPressure_pre根据聚类后将原有的连续变量进行了相对应的整合。
SkinThickness_insert_fix,我们来看一下数据的分布,如下图所示:
从上图中我们能够看出,通过数据清洗后数据大部分数据呈现出正态分布,但仍然有一部分数据数值较大,将整体数据拉偏,此时我们采用对数的计算,对数据分布重新进行调整,对比如下:
根据对数变换后我们发现,已经把原有的右偏数据拉回相对正态分布的位置。我们基于变换后的数据继续之前的聚类造特征。这里使用手肘方法仍然无法判断,因此使用的还是轮廓系数,如下图:
判断方法与之前相同,但这里与之前图差异较大,且其中k=4和k=8的轮廓系数来看值相似,我们优先采用k较小的值来进行聚类,因此我们选用k=4进行后续计算效果如下:
Insulin_fix,我们来看一下数据的分布,如下图所示:
根据上图我们发现数据出现较强的右偏分布,且极值差异较大。这里我们采用之前的对数变换的方式来对数据进行处理,如下图:
根据上图来看,对数变化效果较为有效。我们继续之前的套路方法,轮廓系数聚类中心点判断如下:
根据上图发现,明显显示出来当聚类中心点k=4时为最大值,我们后续采用k=4来进行聚类,效果如下:
BMI_fix,我们来看一下数据的分布,如下图所示:
根据上图分布我们发现,整体仍然呈现右偏态分布,这里我们仍然使用对数变化,效果如下:
我们发现对数变化之后数据几乎呈现出正态分布,我们继续聚类研究,k图如下:
根据BMI_fix轮廓系数来看,k=6为最优点,我们来看一下聚类后分布:
DiabetesPedigreeFunction,我们来看一下数据的分布,如下图所示:
我们继续对数变换看效果,分布如下:
根据上图我们发现,对数变化竟然对数据分布无法产生影响,此时我们来看一下原始数据分位统计情况,如下表:
根据统计数据发现,该特征的大部分数值<1,因此对其进行对数变换仍然得不到较大的变化;此时我们采用一种新思路,计算对数变化的倒数,公式如下:
根据上述计算方法我们再来看一下数据变换后的分布情况:
现在我们的数据已被处理成近似正太分布,我们继续聚类研究,k图如下:
根据上图我们发现,最大轮廓系数为k=5,我们则使用k=5来进行后续聚类,分布如下:
Age,我们来看一下数据的分布,如下图所示:
从上图我们发现,该数据主要集中在20~30岁的年轻女性。这里根据经验判断,可将年龄划分为不同的年龄段来对特征进行扩充,通过年龄段来对特征进行划分,划分规则如下:
分段后的数据分布如下:
通过上图我们看出不同年龄段分布差异较大,由于20~30为主要分布范围,因此在年龄段划分时将此阶段进行了二次划分;
到这里我们的特征基本已经处理完成了,以上我们仅对单因素进行了聚类操作。而聚类算法可以进行多因素之间的共同聚类,由于方法类似,在此不再进行介绍。但类别型变量我们不能就这样放着不处理,因为对于机器来说会有数值大小的概念,而我们知道不同的类别仅仅只是用来作区分,不具有可比较的意义,因此我们需要进行数据的最后一步处理,One-Hot编码(概念不展开)。我们需要将之前几个类别型变量都进行处理,样例如下:
根据one-hot之后的特征,我们开始处理最后目标(Outcome)。
Outcome,我们来看一下数据的分布,如下图所示:
我们发现,目标仅有两类,最终我们采用分类算法来对目标进行预测。但目标量差距较大,若直接带入模型则会影响模型的准确性,因此我们需要对目标进行一定的均衡处理,我们常用的样本不均衡解决方法有:
1、过采样:即增加分类中少量样本的数量,简单方法就是复制少数类样本形成多条记录;
2、欠采样:即减少分类中多数样本的数量,简单方法就是随机去掉一些多数类样本减小规模;
3、惩罚权重:对不同样本数量的类别赋予不同的权重;
4、其他:自行查找
综合考虑,这里我们使用正负样本的惩罚权重解决样本不均衡问题。
这里我们使用的是SVM中的分类算法来对数据特征权重进行计算,计算结果如下:
根据计算权重值我们重新对所有特征进行计算,结果如下:
到此,我们已经完成了所有特征工程的调整工作,下图为最终特征工程后的数据特征量对比:
五、总结
该篇主要介绍特征工程在工作中的一些做法,在实际遇到项目时,需要根据项目时间与数据情况再来对数据进行判断该运用何种方式进行特征工程。例如,可以不通过聚类,再例如最后样本不均衡可以采用上下采样的形式。
到目前为止,我们已经完成了完整数据挖掘的60%~70%工作了,接下来开始数据模型的搭建。
六、后续
《关于Pima数据集研究(4)--Model(模型搭建与预测)篇》