🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
目录
1.项目背景
糖尿病作为一种全球范围内日益严重的慢性代谢性疾病,其发病率和并发症风险持续攀升,给公共卫生系统带来了巨大负担。随着医疗信息化的普及,电子健康记录和临床数据库积累了海量的患者信息,如何从这些高维度、非线性的医学数据中提取有价值的知识成为现代医疗研究的重点。数据挖掘技术为这一挑战提供了新的解决思路,它能够通过智能算法发现数据中隐藏的规律和关联关系。随机森林算法因其独特的集成学习机制和良好的抗过拟合能力,在医疗数据分析领域展现出显著优势。该算法不仅能处理复杂的特征交互作用,还能评估变量的重要性,这对理解糖尿病多种风险因素的影响程度具有重要价值。当前医疗领域亟需建立更精准的疾病预测模型,以辅助临床早期筛查和干预决策。本研究旨在探索随机森林算法在糖尿病分类预测中的应用潜力,通过构建高性能的预测模型,为医疗工作者提供可靠的辅助诊断工具,同时为糖尿病发病机制的多因素分析提供数据支持,这对提升慢性病管理的科学性和效率具有重要的现实意义。
2.数据集介绍
该数据集最初基于 Ahlam Rashid 在 Mendeley Data 上上传的“糖尿病数据集”。原始数据集链接为:https://data.mendeley.com/datasets/wj9rwkp9c2/1。原始数据集共包含 1000 名受试者,分为三类:糖尿病患者、非糖尿病患者和预测糖尿病患者。在 1000 名受试者中,844 名患有糖尿病,103 名非糖尿病,53 名预测患有糖尿病,导致类别极度不平衡。我们在原始数据集中发现了总共 174 名重复受试者,随后将其删除。删除重复受试者后,剩余 690 名糖尿病受试者、96 名非糖尿病受试者和 40 名预测患有糖尿病的受试者。
该数据集来源于Kaggle,该数据集设计用于多类别分类任务,以预测患者可能患有的糖尿病的阶段或类型。它包括各种与健康相关的特征,如年龄、体重指数、血糖水平、胰岛素水平、血压和生活方式因素。每条记录都标有一个糖尿病类,可以表示非糖尿病、糖尿病前期和糖尿病等类别。该数据集对于构建和评估医疗诊断中的机器学习模型非常有用,特别是对于糖尿病的早期检测和分类。
各变量含义解释如下:
3.技术工具
Python版本:3.9
代码编辑器:jupyter notebook
4.实验过程
4.1导入数据
导入第三方库并加载数据集
查看数据大小
查看数据基本信息
查看数据描述性统计
4.2数据预处理
查看缺失值
查看重复值
发现数据集中不存在缺失值和重复值
4.3数据可视化
4.4特征工程
导入建模库
对类别变量进行编码处理,准备建模数据、拆分数据集为训练集和测试集
4.5构建模型
初始化各模型,并训练
可以看出随机森林模型的准确率最高,为98.11% ,选其为最终模型。
4.6模型评估
4.7特征重要性
源代码
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('Multiclass Diabetes Dataset.csv')
df.head()
df.shape
df.info()
df.describe().T
df.isnull().sum()
df.duplicated().sum()
plt.figure(figsize=(6, 4))
sns.countplot(data=df, x='Class', hue='Gender')
plt.title("Class Distribution by Gender")
plt.xlabel("Diabetes Class")
plt.ylabel("Count")
plt.legend(title="Gender")
plt.tight_layout()
plt.show()
plt.figure(figsize=(8, 5))
sns.boxplot(data=df, x='Class', y='AGE', palette="coolwarm")
plt.title("Age Distribution by Diabetes Class")
plt.tight_layout()
plt.show()
plt.figure(figsize=(8, 5))
sns.scatterplot(data=df, x='BMI', y='HbA1c', hue='Class', style='Gender')
plt.title("BMI vs HbA1c by Class and Gender")
plt.tight_layout()
plt.show()
key_features = ['HbA1c', 'Chol', 'TG', 'BMI']
for feature in key_features:
plt.figure(figsize=(7, 4))
sns.violinplot(data=df, x='Class', y=feature, palette="pastel")
plt.title(f"{feature} Distribution by Class")
plt.tight_layout()
plt.show()
numeric_cols = ['AGE', 'Urea', 'Cr', 'HbA1c', 'Chol', 'TG', 'HDL', 'LDL', 'VLDL', 'BMI']
plt.figure(figsize=(10, 8))
sns.heatmap(df[numeric_cols].corr(), annot=True, cmap="Blues", fmt=".2f")
plt.title("Correlation Heatmap of Numeric Features")
plt.tight_layout()
plt.show()
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import accuracy_score
# Models
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.naive_bayes import GaussianNB
from sklearn.neighbors import KNeighborsClassifier
# 标签编码分类特征
le_gender = LabelEncoder()
df['Gender'] = le_gender.fit_transform(df['Gender'])
le_class = LabelEncoder()
df['Class'] = le_class.fit_transform(df['Class']) # 多级编码
# 准备建模数据
X = df.drop('Class', axis=1)
y = df['Class']
# 拆分数据集为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
models = {
'Logistic Regression': LogisticRegression(max_iter=1000),
'Decision Tree': DecisionTreeClassifier(),
'Random Forest': RandomForestClassifier(),
'Support Vector Machine': SVC(),
'Naive Bayes': GaussianNB(),
'K-Nearest Neighbors': KNeighborsClassifier()
}
# 存储模型精度指标
accuracy_results = {}
for name, model in models.items():
model.fit(X_train, y_train)
preds = model.predict(X_test)
acc = accuracy_score(y_test, preds) * 100
accuracy_results[name] = acc
# 显示排序精度
print("Model Accuracies (%):")
for model, acc in sorted(accuracy_results.items(), key=lambda x: x[1], reverse=True):
print(f"{model}: {acc:.2f}%")
# 可视化
plt.figure(figsize=(10, 6))
sns.barplot(x=list(accuracy_results.values()), y=list(accuracy_results.keys()), palette="viridis")
plt.xlabel("Accuracy (%)")
plt.title("Model Accuracy Comparison - Multiclass Diabetes Classification")
plt.xlim(0, 100)
for index, value in enumerate(accuracy_results.values()):
plt.text(value + 1, index, f"{value:.2f}%", va='center')
plt.tight_layout()
plt.show()
from sklearn.metrics import accuracy_score,confusion_matrix,classification_report,auc,roc_curve
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
# 模型评估
y_pred = rfc.predict(X_test)
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
#打印特征重要性评分
feat_labels = X_train.columns[0:]
importances = rfc.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
index_list.append(feat_labels[j])
value_list.append(importances[j])
print(f + 1, feat_labels[j], importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('Ranking of the importance of each feature',fontsize=14)
plt.show()
资料获取,更多粉丝福利,关注下方公众号获取