python数据分析之用sklearn预测糖尿病
发布日期:2025-01-03 19:04 点击次数:110
一、数据集描述
本数据集内含十个属性列
Pergnancies: 怀孕次数
Glucose:血糖浓度
BloodPressure:舒张压(毫米汞柱)
SkinThickness:肱三头肌皮肤褶皱厚度(毫米)
Insulin:两个小时血清胰岛素(μU/毫升)
BMI:身体质量指数,体重除以身高的平方
Diabets Pedigree Function: 疾病血统指数
是否和遗传相关,Height:身高(厘米)
Age:年龄
Outcome:0表示不患病,1表示患病。
任务:建立机器学习模型以准确预测数据集中的患者是否患有糖尿病
二、准备工作
查阅资料得知各属性的数据值要求,方面后期对于数据的分析与处理过程。
属性列名称 数据值要求
Pergnancies(怀孕次数) 符合常理即可(可为0)
Glucose(血糖浓度) 正常值为:80~120
BloodPressure(舒张压(毫米汞柱)) 正常值为:60~80
SkinThickness(肱三头肌皮肤褶皱厚度(毫米)) 不为0
Insulin(两个小时血清胰岛素(/毫升)) 正常值为:35~145
BMI(身体质量指数:体重除以身高的平方) 正常值为:18.5~24.9
Diabets Pedigree Function:(疾病血统指数:是否和遗传相关) 无特殊值要求
Height(身高(厘米)) 不为0 符合常理即可
Age(年龄) 符合常理即可
Outcome(0表示不患病,1表示患病) 标签值
三、实验环境和工具
python3.5.6 + jupyter
数据处理 pandas、numpy
可视化 matplotlib、seaborn
模型构建 sklearn
四、预测分析
4.1探索性数据分析
数据描述
首先观察基本的数据类型,以及数据是否存在缺失情况,简要统计信息
数据总量时比较少的只有768个例子,可以看到除Height外的属性都为数值型属性。在后续数据预处理过程需要对Height属性进行类型转换操作。目前没有缺失值的出现。
发现两个问题:
1.缺失值
从其中的min值可以很直观地观察到,Glucose, BloodPressure, SkinTinckness, Insulin, BMI等特征存在0值的情况(当然Pregnancies根据常识判断是可以为0的)。而根据常规范围明显可以判定这些0值是不合理的,所以也是一种缺失值缺失值,后续数据预处理需要对这些缺失值进行填充处理。
2.离群值/异常值
Glucose,BloodPressure,SkinTinckness,Insulin等特征的max值和75%分位点值或者min值和25%分位点值之间的差距比较大,初步判断可能存在离群值/异常值。尤其是SkinThickness和Insulin特征(具体见图4红色框部分),后续可以通过可视化进一步直观地观察判断。
为了方便后序对缺失值的统一处理,将异常值统一替换为np.nan。
可以观察到Glucose,Insulin,SkinThickness,BMI,Height等特征都存在缺失值。并且 Insulin,SkinThickness缺失值比较多,分别占到了48%,30%的比例。所以后期数据预处理也是很关键的。
五、可视化分析
接下来通过更多针对性的可视化,来进一步探索特征值的分布以及特征和预测变量之间的关系
部分输出:
部分输出:
1.从数据样本本身出发研究数据分布特征,可以发现在患病和不患病两种情况下,部分特征的密度分布比较相近,特别是height的分布图,发现两曲线基本相近。感觉和label之间的相关性都不是很强。
2.同时,可以发现部分特征存在右偏的现象(skewness (偏度) 描述数据分布形态的统计量,其描述的是某总体取值分布的对称性),考虑到需要数据尽量服从正态分布,所以后续数据预处理需要对存在一定偏度的特征进行相关处理。
heatmap()函数可以直观地将数据值的大小以定义的颜色深浅表示出来。
1.可以发现颜色相对来说都比较浅,也就是说无论是特征和特征之间还是特征和outcome标签之间的相关性都没有很高。
2.发现其余各特征变量中与outcome的相关度中最高的是Glucose 属性值为0.49,最低的是Height属性值为0.059。
3.同时观察特征与特征之间的关系,发现Insulin与Glucose,BMI和SkinThickness之间的相关度分别为0.58,0.65属于比较高的相关性,由于Insulin是一个确实比较严重的特征,而相关性可以是一种协助填充缺失值的方法。
部分输出:
六、构建baseline
因为决策树几乎不需要数据预处理。其他方法经常需要数据标准化,创建虚拟变量和删除缺失值。
0.6954248366013072
七、数据预处理
综合前面分析,先做了以下处理
八、离群值处理
1.经过前面的分析发现数据是存在部分离群值的,虽然实验本身就是关于疾病预测,异常值的存在属于正常现象。但是对于一些可能超出人体接受范围的值,衡量对预测的影响之后,由于数据量比较小,这里选择删除极端异常点。
2.极端异常点 :上限的计算公式为Q3+3(Q3-Q1) 下界的计算公式为Q1-3(Q3-Q1))。
处理之后的数据基本的统计信息
九、缺失值处理
1.直接删除处理
2.中值填充
3.KNNImputer填充
4.随机森林填充
十、特征工程
十一、数据标准化
十二、模型构建与调参优化
用到的模型
from sklearn.svm import SVC,SVR
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier,StackingClassifier
调参方法
from sklearn.model_selection import GridSearchCV
评估指标 Accuracy roc_auc
from sklearn.metrics import make_scorer from sklearn.metrics import
accuracy_score from sklearn.metrics import roc_auc_score
SVC
LogisticRegression
RandomForestClassifier
StackingClassifier
SVC预测结果:
1.直接删除缺失值以及异常值删除公式上限Q3+1.5(Q3-Q1);下限计算公式为Q1-1.5(Q3-Q1)
SVC(C=1.097979797979798)
test_Accuracy : 0.8549075391180654
test_AUC : 0.511601411290322
2.直接删除缺失值以及异常值删除公式上限Q3+3(Q3-Q1);下限计算公式为Q1-3(Q3-Q1)
SVC(C=1.405050505050505)
test_Accuracy : 0.7953321596244133
test_AUC : 0.7133755225726653
3.中值填充以及异常值删除公式上限Q3+3(Q3-Q1);下限计算公式为Q1-3(Q3-Q1)
SVC(C=1.7888888888888888)
test_Accuracy : 0.7814101086443079
test_AUC : 0.7248522348166069
十三、总结
1.一些删除数据值的处理方法导致样本标签的不均衡会导致对比例大的样本造成过拟合,也就是说预测偏向样本数较多的分类。这样就会大大降低模型的泛化能力。表现在准确率很高,但roc_auc_score很低。上面SVC的预测结果就很好的说明了。
2.可以看出由于缺失值比较多,所以反而各种填充方法的效果比直接删除的效果是要更差的(也有可能我没找到合适的填充方法)
3.关于离群值的处理,主要方法有直接删除法,替换为缺失值处理,以及中值填充法等。由于缺失值处理那里的效果不是很理想,所以就选择了直接删除,并且在平衡了roc_auc_score和accuracy两个指标后,选择只删除极端异常点。
4.关于样本0/1比例的问题,可以考虑上采样或者下采样的方法平衡样本。本文不涉及。
到此这篇关于python数据分析之用sklearn预测糖尿病的文章就介绍到这了,更多相关用sklearn预测糖尿病内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!