【075】心血管疾病预测KNN和逻辑斯蒂

2023-10-12 10:20

本文主要是介绍【075】心血管疾病预测KNN和逻辑斯蒂,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

内容目录

一、项目介绍二、数据探索

            1、查看数据集的基本信息

            2、性别和患病的关系

            3、年龄和患病的关系

            4、身高、体重与患病的关系

      三、建模分析

            1、计算相关性系数

            2、编写预设函数

            3、切分数据集

            4、初步训练逻辑回归模型

            5、数据标准化变换

            6、利用KNN做优化

            7、模型选择

            8、KNN表现

            9、逻辑回归表现

一、项目介绍  

1、背景描述

        数据集包括年龄、性别、收缩压、舒张压等12个特征的患者数据记录7万份。
当患者有心血管疾病时,目标类“cardio”等于1,如果患者健康,则为0。

        原文见公众号:python宝

2、导包导数据

# 导入需要的工具包
import pandas as pd # data processing
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns  # plot
import pandas_profiling
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScalerwarnings.filterwarnings("ignore")
data = pd.read_csv('D:\A\AI-master\py-data\cardio_train.csv',sep=';')
data.head()
   id    age  gender  height  weight  ap_hi  ap_lo  cholesterol  gluc  smoke  alco  active  cardio
0   0  18393       2     168    62.0    110     80            1     1      0     0       1       0
1   1  20228       1     156    85.0    140     90            3     1      0     0       1       1
2   2  18857       1     165    64.0    130     70            3     1      0     0       0       1
3   3  17623       2     169    82.0    150    100            1     1      0     0       1       1
4   4  17474       1     156    56.0    100     60            1     1      0     0       0       0(70000, 13)

二、数据探索

1、查看数据集的基本信息
#info()函数给出样本数据的相关信息概览 :行数,列数,列索引,列非空值个数,列类型,内存占用
data.info()#describe()函数直接给出样本数据的一些基本的统计量,包括均值,标准差,最大值,最小值,分位数等。
data.describe()#pandas-profiling能够使用DataFrame自动生成数据的详细报告,相比describe生成的profile要详细的多。
pandas_profiling.ProfileReport(data)#导出报告,目前pandas-profiling目前只支持导出html格式的文件。如果想要生成图片,先生成的html文件,使用Chrome的内建截屏功能来生成图片,没错你前面看到结果就是使用这种方式生成的。
pfr = pandas_profiling.ProfileReport(data)
pfr.to_file('report.html')
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 70000 entries, 0 to 69999
Data columns (total 12 columns):
age            70000 non-null int64
gender         70000 non-null int64
height         70000 non-null int64
weight         70000 non-null float64
ap_hi          70000 non-null int64
ap_lo          70000 non-null int64
cholesterol    70000 non-null int64
gluc           70000 non-null int64
smoke          70000 non-null int64
alco           70000 non-null int64
active         70000 non-null int64
cardio         70000 non-null int64
dtypes: float64(1), int64(11)
memory usage: 6.4 MB
               age        gender        height        weight         ap_hi         ap_lo   cholesterol          gluc         smoke          alco        active        cardio
count  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000  70000.000000
mean   19468.865814      1.349571    164.359229     74.205690    128.817286     96.630414      1.366871      1.226457      0.088129      0.053771      0.803729      0.499700
std     2467.251667      0.476838      8.210126     14.395757    154.011419    188.472530      0.680250      0.572270      0.283484      0.225568      0.397179      0.500003
min    10798.000000      1.000000     55.000000     10.000000   -150.000000    -70.000000      1.000000      1.000000      0.000000      0.000000      0.000000      0.000000
25%    17664.000000      1.000000    159.000000     65.000000    120.000000     80.000000      1.000000      1.000000      0.000000      0.000000      1.000000      0.000000
50%    19703.000000      1.000000    165.000000     72.000000    120.000000     80.000000      1.000000      1.000000      0.000000      0.000000      1.000000      0.000000
75%    21327.000000      2.000000    170.000000     82.000000    140.000000     90.000000      2.000000      1.000000      0.000000      0.000000      1.000000      1.000000
max    23713.000000      2.000000    250.000000    200.000000  16020.000000  11000.000000      3.000000      3.000000      1.000000      1.000000      1.000000      1.000000

2、性别和患病的关系

sns.countplot(x='cardio',data=data,hue='gender')
plt.show()

3、年龄和患病的关系

sns.boxplot(x='cardio',y='age',data=data)
plt.show()

4、身高、体重与患病的关系

plt.figure(figsize=(14,6))
plt.subplot(1,2,1)
sns.boxplot(x='cardio',y='height',data=data,palette='winter')
plt.subplot(1,2,2)
sns.boxplot(x='cardio',y='weight',data=data,palette='summer')
plt.show()

三、建模分析

1、计算相关性系数

