全文链接:https://tecdat.cn/?p=39864
原文出处:拓端数据部落公众号
分析师:Weilong Zhang
本研究旨在利用机器学习和深度学习模型对糖尿病数据进行分析和预测。通过对糖尿病数据集的读取、预处理、特征分析,运用多种机器学习算法如逻辑回归、K近邻、决策树、随机森林、支持向量机以及前馈神经网络等进行模型训练和评估。比较不同模型在训练集和测试集上的准确率等指标,分析各模型的性能特点,最终为糖尿病的预测提供有效的模型选择和参考依据。
关键词
糖尿病预测;机器学习;深度学习;模型评估
一、引言
糖尿病作为一种常见的慢性疾病,对全球公共卫生造成了巨大的负担。准确地预测糖尿病的发生对于早期干预和治疗具有重要意义。机器学习和深度学习技术在医学数据的分析和预测方面展现出了强大的能力。本研究将运用多种机器学习和深度学习算法对糖尿病数据集进行处理和分析,构建能够准确预测糖尿病的模型。
二、数据获取与预处理
2.1 数据获取
从特定路径读取糖尿病数据集,该数据集包含了多个特征,如怀孕次数(Pregnancies)、血糖值(Glucose)、血压(BloodPressure)、皮肤厚度(SkinThickness)、胰岛素水平(Insulin)、身体质量指数(BMI)、糖尿病家族遗传函数(DiabetesPedigreeFunction)、年龄(Age)以及是否患有糖尿病的结果(Outcome)等信息。
2.2 数据检查
通过查看数据集的形状,可以得知数据集包含768条记录和9个特征。
df.shape
检查数据集中是否存在缺失值,结果显示该数据集中没有缺失值。
df.isnull().sum()
查看数据集的信息,了解各特征的数据类型,其中大部分特征为整数类型,BMI和DiabetesPedigreeFunction为浮点数类型。
df.info()
2.3 统计分析
对数据集进行描述性统计分析,获取各特征的统计量,如计数、均值、标准差、最小值、25%分位数、50%分位数、75%分位数和最大值等。
df.describe()
统计患有糖尿病和未患有糖尿病的患者数量,结果显示未患有糖尿病的患者有500人,患有糖尿病的患者有268人,占比分别为65%和35%。
对数据按是否患有糖尿病进行分组,计算各特征的均值。结果表明,糖尿病患者的所有特征均值普遍高于非糖尿病患者,特别是血糖和胰岛素水平,糖尿病患者的值明显更高。
绘制相关系数热图,分析各特征之间的相关性,发现所有特征之间存在中等程度的相关性。
三、数据准备
将数据集的特征和标签进行分离,特征数据存储在变量x
中,标签数据存储在变量y
中。
-
x = df.drop(columns='Outcome', axis = 1)
-
y = df['Outcome']
对特征数据进行标准化处理,使用StandardScaler
将数据转换为均值为0,标准差为1的标准正态分布。
-
scalar = StandardScaler()
-
scalar.fit(x)
-
将标准化后的数据划分为训练集和测试集,测试集占比为20%,并设置随机种子为2,以确保结果的可重复性。
四、机器学习模型训练与评估
4.1 逻辑回归模型
使用逻辑回归模型对训练数据进行训练,并对训练集和测试集进行预测。逻辑回归模型在训练集上的准确率为79%,在测试集上的准确率为76%。
-
lr = LogisticRegression()
-
lr = lr.fit(train_x, train_y)
4.2 K近邻模型
构建K近邻模型,设置邻居数量为50,对训练数据进行训练和预测。K近邻模型在训练集上的准确率为77%,在测试集上的准确率为73%。
4.3 决策树模型
通过循环找到最优的随机种子,以获得最佳的决策树模型。决策树模型在训练集上的准确率达到了100%,但在测试集上的准确率为73%,存在一定的过拟合现象。
4.4 随机森林模型
构建随机森林模型,设置树的数量为500,并使用最优随机种子。随机森林模型在训练集上的准确率为100%,在测试集上的准确率为73%。
-
rf = RandomForestClassifier(n_estimators=500, random_state = best_random_state)
-
rf.fit(train_x, train_y)
-
rf_train_pred = rf.predict(train_x)
-
rf_test_pred = rf.predict(test_x)
-
print("Random Forest Training Accuracy: ", round(accuracy_score(train_y, rf_train_pred), 2)*100)
-
print("Random Forest Testing Accuracy: ", round(accuracy_score(test_y, rf_test_pred), 2)*100)
4.5 支持向量机模型
使用支持向量机模型,核函数选择线性核。支持向量机模型在训练集上的准确率为78.66%,在测试集上的准确率为77.27%。
-
classifier = SVC(kernel = 'linear')
-
classifier.fit(train_x, train_y)
-
print("SVM Training Accuracy: ", round(classifier.score(train_x, train_y)*100, 2))
-
print("SVM Testing Accuracy: ", round(classifier.score(test_x, test_y)*100, 2))
五、深度学习模型(前馈神经网络)
5.1 数据预处理
将标签数据进行独热编码,同时对训练集和测试集的特征数据进行标准化处理。
5.2 模型构建与训练
构建一个简单的前馈神经网络模型,包含两个隐藏层,每层有64个神经元,激活函数使用ReLU,输出层使用softmax激活函数。编译模型时,使用adam优化器,损失函数为交叉熵损失函数,评估指标为准确率。
history = model.fit(train_X, train_y, epochs=50, batch_size=32, validation_data=(test_X, test_y))
在训练过程中,发现模型存在过拟合现象,即训练集上的准确率较高,但测试集上的准确率较低。为了解决过拟合问题,使用正则化、Dropout和EarlyStopping等技术。
5.3 模型评估
经过优化后的模型,在训练集上的准确率为80.46%,在测试集上的准确率为75.32%,过拟合现象得到了一定程度的缓解。
六、模型应用与结果可视化
将训练好的随机森林模型保存,以便后续使用。对新的输入数据进行预测,判断该患者是否患有糖尿病。
绘制各特征按是否患有糖尿病的分布直方图,直观地展示不同特征在糖尿病患者和非糖尿病患者中的分布情况。
绘制随机森林模型在测试集上的混淆矩阵,计算精确率、召回率和F1值等指标,进一步评估模型的性能。
cf_matrix = confusion_matrix(test_y, rf_test_pred)
七、结论与展望
7.1 结论
本研究通过对糖尿病数据集的分析和处理,运用多种机器学习和深度学习模型进行了糖尿病的预测。从各模型的训练和测试结果来看,不同模型在准确率等指标上表现出了一定的差异。
深度学习模型(简单前馈神经网络)在未进行优化时,存在较严重的过拟合问题,训练集准确率较高但测试集准确率较低。经过采用正则化、Dropout和EarlyStopping等技术进行优化后,模型在训练集上的准确率为80.46%,测试集上的准确率为75.32%,过拟合现象得到了一定程度的缓解,表明这些优化技术对于提高深度学习模型的泛化能力具有重要作用。