本文探讨了机器学习在理解心脏病预测关键指标方面的潜力。心脏病给全球医疗保健系统带来了巨大的负担。如果问题及时解决,许多不良事件是可以避免的。机器学习在诊断高危人群发生不良心脏后果的可能性方面大有可为。
本文将使用“心脏病个人关键指标”数据集来识别有心脏病风险的个体。该数据集是美国疾病控制中心 (CDC) 每年对 400,000 名成年人健康状况进行的调查。
EDA(探索性数据分析)对于任何分析,我们都需要数据。因此,首先,我们将导入数据。导入数据从以下代码行开始。
import pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as sns
我们分别在上面的代码行中导入了 numpy 和 pandas 库。然后,我们导入了 matplotlib 库。这对于 Pythonn 中的交互式可视化非常有用。Seaborn 是另一个更适合处理 pandas 数据框的数据可视化库。下一步是创建一个数据框。Pandas 数据框是一个具有行和列的二维表格结构。
df=pd.read_csv('heart_disease.csv' ) df.head()
该文件名为heart_disease, 上面这行代码从外部源上传数据。'read_csv' 使我们能够读取 csv 文件。代码df.head() 显示数据集的前 5 行,如下所示。
接下来,我们需要在数据集中查找信息。这可以通过使用 info *()*函数来完成。信息将包括范围索引、数据列、非空计数、内存使用情况和数据类型。以下是代码行和输出。
df.info()
接下来,我们借助*isnull()*函数检查 pandas 数据框中的空值。函数 isnull().sum() 显示数据集中缺失的值。代码行和输出如下
df.isnull().sum()
从输出结果可以看出,数据集中没有缺失值。接下来,我们想以系列的形式获取每列的数据类型。代码行和输出如下。
obj_list = df.select_dtypes(include='object' ).columns obj_list
在这里,我们创建了一个包含对象数据类型的对象列表。
接下来,我们将用值 0 和 n-classes-1 对目标标签进行编码。这会将标签转换为机器可以轻松读取的数字形式。为此,我们将从sklearn.preprocessing 库中导入LabelEncoder 模块。以下是代码行和输出
from sklearn.preprocessing import LabelEncoder le = LabelEncoder()for obj in obj_list: df[obj] = le.fit_transform(df[obj].astype(str))
从输出结果可以看出,标签已经转换为数字形式。接下来,我们要检查每个参数与目标心脏病之间的关系。这将通过使用相关函数来实现。相关性衡量两个数据集之间关系的强度,正相关表示一个变量对另一个变量的强烈依赖,负相关表示反比关系。相关性的范围在 -1 到 +1 之间。代码行和输出如下
correlation=df.corr() correlation
从上面的输出中,让我们分析一些与我们的目标(即心脏病)有关的变量。BMI=0.051803, smoking=0.107764, Alcohol drinking = -0.032080, Stroke = 0.196835, Physical Health = 0.170721, Mental Health = 0.028591, Age category = 0.233432, Diabetic = 0.168553, Physical activity = -0.100030, General Health = -0.011062, 和 Sleep time = 0.008327.
BMI=0.051803,吸烟=0.107764,饮酒=-0.032080,中风=0.196835,身体健康=0.170721,心理健康=0.028591,年龄类别=0.233432,糖尿病=0.168553,身体活动=-0.100030,一般健康=-0.011062,睡眠时间=0.008327。
可以看出,身体活动和一般健康与减少不良心脏结果相关;相反,中风、糖尿病、吸烟和身体健康状况与不良心脏结果呈相对正相关。
模型开发我们将继续标记输入和输出。这里,“Disease”是目标变量,相关个人是否患有心脏病将根据提供的输入确定。模型开发的第一步是通过从 sklearn 库导入 train_test_split 方法执行训练测试拆分。X 将具有独立变量,y 将具有目标变量。数据集的 30% 将是测试数据。对于确定性的训练测试拆分,random_state 设置为整数值。因此,代码行是
X = df.drop('HeartDisease' , axis=1 ).values y = df['HeartDisease' ].valuesfrom sklearn.model_selection import train_test_split np.random.seed(41 ) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3 )
上面的代码行将数据分成训练和测试数据集,以测量模型泛化并预测模型的未知数据。现在,我们将借助两种不同的算法(即 kNN、逻辑回归和随机森林分类器)开发模型。
KNN kNN 的工作原理是选择邻居的数量 k 并计算欧几里得距离。然后,计算每个类别中的数据点数,并将新数据点分配给该类别。让我们看看代码行和以准确率形式表示的相应输出
from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier().fit(X_train, y_train) knn.score(X_test, y_test)
逻辑回归 从 sklearn.linear_model 中,我们将导入逻辑回归模块,然后拟合训练数据。让我们看看代码行和相应的输出(以 accuracy.y 的形式)
from sklearn.linear_model import LogisticRegression np.random.seed(41) lr = LogisticRegression().fit(X_train, y_train) lr.score(X_test, y_test)
随机森林分类器 从 sklearn.ensemble 中,我们将导入逻辑随机森林分类器模块,然后拟合训练数据。让我们看看代码行和相应的输出(以 accuracy.y 的形式)
from sklearn.ensemble import RandomForestClassifier np.random.seed(41) rf = RandomForestClassifier().fit(X_train, y_train) rf.score(X_test, y_test)
在所有上述情况下,我们都使用了*np.random.seed()*来获取每次运行的最幸运数字。通过准确率,我们评估了各种模型的性能。
模型评估虽然我们已经借助准确度得分评估了模型,但混淆矩阵可以让我们进一步了解模型开发过程中的错误分类方面。混淆矩阵如下所示
预测:是 预测:否 Total 实际:是 一个(TP) b (FN) a+b(实际是) 实际:否 (FP) 总氮 c+d (实际数量) Total a+c(预测是) b+d (预测数量) 加减乘除
其中,TP = 真阳性,FN = 假阴性,FP = 假阳性,TN = 真阴性通过 KNN、逻辑回归和随机森林分类器的混淆矩阵 这三种算法的混淆矩阵的代码行及其各自的 输出如下。
逻辑回归 from sklearn.metrics import confusion_matrix prediction=lr.predict(X_test) prediction confusion_matrix=confusion_matrix(y_test,prediction) confusion_matrix
KNN from sklearn.metrics import confusion_matrix prediction=knn.predict(X_test) prediction confusion_matrix=confusion_matrix(y_test,prediction) confusion_matrix
随机森林分类器 from sklearn.metrics import confusion_matrix prediction=rf.predict(X_test) prediction confusion_matrix=confusion_matrix(y_test,prediction) confusion_matrix
写在最后在分类器中,我们可以看到 KNN 的准确率为 90.53%,逻辑回归的精度为 91.45%,随机森林分类器的准确率为 90.55%。进一步评估模型需要生成混淆矩阵以了解分类模式。在逻辑回归的情况下,95,939 个样本中有 87,745 个被正确分类,而 KNN 为 86,863 个,随机森林分类器为 86,873 个。虽然所有算法的准确率都超过 90%,但逻辑回归是最准确的。
关键要点 KNN、逻辑回归和随机森林分类器可以高准确率将个体分为高风险和低风险类别。 高血压、高胆固醇、吸烟、糖尿病和体力活动是导致心脏病的重要因素。