数据来自Kesci,项目是想通过对患者年龄、性别、血压、血脂、血糖、吸烟史、酗酒史、体育活动等特征,分析心血管疾病的关系,并建立模型。
加载数据
Id字段对分析没有太大用处,删除字段。
查看数据集基本信息,没有发现缺失值,数据不用清洗,直接可做下一步处理。
使用pandas_profiling做探索预览分析,pandas_profiling这个库挺好,不仅包括各种基本的描述性统计值及可视化,还有对这个项目比较重要的相关性分析及可视化。
也可以调用函数corr()查看correlation,旨在保留与心血管疾病相关性较大的特征来进行分析。
分析建模
前期准备
划分特征值和目标值
根据数据背景介绍,了解字段‘cardio’代表是否患有心血管疾病,0表示健康,1表示患病。故设置为目标值。
切分数据集
总共7w条数据,切下15%作为测试集。(又学了个函数,在数组前面加一个’ ~ ’,返回一个相反的值,bool或int。)
划分训练集和验证集
训练逻辑回归模型
由于不知道要选取哪些相关性强的特征,才能使模型的精确率达到最高,故设定阈值,让相关性高于阈值的特征保留,并运用到模型训练当中。
从目前的选取的阈值中看出,相关性高于0.05的时候,模型精确率最高。相关字段为age,weight,ap_hi,ap_lo,cholesterol,gluc。
训练KNN模型
特征工程标准化
利用KNN做优化
同样在不确定哪些特征能让模型精确率高的情况下,建立循环。同样,不同的K值会对精确率产生影响,做子循环。
使用np.mean(y_test != pred_j节省了计算精确度的环节。
根据图示,相关性高于0.05的时候,模型精确度最高。在K值为15到30时候,精确度波动不大。选择15减少计算资源。
测试集做预测
重新把阈值0.05和K值15纳入到模型当中。对测试集进行预测。
小结:两种模型建立的还可以,对患者预测的精确度为72%-73%,对于心血管疾病患者关注年龄、体重、血压、血糖、血脂显得格外的重要。
gender值1和2哪个代表男性,无法从给定材料中找到。只能通过身高来判断,一般男性都比女性高。在图中可看到,1的身高相较2,右移了很多。判定1为女性。健康的人(cardio为0),男性抽烟的较女性少;患病的人中,较女性多。
男性抽烟又得心血管疾病的比例是女性的12倍。男性抽烟但没有心血管疾病的比例也是女性的12倍多。其他的比例都相近。
酗酒的人中,男性是女性的5倍。
数据中,抽烟的人的年龄中位数比不抽烟的人的年龄中位数小19个月。
在患病的人当中,抽烟的人的年龄中位数比不抽烟的人的年龄中位数小20个月。
补充:
在数据当中,虽然没有缺失值,但是在查看描述性统计是的是,有很多数据都不具有显示意义。比如血压舒张压高于收缩压的。需要去除。