2022年顶级心脏病预测项目

已发表: 2021-05-26

欢迎来到我们的心脏病预测项目的分步教程。 在这里,您将创建一个机器学习模型来预测患者是否可以被诊断出患有心脏病。

您应该熟悉机器学习和数据分析的基础知识才能参与此项目。 该项目要求您熟悉多种 ML 算法,包括随机森林、K-NN(K-最近邻)等。

我们将执行数据整理、过滤和测试六种不同的 ML 算法,以找出哪一种可以为我们的数据集提供最佳结果。 让我们开始:

目录

心脏病预测项目的目标

我们的心脏病预测项目的目标是确定患者是否应该被诊断出患有心脏病,这是一个二元结果,因此:

阳性结果=1,患者将被诊断患有心脏病。

阴性结果=0,患者不会被诊断出患有心脏病。

我们必须找到哪个分类模型具有最高的准确性并识别我们数据中的相关性。 最后,我们还必须确定哪些特征对我们的心脏病诊断影响最大。

特征

我们使用以下 13 个特征 (X) 来确定我们的预测器 (Y):

  1. 年龄。
  2. 性别:1 = 男性,0 = 女性。
  3. (cp) 胸痛类型(4 个值 - 序数),第 1 值:典型心绞痛,第 2 值:非典型心绞痛,第 3 值:非心绞痛,第 4 值:无症状。
  4. (trestbps) 静息血压。
  5. (chol) 血清胆固醇。
  6. (Fbs) – 空腹血糖 > 120 mg/dl。
  7. (retecg) – 静息心电图结果。
  8. (thalach) – 达到的最大心率。
  9. (exang) – 运动性心绞痛。
  10. (oldpeak) – 相对于休息,运动引起的 ST 段压低。
  11. (斜率) – 峰值运动 ST 段的斜率。
  12. (ca) – 透视着色的主要血管数量。
  13. (thal) – 达到的最大心率(Ordinal),3 = 正常,6 = 固定缺陷,7 = 可逆缺陷。

第 1 步:数据整理

我们将首先通过将其转换为更简单、更易于理解的格式来查看我们正在使用的数据集。 它将帮助我们更恰当地使用数据。

将 numpy 导入为 np

将熊猫导入为 pd

将 matplotlib 导入为 plt

将 seaborn 导入为 sns

将 matplotlib.pyplot 导入为 plt

filePath = '/Users/upgrad/Downloads/datasets-33180-43520-heart.csv'

数据 = pd.read_csv(文件路径)

数据头(5)

年龄性别cp trestbps 脸书重建塔拉赫出口老峰塔尔目标
0 63 1 3 145 233 1 0 150 0 2.3 0 0 1 1
1 37 1 2 130 250 0 1 187 0 3.5 0 0 2 1
2 41 0 1 130 204 0 0 172 0 1.4 2 0 2 1
3 56 1 1 120 236 0 1 178 0 0.8 2 0 2 1
4 57 0 0 120 354 0 1 163 1 0.6 2 0 2 1

正如上面的代码帮助我们以表格形式显示数据一样,我们将使用以下代码进行进一步的数据整理:

打印(“(行,列):” + str(data.shape))

数据列

上面的代码将显示我们数据集中的总行数和列数以及列名。 我们数据中的总行数和列数分别为 303 和 14。 现在我们将使用以下函数找到每个变量的唯一值的数量:

