一、研究背景
高血压是一种常见的慢性疾病,它会增加心脏病、脑卒中、肾脏疾病等多种严重疾病的风险。随着人们生活方式的改变和老龄化社会的到来,高血压的发病率逐年上升,已经成为全球范围内的公共卫生问题。
目前,高血压的诊断主要依赖于血压测量和临床症状,但这些方法存在一定的局限性。血压测量只能反映当前的血压水平,不能预测未来的血压变化;临床症状也往往不典型,容易被忽视。因此,寻找一种更加准确、可靠的高血压预测方法具有重要的临床意义。
二、研究意义
- 提高高血压的诊断准确率:通过对高血压数据集的分析,可以挖掘出与高血压相关的潜在特征和模式,从而提高高血压的诊断准确率。
- 预测高血压的发病风险:利用数据分析技术,可以对个体的高血压发病风险进行预测,从而提前采取预防措施,降低高血压的发病率。
- 为高血压的治疗提供依据:通过对高血压数据集的分析,可以了解高血压的发病机制和危险因素,为高血压的治疗提供依据。
- 优化高血压的治疗方案:根据高血压患者的个体特征和病情,制定个性化的治疗方案,提高治疗效果。
- 促进医疗信息化的发展:高血压数据集的分析需要借助于先进的信息技术和数据分析工具,这将促进医疗信息化的发展,提高医疗服务的质量和效率。等等
三、实证分析
导入我们机器学习需要的package 主要是基础包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.rcParams['font.sans-serif'] = ['KaiTi'] #中文
plt.rcParams['axes.unicode_minus'] = False #负号
读取高血压数据集 数据为csv文件
data=pd.read_csv('hypertension_data.csv')
使用head查看数据 在此查看数据前6行
可以看到数据集的部分情况展示,我们的响应变量为target,其他都是特征
每个变量具体解释如下:
变量名称 中文含义 变量类别
age 年龄 数值型变量
sex 性别 分类型变量
cp 胸痛类型 分类型变量
trestbps 静息血压 数值型变量
chol 胆固醇 数值型变量
fbs 空腹血糖 > 120 mg 分类型变量
restecg 心电图结果 分类型变量
thalach 最大心率 数值型变量
exang 运动引起心绞痛 分类型变量
oldpeak 运动相对于休息引起的ST段变化 数值型变量
slope 运动高峰ST段的坡度 分类型变量
ca 荧光透视下大血管数目 数值型变量
thal 缺陷类型 分类型变量
target 诊断结果 分类型变量
随后查看一下整体数据情况
结果发现数据量为26000+,特征为13个,数据量还不错
随后对数据集进行一些描述性统计分析,通过describe函数来进行
data.describe()
从describe函数结果来看,可以对每个特征的总数合计,以及展示其均值、标准差、最大最小值。以及分位数
随后用info查看数据集类型
查看是否有空值
data.isnull().sum()
发现性别有空值 后续处理 向前填充
data.fillna(method='ffill',inplace=True)
使用groupby函数进行分组查看
# 按年龄和胸痛类型分组,计算是否有高血压
grouped = data.groupby(['sex', 'cp'])['target'].mean().reset_index()
显示每个性别和吸烟状态组合的中风发生率
grouped.pivot(index='sex', columns='cp', values='target').plot(kind='bar', stacked=True)
plt.title('target Rate by sex and cp')
plt.xlabel('sex')
plt.ylabel('target Rate')
plt.show()
import seaborn as sb
for i in data.columns:
fig, ax = plt.subplots(1,1, figsize=(15, 6))
sb.countplot(y = data[i],data=data, order=data[i].value_counts().index)
plt.ylabel(i)
plt.yticks(fontsize=13)
plt.show()
差不多每个变量都可视化出来了,但是其中有一些数值比较大的数据可能看的不是很清楚
我们还要画图查看每个X的分布
查看特征变量的箱线图分布
dis_rows = len(columns)
plt.figure(figsize=(4 * dis_cols, 4 * dis_rows))
for i in range(len(columns)):
plt.subplot(dis_rows,dis_cols,i+1)
sns.boxplot(data=data[columns[i]], orient="v",width=0.5)
plt.xlabel(columns[i],fontsize = 20)
plt.tight_layout()
#plt.savefig('特征变量箱线图',formate='png',dpi=500)
plt.show()
从箱线图可以看出,大部分变量的分布都是较为合理的,只是个别变量比如trestbps和chol等变量存在一些离群点
再画直方图看看
data.hist(figsize=(20,20))
plt.show()
画出各个特征的热力图
从上面的结果可以看出,与响应变量较为相关的有cp和thalah以及slope,当然,负相关的我们也要考虑,比如ca和oldpeak和thal等
接下来看一下cp和高血压分布
plt.figure(figsize=(12,5))
sns.displot(x='cp', col='target' , data = data, kind="kde" ,color = 'green');
然后还需要查看响应变量y的分布
异常值处理,先标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_s = scaler.fit_transform(data)
然后画图查看
接下来开始机器学习
#划分训练集和验证集
from sklearn.model_selection import train_test_split
X_train,X_val,y_train,y_val=train_test_split(data,y,test_size=0.2,random_state=0)
预测模型我们选择了 线性回归和KNN
from xgboost.sklearn import XGBClassifier
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LogisticRegression
model = LogisticRegression(C=1e10)
model.fit(X_train,y_train )
model.score(X_val,y_val)
from sklearn.neighbors import KNeighborsClassifier
model = KNeighborsClassifier(n_neighbors=50)
model.fit(X_train,y_train )
model.score(X_val,y_val)
从结果上可以看出,线性回归是分类准确率为0.845而KNN的分类准确率为0.919,结果也是符合常规的
四、小结
本次实验通过使用机器学习模型,包括线性回归和KNN等,结合各项身体指标如年龄、性别、是否胸痛、胆固醇等等, 成功地建立了一个高血压预测模型。这个模型可以有效地预测患者是否患有高血压,对于临床医疗实践具有非常重要的意义。 在预测高血压的过程中,需要进行多个环节的数据预处理、数据可视化、模型选择以及性能评估等步骤,以确保模型的准确性 和可靠性。同时,您还需要考虑如何处理数据缺失或异常等情况,提高模型的鲁棒性和适用性。 总的来说,使用机器学习模型预测高血压的方法能够更加客观地评估患者的病情和疾病风险, 并能够为医生提供更加精准的诊疗建议。这一方法在未来的医疗实践中具有广阔的应用前景。