correlations = data.corr()['cardio'].drop('cardio')
print(correlations)
age            0.238159
gender         0.008109
height        -0.010821
weight         0.181660
ap_hi          0.054475
ap_lo          0.065719
cholesterol    0.221147
gluc           0.089307
smoke         -0.015486
alco          -0.007330
active        -0.035653
Name: cardio, dtype: float64

2、编写预设函数

def feat_select(threshold):abs_cor = correlations.abs()features = abs_cor[abs_cor > threshold].index.tolist()return features
def model(mod,X_tr,X_te):mod.fit(X_tr,y_train)pred = mod.predict(X_te)print('Model score = ',mod.score(X_te,y_test)*100,'%')

3、切分数据集
msk = np.random.rand(len(data))<0.85
df_train_test = data[msk]
df_val = data[~msk]X = df_train_test.drop('cardio',axis=1)
y = df_train_test['cardio']
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=70)

4、初步训练逻辑回归模型

# 逻辑回归
lr = LogisticRegression()
threshold = [0.001,0.002,0.005,0.01,0.05,0.1]
for i in threshold:print("Threshold is {}".format(i))feature_i = feat_select(i)X_train_i = X_train[feature_i]X_test_i = X_test[feature_i]model(lr,X_train_i,X_test_i)
Threshold is 0.001
Model score =  70.79104102004865 %
Threshold is 0.002
Model score =  70.79104102004865 %
Threshold is 0.005
Model score =  70.79104102004865 %
Threshold is 0.01
Model score =  70.64843553393172 %
Threshold is 0.05
Model score =  72.30098146128681 %
Threshold is 0.1
Model score =  61.30358191426893 %
准确率不高,进一步对数据做处理

5、数据标准化变换

scale = StandardScaler()
scale.fit(X_train)
X_train_scaled = scale.transform(X_train)
X_train_ = pd.DataFrame(X_train_scaled,columns=data.columns[:-1])
scale.fit(X_test)
X_test_scaled = scale.transform(X_test)
X_test_ = pd.DataFrame(X_test_scaled,columns=data.columns[:-1])

6、利用KNN做优化

for i in threshold:feature = feat_select(i)X_train_k = X_train_[feature]X_test_k = X_test_[feature]err = []for j in range(1,30):knn = KNeighborsClassifier(n_neighbors=j)knn.fit(X_train_k,y_train)pred_j = knn.predict(X_test_k)err.append(np.mean(y_test != pred_j))plt.figure(figsize=(10,6))plt.plot(range(1,30),err)plt.title('Threshold of {}'.format(i))plt.xlabel('K value')plt.ylabel('Error')

7、模型选择

我们最终选择threshold在0.05时,对应的特征,作为input输入;

feat_final = feat_select(0.05)
print(feat_final)
['age', 'weight', 'ap_hi', 'ap_lo', 'cholesterol', 'gluc']

8、KNN表现

X_train = X_train_[feat_final]
X_val = np.asanyarray(df_val[feat_final])
y_val = np.asanyarray(df_val['cardio'])scale.fit(X_val)
X_val_scaled = scale.transform(X_val)
X_val_ = pd.DataFrame(X_val_scaled,columns=df_val[feat_final].columns)# knn with k=15
knn = KNeighborsClassifier(n_neighbors=15)
knn.fit(X_train,y_train)
pred = knn.predict(X_val_)print('Confusion Matrix =\n',confusion_matrix(y_val,pred))
print('\n',classification_report(y_val,pred))
Confusion Matrix =[[3775 1507][1464 3774]]precision    recall  f1-score   support0       0.72      0.71      0.72      52821       0.71      0.72      0.72      5238accuracy                           0.72     10520macro avg       0.72      0.72      0.72     10520
weighted avg       0.72      0.72      0.72     10520

9、逻辑回归表现

# Logistic regression
lr.fit(X_train,y_train)
pred = lr.predict(X_val_)# reports
print('Confusion Matrix =\n',confusion_matrix(y_val,pred))
print('\n',classification_report(y_val,pred))
Confusion Matrix =[[4261 1021][1951 3287]]precision    recall  f1-score   support0       0.69      0.81      0.74      52821       0.76      0.63      0.69      5238accuracy                           0.72     10520macro avg       0.72      0.72      0.72     10520
weighted avg       0.72      0.72      0.72     10520

10、小结

  KNN 和逻辑回归表现差不多。

About Me:小婷儿

● 本文作者:小婷儿,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用

● 作者博客地址:https://blog.csdn.net/u010986753

● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

● 微信:tinghai87605025 联系我加微信群

● QQ:87605025

● QQ交流群py_data :483766429

● 公众号:python宝 或 DB宝

● 提供OCP、OCM和高可用最实用的技能培训

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

如果您觉得到文章对您有帮助,欢迎赞赏哦!有您的支持,小婷儿一定会越来越好!

这篇关于【075】心血管疾病预测KNN和逻辑斯蒂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/195179

相关文章

逻辑表达式,最小项

