新闻详情

新闻详情

首页 / 资讯中心 / 详情

基于机器学习的糖尿病预测系统:从数据预处理到模型部署的完整实战

发布时间:2026/9/25 2:28:02来源:尧图网络
基于机器学习的糖尿病预测系统:从数据预处理到模型部署的完整实战
简介这是一份面向计算机相关专业学生与教师的机器学习课程设计项目源码以糖尿病预测为应用场景适合正在准备课程设计、期末大作业或希望进行项目实战演练的读者参考使用。项目为个人大三学期课程设计经导师指导与评审获得高分通过代码完整且功能验证稳定可直接运行。压缩包共46个文件约55KB以xml配置文件、properties属性文件、java源码、jsp页面、scala脚本及css样式等为主涵盖后端逻辑、前端展示与项目配置等模块目录结构清晰便于按模块阅读与二次开发。目前已有359人学习下载。读者可从中获取完整的项目结构、预测模型实现思路与前后端整合方案适合小白入门进阶也可作为毕设立项或功能DIY的基础具备较高的学习借鉴价值。1. 从一份课程设计源码说起糖尿病预测系统到底在做什么拿到「基于机器学习的糖尿病预测系统源代码」这个题目很多人第一反应是去找一份能跑的代码交差。但真正做过的人知道这类课程设计高分项目拼的不是界面多花哨而是数据处理、特征工程和模型评估这条链路是否站得住脚。糖尿病预测本质上是一个二分类问题给定患者的若干生理指标判断其是否患病。公开数据集里最常用的是 Pima Indians Diabetes 数据集包含怀孕次数、血糖、血压、皮脂厚度、胰岛素、BMI、糖尿病家族史、年龄八个特征标签是 0 或 1。这个系统要解决的核心诉求是用传统机器学习模型跑出一条可解释、可复现、指标合理的预测流水线。适合谁正在做机器学习课程设计的学生、想快速搭一个医疗二分类 demo 的入门者以及需要一份结构清晰的项目骨架来二次开发的人。下面我按实际落地顺序把这份源码背后的东西拆开讲清楚。2. 数据预处理与特征工程模型效果的分水岭2.1 为什么 Pima 数据集不能直接喂给模型Pima 数据集看着干净实际上藏了不少坑。最典型的是血糖、血压、皮脂厚度、胰岛素、BMI 这几个字段里用 0 表示缺失值。如果你不处理模型会把「血压为 0」当成一个真实的极端值来学直接拉低效果。我一般先做缺失值统计再决定填充策略。另一个问题是类别不平衡患病样本大约占 35%不算特别严重但评估时不能只看准确率。先看数据加载和缺失值探查import pandas as pd import numpy as np # 列名按 Pima 数据集标准字段命名 columns [Pregnancies, Glucose, BloodPressure, SkinThickness, Insulin, BMI, DiabetesPedigreeFunction, Age, Outcome] df pd.read_csv(diabetes.csv, namescolumns) # 这些字段的 0 是无效值先替换成 NaN zero_as_nan [Glucose, BloodPressure, SkinThickness, Insulin, BMI] df[zero_as_nan] df[zero_as_nan].replace(0, np.nan) # 查看每列缺失比例 print(df.isnull().mean().sort_values(ascendingFalse))逻辑说明把生理指标里不可能为 0 的字段先标记为缺失避免模型学到错误分布。参数上replace(0, np.nan)只对指定列生效Pregnancies为 0 是合理的不能动。跑完你会看到Insulin和SkinThickness缺失比例偏高这两个字段后面要重点处理。2.2 缺失值填充中位数比均值更稳医疗数据里异常值多均值容易被拉偏中位数是更稳妥的选择。按类别分组填充会更细但课程设计里用全局中位数已经够用。如果时间充裕可以按Outcome分组填充效果通常略好。# 用中位数填充缺失值 for col in zero_as_nan: median_val df[col].median() df[col] df[col].fillna(median_val) # 确认没有残留缺失 assert df.isnull().sum().sum() 0参数说明median()对偏态分布更鲁棒。填充后一定要用assert或sum()复查我见过太多人填完没检查后面模型报错才发现还有 NaN。这一步做完数据才算真正可用。2.3 特征标准化与相关性筛查逻辑回归、SVM、KNN 这些模型对量纲敏感标准化是必须的。树模型如随机森林不强制但统一处理没坏处。标准化用StandardScaler注意只能在训练集上 fit再 transform 测试集否则会数据泄漏。from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split X df.drop(Outcome, axis1) y df[Outcome] # 先划分再标准化避免测试集信息泄漏 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)参数说明stratifyy保证训练集和测试集里患病比例一致小数据集上这个参数很关键。random_state42固定随机种子保证结果可复现课程设计答辩时这点会被问到。标准化器只在训练集 fit这是铁律测试集只能用训练集的均值和方差来 transform。特征相关性也值得看一眼Glucose通常和标签相关性最高SkinThickness、Insulin偏低。如果要做特征筛选可以按相关性或方差阈值砍掉一两个弱特征但 Pima 只有八个特征全保留问题不大。3. 模型选型与训练从逻辑回归到集成模型3.1 为什么先跑逻辑回归做基线很多人一上来就上 XGBoost结果答辩时说不清为什么。逻辑回归可解释性强系数能直接反映特征影响方向作为基线最合适。它训练快、不容易过拟合指标也能给你一个参照。如果逻辑回归 AUC 能到 0.80 以上说明数据本身信号够再上复杂模型才有意义。from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score, roc_auc_score, classification_report lr LogisticRegression(max_iter1000, random_state42) lr.fit(X_train_scaled, y_train) y_pred lr.predict(X_test_scaled) y_prob lr.predict_proba(X_test_scaled)[:, 1] print(Accuracy:, accuracy_score(y_test, y_pred)) print(AUC:, roc_auc_score(y_test, y_prob)) print(classification_report(y_test, y_pred))参数说明max_iter1000是因为标准化后数据收敛可能偏慢默认 100 有时会报收敛警告。predict_proba取第二列是患病概率AUC 用它算。classification_report能同时看精确率、召回率和 F1医疗场景下召回率比准确率更值得关注漏诊代价高。3.2 随机森林与梯度提升的对比实验基线跑完接着上随机森林和梯度提升。随机森林抗过拟合、对缺失和异常值不敏感梯度提升在中小数据集上通常指标更高但调参更敏感。课程设计里两个都跑做个对比表答辩时就是加分项。from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier models { RandomForest: RandomForestClassifier( n_estimators200, max_depth6, random_state42), GradientBoosting: GradientBoostingClassifier( n_estimators150, learning_rate0.05, max_depth3, random_state42) } for name, model in models.items(): model.fit(X_train_scaled, y_train) prob model.predict_proba(X_test_scaled)[:, 1] print(f{name} AUC: {roc_auc_score(y_test, prob):.4f})参数说明随机森林n_estimators200是效果和速度的平衡点max_depth6限制深度防过拟合。梯度提升learning_rate0.05配n_estimators150是常见的小步长组合max_depth3控制单棵树复杂度。这两个参数组不是最优但稳定适合课程设计直接抄。3.3 交叉验证别被单次划分骗了单次 train_test_split 的结果波动可能很大尤其是样本量小的时候。用 5 折或 10 折交叉验证看均值结论才靠谱。这一步很多人偷懒跳过结果换个随机种子指标掉一大截答辩现场翻车。from sklearn.model_selection import cross_val_score rf RandomForestClassifier(n_estimators200, max_depth6, random_state42) scores cross_val_score(rf, X_train_scaled, y_train, cv5, scoringroc_auc) print(CV AUC mean:, scores.mean(), std:, scores.std())参数说明cv5是折数样本少可以用 10。scoringroc_auc指定评估指标也可以换成f1或recall。看mean和std标准差大说明模型不稳定得回头查数据或调参。交叉验证只在训练集上做测试集留到最后评估一次。4. 系统封装与可视化让课程设计能演示4.1 用 Flask 把模型包成一个预测接口光有脚本不够课程设计通常要求能演示。最轻量的做法是用 Flask 起一个接口前端传 JSON后端返回预测结果。模型用 joblib 保存避免每次启动重新训练。import joblib from flask import Flask, request, jsonify # 训练完后保存模型和标准化器 joblib.dump(rf, model.pkl) joblib.dump(scaler, scaler.pkl) app Flask(__name__) model joblib.load(model.pkl) scaler joblib.load(scaler.pkl) app.route(/predict, methods[POST]) def predict(): data request.get_json() features np.array([data[features]]) scaled scaler.transform(features) prob model.predict_proba(scaled)[0][1] return jsonify({probability: round(float(prob), 4), label: int(prob 0.5)}) if __name__ __main__: app.run(debugTrue)逻辑说明接口接收一个特征数组标准化后用模型算概率返回概率和标签。参数上prob 0.5是默认阈值医疗场景可以调低到 0.4 提高召回。debugTrue只用于开发正式演示记得关掉。这个接口足够撑起一个课程设计的演示环节。4.2 特征重要性与混淆矩阵可视化答辩时老师最爱问「哪些特征重要」「模型错在哪」。随机森林自带特征重要性混淆矩阵能直观展示误判分布。这两张图一摆项目完整度立刻不一样。import matplotlib.pyplot as plt from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay # 特征重要性 importances pd.Series(rf.feature_importances_, indexX.columns) importances.sort_values().plot(kindbarh) plt.title(Feature Importance) plt.tight_layout() plt.savefig(importance.png) # 混淆矩阵 cm confusion_matrix(y_test, rf.predict(X_test_scaled)) ConfusionMatrixDisplay(cm).plot() plt.savefig(confusion_matrix.png)参数说明feature_importances_是随机森林的属性值越大越重要。混淆矩阵用ConfusionMatrixDisplay画比手写热力图省事。保存图片而不是show()方便写进报告。通常Glucose和BMI排前两位和医学常识一致这点可以在报告里点出来。5. 避坑与排查那些让指标突然崩掉的细节5.1 现象准确率很高但 AUC 只有 0.5原因标签泄漏或标准化顺序错了。常见的是先对全量数据做了标准化再划分测试集信息渗进训练集或者把Outcome误当成特征喂进去了。解决严格按「先划分、再 fit 训练集、transform 测试集」的顺序检查特征列里没有标签。5.2 现象模型每次跑结果都不一样原因随机种子没固定或者交叉验证的 shuffle 没设种子。解决所有涉及随机的环节都加random_state包括train_test_split、模型初始化、cross_val_score的cv参数。课程设计里结果可复现是基本要求。5.3 现象Insulin 字段填充后模型反而变差原因Insulin 缺失比例太高中位数填充引入的噪声大于信息量。解决要么直接删掉这个特征要么用模型预测填充如 KNNImputer要么加一个「是否缺失」的指示特征。我一般先试删除对比指标再决定。5.4 现象Flask 接口传参报 shape 错误原因前端传的是一维数组scaler.transform要求二维。解决用np.array([data[features]])包一层或者reshape(1, -1)。这个错误信息不明显排查时先打印features.shape确认维度。5.5 现象交叉验证分数远低于单次划分原因单次划分恰好分到了容易的样本交叉验证暴露了真实泛化能力。解决以交叉验证为准别拿单次高分自我安慰。如果 CV 分数低回头查数据质量或换模型而不是换随机种子。6. 把阈值调优和代价敏感做成项目亮点大部分课程设计止步于默认 0.5 阈值但医疗预测里阈值选择直接决定漏诊和误诊的平衡。把这块做深项目立刻从「能跑」变成「有思考」。具体做法是画 ROC 曲线找到约登指数最大点或者按业务需求定召回下限再选阈值。from sklearn.metrics import roc_curve fpr, tpr, thresholds roc_curve(y_test, y_prob) youden tpr - fpr best_threshold thresholds[youden.argmax()] print(Best threshold:, best_threshold) # 按新阈值重新评估 y_pred_new (y_prob best_threshold).astype(int) print(classification_report(y_test, y_pred_new))参数说明youden tpr - fpr是约登指数最大值对应的阈值兼顾灵敏度和特异度。thresholds和fpr、tpr一一对应用argmax取索引。跑完对比默认阈值和新阈值的召回率通常能提升几个百分点。这一步的结论写进报告比堆模型数量有说服力。另一个进阶方向是代价敏感学习。给LogisticRegression加class_weightbalanced或者给随机森林设class_weight{0:1, 1:2}让模型更关注患病样本。代价矩阵怎么定简单做法是假设漏诊代价是误诊的两倍按这个比例设权重。这不是精确的医学结论但体现了你对业务的理解答辩时能讲清楚思路就够了。方案召回率精确率适用场景默认阈值 0.5基准基准快速验证约登指数阈值提升略降平衡漏诊误诊class_weight 平衡明显提升下降漏诊代价高最后说个我自己的习惯每次改完预处理或模型参数一定重新跑一遍完整的交叉验证把 AUC 和召回率记在一个表格里。课程设计最怕的就是改了一处忘了另一处最后自己也说不清哪个版本最好。留一份实验记录比任何技巧都管用。希望帮到你。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

