简介:这份资源是面向计算机相关专业学生与项目实战学习者的毕业设计级完整方案,围绕糖尿病与高血压两种慢性病的风险预测展开,采用LightGBM算法构建分类模型,适合作为毕设、课程设计或期末大作业的参考实现。压缩包共139个文件,约118MB,其中126张png图片多为训练曲线、混淆矩阵与界面截图,另有xlsx数据表、pkl模型文件、md说明文档及核心py源码,并附带可执行程序,便于直接体验预测流程。目前已有204人学习下载,具备一定参考热度。读者可获得从数据预处理、特征工程到模型训练与评估的完整代码链路,以及已训练好的糖尿病与高血压模型文件,能快速复现结果并理解LightGBM在多病种风险预测中的调参思路;同时配套说明文档与可视化图表,有助于梳理答辩展示逻辑,也可在此基础上替换数据集或调整特征以拓展其他疾病预测场景。
1. 从一份 96.5 分的毕设说起:LightGBM 做糖尿病高血压预测到底靠不靠谱
先说结论:这份资源不是那种"跑个 demo 就完事"的玩具项目,它把糖尿病和高血压两个二分类预测模型都做成了可加载的.pkl文件,配了完整的 Python 源码、数据集和一份说明文档,还打包了一个疾病风险预测程序.exe可以直接双击看效果。我拿到手第一件事不是看代码,而是先把 exe 跑起来——因为一个毕设能不能打,看它敢不敢把成品交出来就知道了。跑通之后再去翻源码,发现特征工程、模型训练、持久化、GUI 调用这条链路是完整的,不是那种只贴一段model.fit()就交差的糊弄货。
这份资源适合谁?正在做计算机、人工智能、通信、自动化相关专业毕设或课设的学生,尤其是选题卡在"医疗数据 + 机器学习"这个方向的。也适合想拿一个真实二分类项目练手的人——LightGBM 在结构化数据上的表现,比很多人一上来就硬套神经网络要实在得多。评审能到 96.5 分,说明答辩时老师认可的不只是"能跑",而是整个流程讲得通、指标拿得出手、界面能演示。下面我按"这东西是什么 → 怎么跑起来 → 参数怎么调 → 坑在哪"的顺序拆一遍,你照着走基本能复现。
2. 拆开压缩包先看什么:目录结构、依赖与两个 pkl 模型的加载逻辑
2.1 目录里每个文件是干嘛的
解压之后别急着pip install,先把目录扫一遍。这份资源的文件构成大致是这样:
| 文件/目录 | 作用 | 要不要动 |
|---|---|---|
疾病风险预测程序.exe | 打包好的可执行程序,双击直接演示 | 只用来验证效果,不改 |
基于LightGBM的糖尿病高血压预测程序.md | 项目说明文档,讲流程和用法 | 先读一遍 |
hypertension.pkl | 高血压预测模型,已训练好持久化 | 直接加载,不重训 |
diabetes.pkl | 糖尿病预测模型,同上 | 直接加载,不重训 |
README.md | 快速上手说明 | 配合 md 文档看 |
LICENSE | 开源协议 | 商用前确认 |
.gitignore | Git 忽略规则 | 不影响运行 |
Dark/Light/on-accent.png | 界面主题截图 | 参考 UI 风格 |
两个.pkl是整个项目的核心资产。很多人拿到源码第一反应是"我要重新训练一遍",其实没必要——除非你要换数据集或者改特征,否则直接加载现成模型做推理就行,省时间还不容易翻车。
2.2 环境依赖与加载模型的最小代码
LightGBM 的 Python 包在 Windows 上装起来偶尔会闹脾气,建议先建虚拟环境再装。常见做法是:
# 建虚拟环境,避免污染全局 python -m venv venv # Windows 激活 venv\Scripts\activate # 装核心依赖,lightgbm 是重点,sklearn 用来做配套 pip install lightgbm scikit-learn pandas numpy joblib装完之后先别跑训练脚本,写个最小加载测试,确认两个 pkl 能正常读出来:
import joblib import numpy as np # 加载两个已训练好的模型,joblib 对 sklearn/lightgbm 对象兼容性好 hypertension_model = joblib.load("hypertension.pkl") diabetes_model = joblib.load("diabetes.pkl") # 打印模型类型,确认不是空文件或损坏 print("高血压模型类型:", type(hypertension_model)) print("糖尿病模型类型:", type(diabetes_model)) # 构造一条模拟样本做推理,特征维度要和训练时一致 # 这里假设是 8 维特征,实际以源码里的 feature 顺序为准 sample = np.array([[45, 1, 24.5, 130, 85, 5.6, 1, 0]]) pred = hypertension_model.predict(sample) print("高血压预测结果:", pred)逻辑说明:joblib.load是加载 sklearn 系模型的标准方式,比pickle对 numpy 数组更友好。predict返回的是类别标签(0/1),如果你要概率就换成predict_proba。参数上唯一要注意的是特征顺序和维度必须和训练时完全一致,差一列结果就全乱。源码里一般会有一个feature_columns列表,加载模型后先把它读出来对齐。
提示:如果
joblib.load报ModuleNotFoundError,八成是训练时用的 lightgbm 版本和你现在装的不一致,先pip show lightgbm看版本,再对照文档里的要求装。
3. 从原始数据到预测结果:特征工程、训练脚本与推理接口怎么串起来
3.1 数据长什么样,特征怎么选
糖尿病和高血压这类医疗数据集,常见来源是公开的流行病学调查数据,字段一般包括年龄、性别、BMI、血压值、血糖、家族史、吸烟饮酒等。这份资源的数据集已经清洗过,你要做的是理解每个字段的含义,而不是重新爬数据。
特征工程这块,LightGBM 的好处是对类别特征和缺失值相对宽容,不像逻辑回归那样必须做独热编码和归一化。但宽容不等于随便,几个关键点:
- 类别特征(性别、是否吸烟)要么转成整数编码,要么在
categorical_feature参数里声明,让 LightGBM 自己处理。 - 连续特征(年龄、BMI、血糖)不用标准化,树模型对量纲不敏感。
- 缺失值 LightGBM 会自己找最优分裂方向,但缺失比例超过 30% 的字段建议直接删。
我一般会先跑一遍df.describe()和df.isnull().sum(),心里有数再动手。
3.2 训练脚本的核心参数
如果你要重训或者换数据,训练脚本大致长这样:
import lightgbm as lgb from sklearn.model_selection import train_test_split from sklearn.metrics import roc_auc_score, accuracy_score import pandas as pd # 读数据,假设最后一列是标签 df = pd.read_csv("data.csv") X = df.drop(columns=["label"]) y = df["label"] # 划分训练集和测试集,stratify 保证正负样本比例一致 X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42, stratify=y ) # 构建 Dataset,LightGBM 原生格式,比 numpy 快 train_data = lgb.Dataset(X_train, label=y_train) valid_data = lgb.Dataset(X_test, label=y_test, reference=train_data) # 核心参数:二分类用 binary,树数量和学习率要配合调 params = { "objective": "binary", # 二分类任务 "metric": "auc", # 评估指标用 AUC,医疗场景比准确率靠谱 "boosting_type": "gbdt", # 梯度提升决策树 "num_leaves": 31, # 叶子数,越大越容易过拟合 "learning_rate": 0.05, # 学习率,小一点更稳 "feature_fraction": 0.9, # 每次迭代用 90% 特征,防过拟合 "bagging_fraction": 0.8, # 样本采样比例 "bagging_freq": 5, # 每 5 轮做一次采样 "verbose": -1 } # 训练,early_stopping 防止无效迭代 model = lgb.train( params, train_data, num_boost_round=500, valid_sets=[valid_data], callbacks=[lgb.early_stopping(50), lgb.log_evaluation(50)] ) # 评估 pred_prob = model.predict(X_test) print("AUC:", roc_auc_score(y_test, pred_prob))逻辑说明:objective=binary是二分类的固定写法,别写成multiclass。metric=auc是因为医疗预测里正负样本往往不平衡,准确率会被多数类带偏,AUC 更能反映模型区分能力。num_leaves和learning_rate是一对冤家——叶子多了学习率就得降,否则过拟合来得飞快。early_stopping(50)表示验证集指标 50 轮不提升就停,省得白跑。
参数怎么改:如果 AUC 上不去,先把num_leaves从 31 降到 15 试试,再降learning_rate到 0.02 并加大num_boost_round。如果训练集 AUC 高但测试集低,就是过拟合,加feature_fraction和bagging_fraction的约束。
3.3 推理接口怎么和 GUI 对接
exe 能跑起来,说明源码里有一个把模型预测包成函数的模块。典型写法是:
def predict_risk(model, features: dict): """接收前端传来的字段字典,返回风险等级""" # 按训练时的特征顺序拼成数组,顺序错了结果就废 order = ["age", "gender", "bmi", "sbp", "dbp", "glucose", "smoke", "family"] row = [features[k] for k in order] prob = model.predict_proba([row])[0][1] # 阈值 0.5 是默认,医疗场景可以按需求调 return {"probability": round(prob, 4), "risk": "高" if prob > 0.5 else "低"}这段的关键是order列表——它必须和训练时X的列顺序一模一样。我见过太多人因为特征顺序错位导致预测结果离谱,还以为是模型坏了。GUI 那边(不管是 tkinter 还是 PyQt)只负责收集输入、调用这个函数、显示结果,逻辑很薄。
4. 避坑与排查:模型加载、特征对齐、版本冲突这几处最容易翻车
4.1 加载 pkl 报版本不兼容
现象:joblib.load抛ValueError: node array from the pickle has an incompatible dtype或者 lightgbm 相关警告。原因:训练模型时的 lightgbm / sklearn 版本和你当前环境不一致,pickle 序列化对版本敏感。解决:先看文档里有没有写版本要求,没有就试pip install lightgbm==3.3.5 scikit-learn==1.2.2这类组合,或者直接用源码重新训练一遍生成新的 pkl。
4.2 预测结果全是同一个值
现象:不管输入什么,predict都返回 0 或都返回 1。原因:九成是特征顺序或维度不对,模型把所有样本都当成了同一种分布;也可能是输入没做类型转换,字符串混进了数值列。解决:打印X_train.columns.tolist()和推理时的字段顺序对比,逐列核对;确保输入全是数值类型,astype(float)兜底。
4.3 exe 双击闪退
现象:疾病风险预测程序.exe打开一瞬间就关了。原因:打包时依赖没打全,或者运行环境缺 VC++ 运行库。解决:先在命令行里cd到 exe 目录再运行,能看到报错信息;缺运行库就装 Microsoft Visual C++ Redistributable;实在不行直接跑 Python 源码,功能一样。
4.4 训练时 AUC 高但实际预测不准
现象:测试集 AUC 0.9+,但拿真实样本一测完全不对。原因:数据泄漏——训练集和测试集划分前做了全局标准化,或者用了未来信息;也可能是数据集本身正负样本极度不平衡,AUC 虚高。解决:检查预处理是不是在train_test_split之前做的,是的话挪到之后;看正负样本比例,悬殊的话考虑scale_pos_weight参数。
4.5 pip 装 lightgbm 编译失败
现象:Windows 上pip install lightgbm卡在编译或者报 CMake 错误。原因:缺编译工具链,或者 Python 版本太新没有预编译 wheel。解决:优先用pip install lightgbm --prefer-binary拿预编译包;还不行就装cmake和 Visual Studio Build Tools;最省事的办法是用 conda:conda install -c conda-forge lightgbm。
5. 让这份毕设多拿几分:阈值调优、特征重要性与答辩演示的三个技巧
模型跑通只是及格线,答辩要拿高分得在细节上做文章。第一个技巧是别用默认 0.5 阈值。医疗预测场景里,漏诊的代价通常比误诊高,所以可以把阈值往下调,比如 0.35,让更多潜在高风险样本被标记出来。你可以在答辩时展示一张不同阈值下召回率和精确率的权衡曲线,老师一看就知道你懂业务。
from sklearn.metrics import precision_recall_curve # 拿到预测概率 probs = model.predict(X_test) precision, recall, thresholds = precision_recall_curve(y_test, probs) # 找召回率优先的阈值,比如召回 >= 0.85 时精确率最高的点 import numpy as np valid_idx = np.where(recall[:-1] >= 0.85)[0] best_threshold = thresholds[valid_idx[np.argmax(precision[valid_idx])]] print("推荐阈值:", best_threshold)第二个技巧是把特征重要性画出来讲。LightGBM 自带feature_importance(),你按增益(gain)排序,答辩时指着图说"BMI 和血糖是糖尿病最强的预测因子",比干念准确率有说服力得多。这也顺便证明了你的模型不是黑匣子,是可解释的。
import matplotlib.pyplot as plt # gain 比 split 更能反映特征贡献 importance = model.feature_importance(importance_type="gain") feat_names = model.feature_name() # 排序后横向条形图 idx = np.argsort(importance) plt.barh(np.array(feat_names)[idx], importance[idx]) plt.xlabel("Gain") plt.tight_layout() plt.savefig("feature_importance.png", dpi=150)第三个技巧是准备一份"如果重来我会怎么改"的说明。答辩老师最爱问"你这个项目有什么不足",提前想好:数据集样本量偏小、只做了二分类没做风险分级、没有做交叉验证的置信区间。你主动说出来,比被问倒强。我当年第一次答辩就是没准备这个,被问得哑口无言,从那以后每次做项目都强制自己写一段局限性分析,这个习惯救过我好几次。
最后提醒一句:这份资源的价值在于它是一条完整的、经过验证的链路,不是让你原样交上去。你可以换数据集、加特征、改界面,但核心的 LightGBM 训练和推理逻辑是稳的。拿到手先跑通,再动手改,别一上来就大改特改,容易把自己绕进去。希望帮到你。
本文还有配套的精品资源,点击获取