数据挖掘实战-基于随机森林算法的糖尿病分类预测模型

 

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.项目背景

2.数据集介绍

3.技术工具

4.实验过程

4.1导入数据

4.2数据预处理

4.3数据可视化

4.4特征工程

4.5构建模型

4.6模型评估

4.7特征重要性

源代码


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()

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

艾派森

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值