用 Go 打造交通数据分析可视化平台:从 PRD 到可演示数据产品的完整实战指南 2026/9/25 3:00:51

用 Go 打造交通数据分析可视化平台:从 PRD 到可演示数据产品的完整实战指南

教程文档 【免费下载链接】easy-vibe 从 0 到 1 学会 vibe coding,项目制学习 项目地址: https://gitcode.com/datawhalechina/easy-vibe 点击查看 免费下载 这是一篇面向 datawhalechina/easy-vibe 项目 Stage 2 学习者的综合实战指南。你将围绕一份真…

阅读更多 →
2024数学建模国赛C题:从数据清洗到线性规划的全流程复现 2026/9/25 3:00:51

2024数学建模国赛C题:从数据清洗到线性规划的全流程复现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Containerization x86_64 部署构建指南:基于 aarch64 开发容器交叉产出 Linux 部署包 2026/9/25 3:00:32

Containerization x86_64 部署构建指南:基于 aarch64 开发容器交叉产出 Linux 部署包

容器运行时虚拟化云原生 【免费下载链接】containerization Containerization is a Swift package for running Linux containers on macOS. 项目地址: https://gitcode.com/gh_mirrors/cont/containerization 点击查看 免费下载 本指南围绕 make dist-x86_64 展开…