data.nunique(轴=0

同样,以下函数总结了数值变量的平均值、计数、标准差、最小值和最大值:

数据描述()

步骤 #2:进行 EDA

现在我们已经完成了数据整理,我们可以进行探索性数据分析。 以下是我们将在心脏病预测项目的这一阶段执行的主要任务:

寻找相关性

我们将创建一个相关矩阵来帮助我们查看不同变量之间的相关性:

corr = data.corr()

plt.subplots(figsize=(15,10))

sns.heatmap(corr, xticklabels=corr.columns, yticklabels=corr.columns, annot=True, cmap=sns.diverging_palette(220, 20, as_cmap=True))

sns.heatmap(corr, xticklabels=corr.columns,

yticklabels=corr.columns,

注释=真,

cmap=sns.diverging_palette(220, 20, as_cmap=True))

为了找到特征之间的直接相关性,我们还可以创建配对图。 我们将使用只有连续变量的小对图来更深入地研究关系:

subData = data[['age','trestbps','chol','thalach','oldpeak']]

sns.pairplot(子数据)

使用小提琴和箱线图

通过小提琴和箱线图,我们可以看到数据的基本统计和分布。 您可以使用它来比较特定变量在不同类别中的分布。 它还将帮助我们识别数据中的异常值。 使用以下代码:

plt.figure(figsize=(12,8))

sns.violinplot(x= 'target', y= 'oldpeak',hue=”sex”, inner='quartile',data= data )

plt.title(“Thalach 水平与心脏病”,fontsize=20)

plt.xlabel(“心脏病目标”, fontsize=16)

plt.ylabel(“Thalach 水平”, fontsize=16)

在第一个小提琴和箱线图中,我们发现阳性患者的 ST 段压低中位数低于阴性患者。 因此,我们将使用图表来比较 ST 抑郁水平和心脏病。

plt.figure(figsize=(12,8))

sns.boxplot(x='target', y='thalach',hue=”sex”, data=data)

plt.title(“ST 抑郁水平 vs. 心脏病”, fontsize=20)

plt.xlabel(“心脏病目标”,fontsize=16)

plt.ylabel(“运动相对于休息引起的 ST 压低”, fontsize=16)

在这里,与阴性患者相比,阳性患者的 ST 压低水平中位数更高。

过滤数据

现在我们将根据阳性和阴性心脏病患者过滤数据。 我们将从过滤阳性心脏病患者的数据开始:

pos_data = 数据[数据['目标']==1]

pos_data.describe()

同样,我们将根据阴性心脏病患者过滤数据:

pos_data = 数据[数据['目标']==0]

pos_data.describe()

第 3 步:使用机器学习算法

准备

在这里,我们将通过将特征分配给 X 并将最后一列分配给预测变量 Y 来准备训练数据:

X = data.iloc[:, :-1].values

Y = data.iloc[:, -1}.values

然后,我们将数据分成两组,训练集和测试集:

从 sklearn.model_selection 导入 train_test_split

x_train, x_test, y_train, y_test = train_test_split(X,y,test_size = 0.2, random_state = 1)

最后,我们将对数据进行归一化,使其分布的平均值为 0:

从 sklearn.preprocessing 导入 StandardScaler

sc = 标准缩放器()

x_train = sc.fit_transform(x_train)

x_test = sc.transform(x_test)

训练模型

在本节中,我们将使用多种机器学习算法并找到提供最高准确度的算法:

第一个模型:逻辑回归

从 sklearn.metrics 导入分类报告

从 sklearn.linear_model 导入 LogisticRegression

model1 = LogisticRegression(random_state=1) # 获取模型实例

model1.fit(x_train, y_train) # 训练/拟合模型

y_pred1 = model1.predict(x_test) # 得到y个预测

print(classification_report(y_test, y_pred1)) # 输出精度

该模型的准确率为 74%。

第二个模型:K-NN(K-最近邻)

从 sklearn.metrics 导入分类报告

从 sklearn.neighbours 导入 KNeighboursClassifier

model2 = KNeighboursClassifier() # 获取模型实例

model2.fit(x_train, y_train) # 训练/拟合模型

y_pred2 = model2.predict(x_test) # 得到y个预测

print(classification_report(y_test, y_pred2)) # 输出精度

该模型的准确率为 75%。

第三种模型:支持向量机(SVM)

从 sklearn.metrics 导入分类报告

从 sklearn.svm 导入 SVC

model3 = SVC(random_state=1) # 获取模型实例

model3.fit(x_train, y_train) # 训练/拟合模型

y_pred3 = model3.predict(x_test) # 得到y个预测

print(classification_report(y_test, y_pred3)) # 输出精度

该模型的准确率为 75%。

第四模型:朴素贝叶斯分类器

从 sklearn.metrics 导入分类报告

从 sklearn.naive_bayes 导入 GaussianNB

model4 = GaussianNB() # 获取模型实例

model4.fit(x_train, y_train) # 训练/拟合模型

y_pred4 = model4.predict(x_test) # 得到y个预测

print(classification_report(y_test, y_pred4)) # 输出精度

该模型的准确率为 77%。

第五个模型:随机森林

从 sklearn.metrics 导入分类报告

从 sklearn.ensemble 导入 RandomForestClassifier

model6 = RandomForestClassifier(random_state=1)# 获取模型实例

model6.fit(x_train, y_train) # 训练/拟合模型

y_pred6 = model6.predict(x_test) # 得到y个预测

print(classification_report(y_test, y_pred6)) # 输出精度

该模型的最高准确率为 80%。

第六款:XGBoost

从 xgboost 导入 XGBClassifier

model7 = XGBClassifier(random_state=1)

model7.fit(x_train, y_train)

y_pred7 = model7.predict(x_test)

打印(分类报告(y_test,y_pred7))

该模型的准确率为 69%。

在测试了不同的机器学习算法后,我们发现最好的算法是随机森林,因为它为我们提供了 80% 的最佳准确度。

请记住,任何高于 80% 的准确率都好得令人难以置信,这可能是因为过度拟合。 这就是为什么 80% 是达到的最佳数字。

第 4 步:查找特征分数

在这里,我们将找到特征分数,它通过告诉我们哪个特征对我们的模型最有用来帮助我们做出重要决策:

# 获取重要性

重要性 = model6.feature_importances_

# 总结特征重要性

对于枚举中的 i,v(重要性):

print('特征:%0d,得分:%.5f' % (i,v))

我们发现前四个特征是胸痛类型 (cp)、达到的最大心率 (thalach)、主要血管数量 (ca) 和运动相对于休息引起的 ST 段压低 (oldpeak)。

结论

恭喜,您现在已经成功完成了心脏病预测项目。 我们有 13 个特征,其中最重要的是胸痛类型和达到的最大心率。

我们测试了六种不同的机器学习算法,发现最准确的算法是随机森林。 你应该用测试集测试这个模型,看看这个模型的效果如何。

另一方面,如果您想了解更多关于机器学习和 AI 的信息,我们建议您查看我们的AI 课程 您将直接向行业专家学习,并从事可以测试您知识的行业项目。 如果您对机器学习和人工智能领域的职业感兴趣,请查看它们。

如果您有兴趣了解有关机器学习的更多信息,请查看 IIIT-B 和 upGrad 的机器学习和 AI 执行 PG 计划,该计划专为工作专业人士设计,提供 450 多个小时的严格培训、30 多个案例研究和作业、IIIT -B 校友身份,5 个以上实用的实践顶点项目和顶级公司的工作协助。

机器学习如何帮助医疗保健行业?

如今,机器学习在医疗保健领域有许多有趣的用途。 总之,它的主要用途之一是检测和诊断疾病。 从检测罕见的遗传疾病到癌症的早期阶段,机器学习已被证明在这方面有很大帮助。 还有许多其他用途,如发现药物、影像诊断、维护智能健康记录、预防医学(如行为改变)、预测疾病爆发和复发、改进放射治疗、有效的临床研究和患者试验等等。

我怎样才能成为医疗保健数据科学家?

鉴于医疗保健行业是世界上最庞大的数据来源之一,预计对医疗保健数据科学家的需求将会增加。 医疗保健和数据科学的融合是一条充满希望且富有成效的道路,有抱负的健康数据科学家可以利用这种情况。 医疗数据科学是一个相对较新的领域; 它是统计学、数学、生物信息学、计算机科学和流行病学的混合体。 成为数据科学家的基础和技能是相同的,但您将只关注医疗数据和应用程序。 使用 Python、R 和 SAS 进行计算机编程的知识会有所帮助。 全球顶尖大学提供医疗数据科学专业的研究生课程。

医生需要了解数据科学吗?

随着人工智能和数据科学迅速进入主流,这些不仅仅是医疗保健领域的流行语。 这些技术在从大量数据集中提取临床有用信息方面的巨大意义正在鼓励医生和医生对这些领域重新产生兴趣。 了解数据科学为医生提供了额外的优势,因为他们可以使用多参数信息和从连续监测中获得的大量数据集快速准确地诊断罕见疾病。 人工智能通过有效的数据可视化技术辅助诊断,并帮助他们了解临床研究的统计重要性。