尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

PyQt5+机器学习心脏病预测GUI源码拆包与实战避坑

发布时间:2026/9/28 1:43:04

资讯中心
01
ARTICLE

PyQt5+机器学习心脏病预测GUI源码拆包与实战避坑

PyQt5+机器学习心脏病预测GUI源码拆包与实战避坑
简介这是一份面向Python初学者与机器学习入门者的心脏病预测图形界面项目源码基于PyQt5构建桌面交互应用结合数据处理与分类算法实现患病风险预测。项目适合想同时练习GUI编程与医疗健康领域机器学习落地的开发者可作为课程设计或自学练手参考。压缩包共16个文件约22KB以6个py脚本为核心涵盖界面逻辑、模型调用与接口测试另有3个xml与1个ui文件负责界面布局与工程配置2个csv提供训练与测试数据1个pkl与1个model保存预训练模型整体结构紧凑、模块划分清晰。目前已有144人学习下载。读者可从中了解QMainWindow与各类小部件的事件绑定方式、Pandas数据清洗与标准化流程以及逻辑回归、决策树等模型加载预测的完整链路并参考输入校验与结果展示的实现思路快速搭建自己的预测类桌面应用。1. 心脏病预测 GUI 源码拆包一份能跑起来的 PyQt5 机器学习桌面应用拿到「基于python实现心脏病预测图形界面pyqt5源码.zip」这个包的时候我第一反应不是去看模型多牛而是先确认它能不能在我本机跑起来。原因很简单医疗健康类的课程设计源码十个里有八个是「界面能开、按钮点了没反应」或者「模型文件路径写死、换台机器就崩」。这个包的结构倒是挺实在——main.py是入口heart_api.py和heart_api_test.py负责接口层dt_model.py和lm_model.py分别对应决策树和逻辑回归两套模型caffe.pycaffe.ui是 PyQt5 的界面逻辑与设计文件data.csv和ok_data.csv是训练数据tree.pkl和net.model是预训练好的模型权重。说白了它把「数据 → 训练 → 保存 → 加载 → 界面调用」这条链路完整走了一遍适合想学 PyQt5 界面设计 机器学习落地的新手也适合需要快速搭一个医疗预测 Demo 的从业者。下面我按实际拆包顺序把环境、数据、模型、界面、避坑全过一遍。2. 环境与依赖把 PyQt5 和 sklearn 装进同一个 Python 环境2.1 为什么版本对齐比装什么库更重要这个项目同时依赖 PyQt5GUI、pandas/numpy数据处理、scikit-learn模型训练与推理、以及 pickle 序列化。常见翻车点不是缺库而是 PyQt5 和 Python 版本不匹配——比如 Python 3.11 装 PyQt5 5.15.4 以下版本会直接报DLL load failed。我一般会先锁定 Python 3.83.10 这个区间再按顺序装依赖。另外net.model这个文件名没有后缀说明它可能是用pickle.dump直接写的二进制加载时不能用joblib.load硬套得看源码里用的是pickle还是torch。2.2 依赖安装与验证步骤# 建议先建虚拟环境避免和系统里的 PyQt5 冲突 python -m venv venv_heart # Windows 激活 venv_heart\Scripts\activate # macOS/Linux 激活 source venv_heart/bin/activate # 按项目实际 import 装库版本给一个我实测能跑的区间 pip install PyQt55.15.9 pip install pandas1.5.3 numpy1.24.3 scikit-learn1.2.2 pip install joblib1.2.0装完后别急着跑main.py先做一次导入自检# check_env.py import sys print(sys.version) import PyQt5.QtCore as QtCore print(PyQt5 OK:, QtCore.QT_VERSION_STR) import sklearn, pandas, numpy, joblib print(sklearn:, sklearn.__version__) print(pandas:, pandas.__version__)逻辑说明QT_VERSION_STR能打出来说明 PyQt5 的 C 底层 DLL 加载正常sklearn 和 pandas 版本打印出来是为了和后面模型加载时的警告做对照。参数上PyQt5 不要低于 5.15否则QtWidgets里部分枚举会报AttributeErrorsklearn 不要高于 1.3因为老版本 pickle 模型在新版里可能触发InconsistentVersionWarning甚至直接加载失败。2.3 项目文件清单与职责划分文件作用是否可缺main.py程序入口启动 QApplication不可缺caffe.py/caffe.ui界面逻辑与 Qt Designer 布局不可缺heart_api.py封装预测接口供界面调用不可缺heart_api_test.py接口层单元测试可缺但建议保留dt_model.py决策树模型训练/加载二选一lm_model.py逻辑回归模型训练/加载二选一data.csv/ok_data.csv原始数据与清洗后数据训练时需要tree.pkl/net.model预训练权重推理时需要这张表的意义在于如果你只想跑界面看效果dt_model.py和lm_model.py可以不动但tree.pkl或net.model必须存在且路径正确如果你想重新训练那data.csv的列名必须和源码里feature_names完全一致差一个空格都会导致KeyError。3. 数据与模型从 data.csv 到 tree.pkl 的完整链路3.1 数据列对齐别让中文列名坑了你data.csv和ok_data.csv大概率是 UCI 心脏病数据集的一个变体常见字段包括age、sex、cp、trestbps、chol、fbs、restecg、thalach、exang、oldpeak、slope、ca、thal、target。我拆过的同类项目里最常见的坑是 CSV 里列名带了 BOM 头或者中文导致df[age]读出来是\ufeffage。处理方式很简单import pandas as pd df pd.read_csv(data.csv, encodingutf-8-sig) # 关键utf-8-sig 吃掉 BOM print(df.columns.tolist()) # 统一转小写、去空格避免源码里写的是 Age 而 CSV 里是 age df.columns [c.strip().lower() for c in df.columns] # 检查缺失值 print(df.isnull().sum()) # 如果有缺失常见做法是均值填充或中位数填充 df df.fillna(df.median(numeric_onlyTrue)) df.to_csv(ok_data.csv, indexFalse)逻辑说明encodingutf-8-sig是处理 Windows 下 Excel 导出 CSV 的后悔药strip().lower()保证列名和源码里的特征列表一致median()填充比均值更稳因为胆固醇、血压这类指标容易被极端值拉偏。参数上numeric_onlyTrue在 pandas 2.0 以后必须加否则对非数值列求中位数会报错。3.2 模型训练与保存dt_model.py 和 lm_model.py 怎么选dt_model.py对应决策树lm_model.py对应逻辑回归。两者在心脏病预测这个场景下的差别很实际决策树可解释性强能输出特征重要性适合给医生看「哪个指标影响最大」逻辑回归输出概率更平滑适合做风险打分。我一般会两个都跑一遍看roc_auc谁高用谁。训练代码骨架如下# train_dt.py import pandas as pd import pickle from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report, roc_auc_score df pd.read_csv(ok_data.csv) X df.drop(target, axis1) y df[target] X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42, stratifyy ) clf DecisionTreeClassifier( max_depth5, # 控制过拟合医疗数据样本少深度别太大 min_samples_leaf5, # 叶子节点最少样本防止噪声被单独成叶 random_state42 ) clf.fit(X_train, y_train) y_pred clf.predict(X_test) y_prob clf.predict_proba(X_test)[:, 1] print(classification_report(y_test, y_pred)) print(AUC:, roc_auc_score(y_test, y_prob)) with open(tree.pkl, wb) as f: pickle.dump(clf, f)逻辑说明stratifyy保证训练集和测试集里患病/不患病比例一致否则小数据集上 AUC 会虚高max_depth5和min_samples_leaf5是我在 UCI 心脏病数据上试出来的经验值再深就会看到训练集准确率 100%、测试集掉到 70% 的经典过拟合。保存用pickle.dump对应加载时也必须用pickle.load不能混用joblib否则会报InvalidLoadKey。3.3 模型加载与接口封装heart_api.py 的职责heart_api.py是整个项目的黑匣子入口界面层不直接碰模型而是调这个接口。常见写法是# heart_api.py 核心逻辑示意 import pickle import numpy as np class HeartPredictor: def __init__(self, model_pathtree.pkl): with open(model_path, rb) as f: self.model pickle.load(f) def predict(self, features: list): # features 顺序必须和训练时 X.columns 一致 arr np.array(features).reshape(1, -1) prob self.model.predict_proba(arr)[0][1] label int(prob 0.5) return {label: label, probability: round(prob, 4)}逻辑说明reshape(1, -1)是因为 sklearn 的predict_proba要求二维输入界面传过来的是单条一维列表prob 0.5是默认阈值实际医疗场景可以调到 0.4 提高召回但要在界面上注明「仅供参考」。参数上model_path建议用绝对路径或os.path.join(os.path.dirname(__file__), tree.pkl)否则从不同目录启动main.py时会报FileNotFoundError。4. PyQt5 界面caffe.ui 到 caffe.py 的信号与槽4.1 界面加载方式uic.loadUi 还是 pyuic5 转换项目里同时有caffe.ui和caffe.py说明作者可能用了两种方式之一要么在caffe.py里用uic.loadUi(caffe.ui, self)动态加载要么用pyuic5 caffe.ui -o caffe.py转成 Python 代码。动态加载的好处是改界面不用重新生成代码坏处是打包成 exe 时容易漏掉.ui文件。我一般会转成.py再改避免运行时找不到 UI 文件。# 如果 caffe.py 是空的或只有几行说明需要手动转换 pyuic5 caffe.ui -o caffe_ui.py转换后caffe_ui.py里会有一个Ui_MainWindow类里面定义了所有控件对象名。你要做的是在caffe.py里继承它并绑定按钮事件。4.2 输入校验与预测触发按钮点击后发生了什么界面上的QLineEdit或QSpinBox收集年龄、血压、胆固醇等指标点击「预测」按钮后触发槽函数。这里最容易翻车的是输入校验——用户输入空值或非数字程序直接崩。常见做法是# caffe.py 槽函数示意 from PyQt5.QtWidgets import QMessageBox from heart_api import HeartPredictor class MainWindow(QMainWindow, Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.predictor HeartPredictor(tree.pkl) self.btn_predict.clicked.connect(self.on_predict) def on_predict(self): try: age int(self.line_age.text()) trestbps int(self.line_bp.text()) chol int(self.line_chol.text()) # 其余字段按训练顺序补齐 features [age, 1, 0, trestbps, chol, 0, 1, 150, 0, 1.0, 2, 0, 2] result self.predictor.predict(features) self.label_result.setText( f风险概率{result[probability]*100:.1f}% ) except ValueError: QMessageBox.warning(self, 输入错误, 请填写有效的数字) except Exception as e: QMessageBox.critical(self, 预测失败, str(e))逻辑说明try/except ValueError专门抓空输入和非数字except Exception兜底模型加载失败或特征维度不匹配。参数上features列表的顺序必须和训练时X.columns完全一致我见过有人把sex和cp顺序写反结果模型输出全是 0.5 左右看起来像「模型不准」其实是输入错位。4.3 结果展示与用户体验概率、风险等级与免责声明预测结果不要只给一个 0/1医疗场景下概率更有参考价值。界面上可以用QLabel显示百分比再用QProgressBar做可视化。另外必须加一句「本结果仅供学习参考不能替代专业医疗诊断」这不是客套是避免误用的底线。如果项目里有QTextEdit可以把特征重要性也打出来比如决策树的feature_importances_让用户知道哪个指标权重最高。5. 避坑与排查跑不起来时先看这五条5.1 现象启动报ModuleNotFoundError: No module named PyQt5原因虚拟环境没激活或者 pip 装到了系统 Python 而不是当前解释器。解决which python和which pip确认路径一致重新pip install PyQt5PyCharm 里还要检查 Project Interpreter 是否选对了 venv。5.2 现象加载tree.pkl报InconsistentVersionWarning或AttributeError原因训练模型的 sklearn 版本和当前环境不一致或者 pickle 文件损坏。解决先pip install scikit-learn1.2.2对齐版本如果还不行用dt_model.py重新训练一遍生成新的tree.pkl别硬修旧文件。5.3 现象界面能开点预测没反应也不报错原因信号没绑定或者槽函数名和connect里写的不一致。解决在__init__里加print(slot connected)确认绑定执行检查self.btn_predict.clicked.connect(self.on_predict)里的方法名是否拼写正确PyQt5 不会对错误方法名抛异常只会静默失败。5.4 现象预测结果永远是同一个值原因输入特征没有真正传进模型或者features列表被硬编码成了固定值。解决在heart_api.py的predict里加print(arr)看每次调用时数组是否变化检查界面控件text()是否取到了真实输入而不是placeholderText。5.5 现象打包成 exe 后报FileNotFoundError: caffe.ui原因uic.loadUi动态加载的.ui文件没被打包进去。解决改用pyuic5转成.py或者在 PyInstaller 的--add-data里把caffe.ui和tree.pkl一起带上路径用sys._MEIPASS处理。6. 进阶技巧用接口测试脚本验证模型稳定性heart_api_test.py这个文件很多人会忽略但它其实是整个项目里最值得改的地方。我一般会把它扩成一个批量验证脚本用ok_data.csv里的真实样本跑一遍看预测准确率和训练时报告的差多少。如果差超过 5 个百分点说明模型保存或加载环节出了问题。# heart_api_test.py 扩展版 import pandas as pd from heart_api import HeartPredictor from sklearn.metrics import accuracy_score df pd.read_csv(ok_data.csv) X df.drop(target, axis1) y df[target] predictor HeartPredictor(tree.pkl) preds [] for _, row in X.iterrows(): res predictor.predict(row.tolist()) preds.append(res[label]) print(批量验证准确率, accuracy_score(y, preds))逻辑说明row.tolist()把 pandas Series 转成列表顺序和训练时一致accuracy_score直接对比真实标签。参数上如果准确率明显低于训练时的classification_report优先检查tree.pkl是不是用旧数据训练的而不是怀疑代码逻辑。另外一个小技巧把tree.pkl和net.model的加载路径做成配置项写在config.py里界面启动时读配置。这样换模型不用改代码也方便对比决策树和逻辑回归的效果。我自己的习惯是每次改完模型先跑heart_api_test.py确认批量准确率没掉再开界面点一遍。从那以后我每次拿到这类课程设计源码都强制先跑接口测试再动界面省得在 UI 上浪费时间排查模型问题。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。