阅读更多 →
BAML jsonish 柔性解析器:把 LLM 自由文本可靠地解析成结构化数据 2026/9/25 3:00:32

BAML jsonish 柔性解析器:把 LLM 自由文本可靠地解析成结构化数据

编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 本文聚焦 BAML 引擎中的 jsonish 库(位于 engine/baml-lib/jsonish)&…

阅读更多 →
TEN Framework 中的 clasp:答案集求解器的工作原理、构建方式与在依赖解析中的落地 2026/9/25 3:00:32

TEN Framework 中的 clasp:答案集求解器的工作原理、构建方式与在依赖解析中的落地

人工智能AI Agent多模态语音AI 应用 【免费下载链接】ten-framework Open-source framework for conversational voice AI agents 项目地址: https://gitcode.com/TEN-framework/ten-framework 点击查看 免费下载 本篇以 vendored 在仓库内的 clasp README 为核心&…

阅读更多 →
Falcon 发布全流程指南:从版本号到稳定分支的 Release Manager 实操手册 2026/9/25 3:00:26

Falcon 发布全流程指南:从版本号到稳定分支的 Release Manager 实操手册

后端Web框架API设计 【免费下载链接】falcon The no-magic web API and microservices framework for Python developers, with a focus on reliability and performance at scale. 项目地址: https://gitcode.com/gh_mirrors/fa/falcon 点击查看 免费下载 导读 本…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