目录 得到此图的逻辑电路 1.画出它的真值表 2.根据真值表写出逻辑式 3.画逻辑图 逻辑函数的表示 逻辑表达式 最小项 定义 基本性质 最小项编号 最小项表达式   得到此图的逻辑电路 1.画出它的真值表 这是同或的逻辑式。 2.根据真值表写出逻辑式   3.画逻辑图   有两种画法,1是根据运算优先级非>与>或得到,第二种是采

UMI复现代码运行逻辑全流程(一)——eval_real.py(尚在更新)

一、文件夹功能解析 全文件夹如下 其中,核心文件作用为: diffusion_policy:扩散策略核心文件夹,包含了众多模型及基础库 example:标定及配置文件 scripts/scripts_real:测试脚本文件,区别在于前者倾向于单体运行,后者为整体运行 scripts_slam_pipeline:orb_slam3运行全部文件 umi:核心交互文件夹,作用在于构建真

Tensorflow lstm实现的小说撰写预测

最近,在研究深度学习方面的知识,结合Tensorflow,完成了基于lstm的小说预测程序demo。 lstm是改进的RNN,具有长期记忆功能,相对于RNN,增加了多个门来控制输入与输出。原理方面的知识网上很多,在此,我只是将我短暂学习的tensorflow写一个预测小说的demo,如果有错误,还望大家指出。 1、将小说进行分词,去除空格,建立词汇表与id的字典,生成初始输入模型的x与y d

临床基础两手抓!这个12+神经网络模型太贪了,免疫治疗预测、通路重要性、基因重要性、通路交互作用性全部拿下!

生信碱移 IRnet介绍 用于预测病人免疫治疗反应类型的生物过程嵌入神经网络,提供通路、通路交互、基因重要性的多重可解释性评估。 临床实践中常常遇到许多复杂的问题,常见的两种是: 二分类或多分类:预测患者对治疗有无耐受(二分类)、判断患者的疾病分级(多分类); 连续数值的预测:预测癌症病人的风险、预测患者的白细胞数值水平; 尽管传统的机器学习提供了高效的建模预测与初步的特征重

结合Python与GUI实现比赛预测与游戏数据分析

在现代软件开发中,用户界面设计和数据处理紧密结合,以提升用户体验和功能性。本篇博客将基于Python代码和相关数据分析进行讨论,尤其是如何通过PyQt5等图形界面库实现交互式功能。同时,我们将探讨如何通过嵌入式预测模型为用户提供赛果预测服务。 本文的主要内容包括: 基于PyQt5的图形用户界面设计。结合数据进行比赛预测。文件处理和数据分析流程。 1. PyQt5 图形用户界面设计

【Java编程的逻辑】原子变量 CAS 显示锁

原子变量 在理解synchronized中有使用synchronized保证原子更新操作,但是使用synchronized成本太高了,需要先获取锁,最后还要释放锁,如果获取不到锁还需要等到。这些成本都是比较高的,对于这种情况,可以使用原子变量。 Java并发包中的基本原子变量类型有以下几种: AtomicBoolean:原子Boolean类型,常用来在程序中表示一个标志位 AtomicIn

【Java编程的逻辑】容器类的总结

抽象容器类 用法和特点 容器类有两个根接口,分别是Collection 和 Map ,Collection表示单个元素的集合,Map表示键值对的集合 。 Collection Collection表示的数据集合有基本的增、删、查、遍历等方法,但没有定义元素间的顺序或位置,也没有规定是否有重复元素。 List: 是Collection的子接口,表示有顺序或位置的数据集合,增加了根据

【Java编程的逻辑】堆与优先级队列PriorityQueue

完全二叉树 & 满二叉树 & 堆 基本概念 满二叉树是指除了最后一层外,每个节点都有两个孩子,而最后一层都是叶子节点,都没有孩子。 满二叉树一定是完全二叉树,但完全二叉树不要求最后一层是满的,但如果不满,则要求所有节点必须集中在最左边,从左到右是连续的,中间不能有空的。 特点 在完全二叉树中,可以给每个节点一个编号,编号从1开始连续递增,从上到下,从左到右 完全二叉树有一

【Java编程的逻辑】Map和Set

HashMap Map有键和值的概念。一个键映射到一个值,Map按照键存储和访问值,键不能重复。 HashMap实现了Map接口。 基本原理 HashMap的基本实现原理:内部有一个哈希表,即数组table,每个元素table[i]指向一个单向链表,根据键存取值,用键算出hash值,取模得到数组中的索引位置index,然后操作table[index]指向的单向链表。 存取的时候依据键的

CNN-LSTM模型中应用贝叶斯推断进行时间序列预测

这篇论文的标题是《在混合CNN-LSTM模型中应用贝叶斯推断进行时间序列预测》,作者是Thi-Lich Nghiem, Viet-Duc Le, Thi-Lan Le, Pierre Maréchal, Daniel Delahaye, Andrija Vidosavljevic。论文发表在2022年10月于越南富国岛举行的国际多媒体分析与模式识别会议(MAPR)上。 摘要部分提到,卷积