- AI源码解读:推荐系统案例(Python版)
- 李永华编著
- 4190字
- 2022-07-28 19:28:34
项目2 PROJECT 2 小型智能健康推荐助手
本项目通过Kaggle公开数据集,进行心脏病和慢性肾病的特征筛选和提取,选择随机森林机器学习模型进行训练,预判是否有疾病、针对相应的症状或需求给出药物推荐,实现具有实用性的智能医疗助手。
2.1 总体设计
本部分包括系统整体结构和系统流程。
2.1.1 系统整体结构
系统整体结构如图2-1所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P44_1.jpg?sign=1738985842-LwAydMBLgbPIuzOpumGshyWM2Lc9LfGi-0-72405b5db2811d7028bf0f3598226e67)
图2-1 系统整体结构
2.1.2 系统流程
系统流程如图2-2所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P45_1.jpg?sign=1738985842-0YVA474Bpw0bbMrE8nq6olicpMazPEgQ-0-7baf274902ce7079cef9634e172ca26e)
图2-2 系统流程
2.2 运行环境
需要Python 3.6及以上配置,在Windows环境下推荐下载Anaconda完成Python所需的配置,下载地址为https://www.anaconda.com/,也可以下载虚拟机在Linux环境下运行代码。
2.3 模块实现
本项目包括2个功能,每个功能有3个模块:疾病预测、药物推荐、模块应用,下面分别给出各模块的功能介绍及相关代码。
2.3.1 疾病预测
本模块是一个小型健康预测系统,预测两种疾病——心脏病和慢性肾病。
1.数据预处理
心脏病数据集来源地址为https://archive.ics.uci.edu/ml/datasets/Heart+Disease;慢性肾病数据集来源地址为https://www.kaggle.com/mansoordaku/ckdisease。两个数据集均包括300多名测试者的年龄、性别、静息血压、胆固醇含量等数据。
1)心脏病数据集预处理
加载数据集和数据预处理,大部分是通过Pandas库实现,相关代码如下:
# 导入相应库函数 import pandas as pd # 读取心脏病数据集 df = pd.read_csv("../Thursday9 10 11/heart.csv") df.head()
自动从csv中读取相应的数据,如图2-3所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P46_1.jpg?sign=1738985842-3lf9uLimu07GxZX5IyFRJhPR3j96CwjJ-0-25b4f17961b36a0cc90f4834fbf51ae0)
图2-3 成功读取心脏病数据集
检查数据是否有默认值,如果有数据会显示为NaN,且当数据有默认值时不能对数据绘图可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P46_2.jpg?sign=1738985842-GbWevEHVSFI3iUJSR6NJvqlX2Vilo3I0-0-77eb36955dc4482bc8b78c0c64d237b0)
数据集没有默认值,数据的尺度比较大,通过绘图方式观察可以检查出错误数据,如图2-4所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_1.jpg?sign=1738985842-WZf4KJvzlPHpFcIr7XAIjGF6jWuBAu1u-0-987070580d6bfb8fd777e391d313c75b)
图2-4 绘图观察是否有错误数据
# 通过seaborn绘图,观察数据 sns.pairplot(df.dropna(), hue= 'target ')
通过观察,第5列(血液中胆固醇含量)和第10行(静息血压)有部分点和其他点距离较大,绘制数据分布图进一步分析。
# 绘制血液中胆固醇数据分布 df['chol '].hist() # 绘制静息血压分布图 df['treatbps '].hist()
数据分布如图2-5和图2-6所示。血液中胆固醇含量达到500,静息血压最大值达到200。经过查阅资料,静息血压正常值应该在120~140,但是接近200的患者数据,是符合实际的。取得胆固醇含量最大值的同样是患者,没有不符合实际情况的数据。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_1.jpg?sign=1738985842-gxbk6zLGGT7Uu72S0YSAZVSrLsacqIme-0-0b855cc37f121ba2f37c56e339018c05)
图2-5 血液中胆固醇含量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_2.jpg?sign=1738985842-OC3lCtxuq0V3XZvXfhG8qCqxoAbhkQ3b-0-c13a344e8161c764291b0091112d43d0)
图2-6 静息血压
下面是改变数据类型,例如,胸痛类型,1~4是类别变量,它的大小并不具备比较性,但是训练时数值大小会影响权重。所以要把类别变量转化为伪变量,把4个类别拆成4件,分别用0、1表示有或没有。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_2.jpg?sign=1738985842-LlSLSVrL2vaGxMEBBv6dhTEt8HS5G1Jo-0-49ca3306d73ed396a6c30b27f6242cf4)
转换成功后如图2-7所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_3.jpg?sign=1738985842-F5iVKrLGIAnRcQI9zcxk3kHKS6HeCIte-0-b7f7a55635f140529586a75ff947441b)
图2-7 类别变量转换为伪变量
最后使用Scikit-learn的train_test_split()函数自动划分训练集和测试集。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_4.jpg?sign=1738985842-lm2Qq6UJCE2keFo1BXM5bb0ZrGEFwRBU-0-5d2ba08df647724385ffab62972ec229)
2)慢性肾病数据预处理
通过Pandas读取慢性肾病数据集,读取成功效果如图2-8所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_1.jpg?sign=1738985842-QOqqNANVdGsrzjlmCpcVzgeCMGbdymam-0-42e1b1596082d0f4510acb02499d6b48)
图2-8 成功读取慢性肾病数据集
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_5.jpg?sign=1738985842-AkinLpIffrUcI2bOAAAV6dD8dzapawWE-0-45d009249ed076d0ee57e9ea16f091b1)
对数据类型进行处理,例如食欲(appet)数据为good和poor,脓细胞团(pcc)为notpresent和present,将类别变量转换为伪变量0和1。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_3.jpg?sign=1738985842-XmPAQp8Nood5LGAQB3sCxaG49HPbBlas-0-f440dd1eec629be04217035fa55eddee)
转换成功结果如图2-9所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_2.jpg?sign=1738985842-qn76tJnKbLUnzaCczv12ZFIcg3OpFpiL-0-c236be89f7185b8a053b0ffb340749bf)
图2-9 类别变量转换为伪变量
检查默认值的变量如图2-10所示。
图2-10中可以看出默认值数量不小,由于数据集不大,需要采用均值归一法,对病人和正常人分别取所有测量值的平均值来填补默认值。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_1.jpg?sign=1738985842-BZqfm5GK2NFsrxzVNIflxALTmMxkqF80-0-02aa37e2153d677463e5a4502334770a)
图2-10 含有默认值变量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_4.jpg?sign=1738985842-FoRHwiDBep9SY6f4oYSnK7tenjxQvN73-0-d1171e3c2ac21b24706f961905b0db7c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_2.jpg?sign=1738985842-CZG3OWUSye14lwFQJT6eF4z1rb2yhvpi-0-7c9c06f073e4a86fac003a8861a65d80)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P51_1.jpg?sign=1738985842-NQrukDZO5mbUhrzIOCO0nnFHBEZGZAfH-0-28f04d5eb165e99d58b927f34eb46a09)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P52_1.jpg?sign=1738985842-uoUw4XonejQ0hsRpYGpkChZMCfbFZqpP-0-67b1439c96c76016fe0d2c4fa496d614)
2.模型训练及保存
数据加载进模型之后,需要定义模型结构,寻找优化参数并保存模型。
1)定义模型结构
本部分包括心脏病数据集定义模型和慢性肾病数据集定义模型。
(1)心脏病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_1.jpg?sign=1738985842-VW1Asvk3nB9D2sLyvUXqyMeMAzG4MDwC-0-41e10a5e27b00f86be86b0f88fc8811b)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_2.jpg?sign=1738985842-X19VmnxHveIM9Ez9j45G7iH4CyXHneSn-0-a4af0dca3c2ea527829870ee06535f37)
2)保存模型
为了能够被Python程序读取,需要将模型保存为.pkl格式的文件,利用pickle库中的模块进行模型的保存。
(1)心脏病模型保存。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_1.jpg?sign=1738985842-8GGc5mTyX6CLGaOaSZ5P17PFXbdmBOpZ-0-361a512038e635022ad1d78150af45d7)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_2.jpg?sign=1738985842-nEKWjOSbEYXObe1bt6nrNGV2cO4G81PG-0-d7e05e1ae546b20c364e29ce1f9a5d63)
3.模型应用
对于人的疾病来说,误诊带来的风险是极大的,正确率不是100%对患者就是损失。然而以往仅仅预测是否患上疾病,是一个二分类问题。原理上,机器对疾病的预测基于各项指标的权重。本项目充分运用机器学习的优点,将各特征重要性与各指标的数值相乘求和,得到一个加权值。在程序内部,预先对患者和正常人的各指标平均值与对应特征重要性加权求和,得到患者和正常人的平均水平。在定性判断为病人后,将用户的数值与病人均值做对比,定量给出用户的病情相对于大多数患者严重程度;如果用户被判断为正常人,则将他的各项数值与正常人均值做对比,给出用户相对于大多数正常人的亚健康程度。经过处理,不仅做到定性判断,还对用户情况进行量化。一方面防止偶然的误诊带来风险;另一方面给予患者与疾病抗争的希望,给体检正常的人敲响亚健康的警钟。
1)心脏病模型应用
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_3.jpg?sign=1738985842-zXG59hwtfqIj0lQt9myA2sblLbHazZJH-0-99fc2dcd52cb362af79d65f3681b935d)
输出的各特征重要性如图2-11所示。
通过图2-11可以看出,年龄因素,对患病是否有影响,并不重要,符合常识。然后分别获得患者和正常人的平均值,如图2-12所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_1.jpg?sign=1738985842-Ap2C9oXNzlNzl27ielGkUUonJpMzCBMG-0-af1b4b14b98993a1693acc748e30feda)
图2-11 心脏病特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_2.jpg?sign=1738985842-HxrQjGKQC00qS8Uh0A9xLIYDbDQqlG4I-0-a0408341c855c98f0f4846f9483b7c61)
图2-12 心脏病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_4.jpg?sign=1738985842-JCB9ZW87kPtMaBCDrnoHNwcHJ3R3bpqP-0-a08d209ae87a93d5498220b65620fcbe)
患者和正常人加权求和后的值如图2-13所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_3.jpg?sign=1738985842-Yk9kN5StIcc0tIeBz3rh5V0T4wqZYQx8-0-8a6dab7465763ae9d5c9bd87bd366868)
图2-13 心脏病患者和正常人加权求和后的值
将这个值保存,当用户使用时,判断出是患者还是正常人之后,根据比值大小定量判断具体情况。
2)慢性肾病模型应用创新
通过eli5得到各特征重要性,输出的各特征重要性如图2-14所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_1.jpg?sign=1738985842-bkl6M75Fu11IUkwsNza34o6NlKr9qYrF-0-78b21900840f2d2d26b5ed4abcdc0dff)
图2-14 慢性肾病患者和正常人特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_5.jpg?sign=1738985842-kIoF9e4IbJSpcMAIdigC3XkGwFSvfSdh-0-2085810f0f1eb778ca469c2ee42e8dd6)
分别获得患者和正常人的平均值,如图2-15所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_2.jpg?sign=1738985842-OpMytNinYJ545TSh4TFYd7oDqM6fYq2V-0-37a68d97cb3b8553a7a40713c7d6fd33)
图2-15 慢性肾病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_4.jpg?sign=1738985842-DLPpBDjpDjKkJVr56RIopCS1cz8QEMuc-0-b3039003f45aaa8b19919f02d3072f62)
患者和正常人加权求和后的值如图2-16所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_3.jpg?sign=1738985842-Y9Too5b3053WGbPts8AXHsEAFFvKfjFV-0-40a6b14917baf38f884bc2f1a7c742ca)
图2-16 慢性肾病患者和正常人加权求和后的值
将这个值保存,当用户使用时,判断是患者还是正常人之后,根据比值大小定量出具体情况。
2.3.2 药物推荐
本模块是一个小型药物推荐系统,对800余种症状提供药物推荐。
1.数据预处理
UCI ML药品评论数据集来源https://www.kaggle.com/jessicali9530/kuc-hackathon-winter-2018 。包括超20多万条不同用户在某一种症状下服用某药物后的评论,并根据效果从1~10分进行打分。通过分析该数据集,可以对用户症状推荐大众认可的药物。
加载数据集和数据预处理,大部分通过Pandas实现,相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_5.jpg?sign=1738985842-VsIoUvXdpGhX1lvp7POeG5dX0wQzBOem-0-fc82605a65ba9fd4bb913adcea8d3015)
会自动从csv数据源读取相应的数据,如图2-17所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_1.jpg?sign=1738985842-TKoBeafMqCchqgqUqsDOLaE2kuT32sfd-0-0dceca5d73084127af969ff2246675ff)
图2-17 成功读取心脏病数据集
数据集中有用户ID(UniqueID)、症状(condition)、服用的药物(drugName)、服用该药物后的评论(review)、打分(rating),其他用户对该用户评论的点赞数(usefulCount)。
本项目根据用户对药物的打分判断是否推荐在该症状下服用此药物。打分为1分和10分可以认为用户不推荐和推荐该药物。然而,用户对药物的打分不只是1分和10分,一般来说,对一种药物有时有效但见效慢、好用但昂贵、有所缓解但效果不明显、副作用不容忽视等。打4分不一定代表评价者的否定态度,打6分也不一定意味着评价者支持。样本总量如图2-18所示,打1分和10分的评论总量如图2-19所示,用户打分分布如图2-20所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_2.jpg?sign=1738985842-I0gJjcox5bKJIEdR9HSSyT9zR6Xlg2Mz-0-0ca8e5ec654b8350274dc4354df5ac3a)
图2-18 样本总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_3.jpg?sign=1738985842-nmFELB3PBgnSc9kMWJqslXP0z3DCF4ER-0-62a996b48a882a89ad93827da0f717a4)
图2-19 1分和10分的评论总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_4.jpg?sign=1738985842-PbB5l38GBOmLczUTxIeKgHhbmFtXwxlq-0-05de60cf6fa2f986c465f94da492ff66)
图2-20 用户打分
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_2.jpg?sign=1738985842-JIGA2VmFWC3jdLo0WClKhhW4ddt2W7Kb-0-5c45dbef3e3bc7843dbe2a51c1927b47)
打分分布如图2-20所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_3.jpg?sign=1738985842-U7TtDZCP1P168ErAhsP2n6FrZbE0iyYX-0-873484fec32003aab14a160ec376e7ba)
图2-19和图2-20可以看出,超过一半的用户打1分和10分,样本数据量足够机器学习用户情感,使用学习到的情感,分析打分在2~9分的用户就是内心深处支持与否。打分为1分和10分的评论情感分析学习如图2-21所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_4.jpg?sign=1738985842-dRE9Cp0PQhizIFuwlaQO1BhaAnmc2k9a-0-d99a2430002d585ab107c68b4856416c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_1.jpg?sign=1738985842-71isOpECm54NmB04l9J21uligrxKjRFT-0-a6e577b10a4368744181fcf79187698d)
图2-21 仅取出打分为1分和10分的评论情感分析学习
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_5.jpg?sign=1738985842-evsJHq4fx3k3dNvkYWZuALLZ7XPu2r6o-0-fd931893dc55f3da06b4c1dae8dc9837)
发现一句话中经常出现不合时宜的符号,该数据集是网络爬虫爬取的,所以有很多字符表示成ASCII码,防止被误识别为分隔,使用正则表达式从审阅文本中删除这些符号。
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_6.jpg?sign=1738985842-VOEkPP2WylWflHkrx6h6kU6sldVQlpJK-0-c842cc5870e5ce0d93b5ba56d35852a4)
预测的标签是喜欢与不喜欢,但是drugName和condition种类很多,写进程序中可以简化工作量,所以需要将drugName和condition列前置到review中,并将完整的字符串保存为text列。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_2.jpg?sign=1738985842-L6ougm9CxeCufzznGUDEf0EufE7Kv3iX-0-c2f0bcd0090451fa82788f606b70e0b0)
CountVectorizer类将文本中的词语转换为词频矩阵。通过分词后把所有文档中的全部词作为一个字典,将每行的词用0、1矩阵表示。并且每行的长度相同,长度为字典的长度,在词典中存在,置为1,否则为0。由于大部分文本只用词汇表中很少一部分词,因此,词向量中有大量的0,说明词向量是稀疏的,在实际应用中使用稀疏矩阵存储。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_3.jpg?sign=1738985842-kJbFN1TXNfAaRepFveDfKMYhyIsSLBgn-0-0dbf2196b4ec31896989fcf5450cca7c)
2.模型训练及应用
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_4.jpg?sign=1738985842-vMFRXdV5ZDXCAzIO6VssTJIFMOuPUP14-0-accf00ac1da3e7e5cca89bcb9aa29a38)
仅取出打分为1分和10分的评论进行情感分析学习,如图2-22所示,打分2~9分的评论如图2-23所示,代入模型分析评论情感为支持或不支持如图2-24所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_1.jpg?sign=1738985842-KGcEfHXPmgaGV04liMmWippHpShnayCA-0-30d230e05b91fdb23b812606de6b1da1)
图2-22 仅取出打分为1分和10分的评论进行情感分析学习
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_2.jpg?sign=1738985842-G69x42SeVKPOvModhP8b84kh0GnIRhtk-0-539db1b1574ad5e33c05c98c721b72e9)
图2-23 打分为2~9分的评论
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_3.jpg?sign=1738985842-636p1qB91xDi4iXjWDch6QDrm44lHAvZ-0-88af228631e44fa89cca5c56e72acdd8)
图2-24 代入模型分析评论情感为支持或不支持
由于是评1分和10分,所以正确率高,接下来将训练好的模型应用到打分为2~9分的评论中。
#读取2~9分的评论 Train_0 = train_0[train.rating.isin([2,3,4,5,6,7,8,9])] Train_0.head()
将评论经过数据预处理后,代入训练好的模型,得到评论感情分类。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_4.jpg?sign=1738985842-WUmfI9DO1aUIPfshNkceu5yheouhEyob-0-3c018c082639a9e7320b5232147b198d)
3.模型应用
将两个csv文件合并成一个,本项目对某一特定症状选取支持率前三名的药物。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P61_1.jpg?sign=1738985842-dlnFJpU0GCSz6atH6HPlfwSCLuDyU22E-0-fa5fa2b0148b31645183fe366a57e928)
得到一个csv数据库,但是数据库中除了特定的药物名称,还有一些特殊字符,通过编写Python脚本文件将它们清理干净。
2.3.3 模型测试
本部分包括模型导入及相关代码。
1.模型导入
输入数据包括两部分:如性别、年龄、食欲需要用户手动输入;心率、心电图波形参数,需要用户接入不同的传感器测量。考虑到应用的便捷性,直接从传感器读取所有的参数进行预测。
一位用户输入的数据如图2-25所示,判决结果如图2-26所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_1.jpg?sign=1738985842-A9ilrVfNDXJe6Euy9hWQzQvcnKzatLHb-0-a85a79a981074234b3899ea344e04736)
图2-25 一位用户的数据
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_2.jpg?sign=1738985842-NtifUhT94FpEntHlIcETMMkCItLVXXQr-0-5ea13688a4ef2bcb6f28867a362f5589)
图2-26 判决结果
client_result=rf.predict(client_x) print('这就是分类预测结果') print(client_result)
根据数据和模型,首先判断病与非病;其次判断病情严重程度,不能只用是否有病,而是给病情不同程度的评价。将数据乘以每个因素的权重和有病的人平均值做对比。如果直接告诉一个人,得病了,可能无法接受。如果说明情况不太严重,比大多数病人轻,量化后,容易接受,如图2-27所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_3.jpg?sign=1738985842-QJGOXDqXenSdU2WvCeuyBFXoCozYyOqo-0-7a4da3f0b18e5fa5be8cfb39446965dc)
图2-27 量化
之前平均值是病人比正常人的小,所以大于分界面更好。病情指数比平均数的四分之一还小,量化后督促病人抓紧时间治疗。
2.相关代码
本部分包括模型预测代码、模型应用创新代码、用户接口及界面可视化代码。
1)模型预测
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_4.jpg?sign=1738985842-Gyxq5PmKHLZydJFhmwoymJkzQzT1lKL1-0-18d5c47311ef5506d03a31a2109ccaa0)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P63_1.jpg?sign=1738985842-wvY6SH4lBTvtRnv6k14ZlexgF2QdVfJz-0-01df6c7912d54b832ba5efab62476583)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P64_1.jpg?sign=1738985842-vIgVN1b53JK6wGv3dERtUJNF9TbvBODb-0-bc6f4bd9e44edcaf27765e93d27e1125)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P65_1.jpg?sign=1738985842-rhhT7SDVDINfTZzrvqC63JAYb5Ttxc54-0-f00db6370eb9e52fb073d65cb0e952dc)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P66_1.jpg?sign=1738985842-SDLMfjzgc2Er4QqP6dntRZh9UhH6f35A-0-6972e573e175461e31679d2a1a82f4e9)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P67_1.jpg?sign=1738985842-gHF90p8Tr6KYoClRFQEAXjV5dgmrwyui-0-3f433a53d79b3630f8187726741fbf32)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P68_1.jpg?sign=1738985842-LIAexGlTCtrIi3fQ5jDzKR4vwbnKdFnn-0-a1f4e6fbcbcee12db07a1addf90efab6)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P69_1.jpg?sign=1738985842-3sB41VEYMhlHHAhMiZ6gki0M5AH3tDgu-0-5eb90f28e74d3fca37c2743ba2c2ed67)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_1.jpg?sign=1738985842-qyDSQmn08OnOj9Gh8dG9uEPatFyZL6qb-0-69a458f0bc9626bcb7b3cfc326ab2ee1)
2)模型应用创新
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_2.jpg?sign=1738985842-PSr5NSwARdscQhy9kO6MoesA4jOdNTOX-0-6e33a35520a58021b4b162436bd66629)
3)用户接口及界面可视化
本部分为主界面GUI设计及子界面调用。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P71_1.jpg?sign=1738985842-lLVSGifXJxsikTM2UmPxursK23HtEL5o-0-622fbcaaa5df8af5d6761ba59f4cb2e5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P72_1.jpg?sign=1738985842-dv7oOmzrq0FL9UEvE1O4tePtCb4TFk79-0-37be3eed54719c0a77e01c5d8e2c7655)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P73_1.jpg?sign=1738985842-7OauL2mvALzjiOuhOXlCH02efdQRAsjx-0-4e05cc3b2eb97799d98eb89453766b50)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P74_1.jpg?sign=1738985842-rs5QVzKDZSeKnsIXfIXSN7pajEmQltWL-0-47c432650cb8bf857d1cb00acadf47cf)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P75_1.jpg?sign=1738985842-PxU7geAEJEfycupsOJUTSOzIFglaeqqP-0-2664270c4557fcdf6b2a5a310fa254b0)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P76_1.jpg?sign=1738985842-BYGqLK9t78tLcG0ESf5B0WBCzVA2F9Lk-0-7815ccfb6f86259769959fca6a187279)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P77_1.jpg?sign=1738985842-X1YVXnaLShiikSbEvaIS02nhE3a6HLFj-0-3e4a2a0f031db7bd16eea358bf6647f8)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P78_1.jpg?sign=1738985842-9nTitBIDWf2Uu8Gm8EdjOyFwEGhpLI92-0-09750f643daab00f8af73b7562978106)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P79_1.jpg?sign=1738985842-G8f46nZS5cbeZhFcbl2Sa2At1440ijNo-0-2e201203a15b27894d11591acf8e21ce)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P80_1.jpg?sign=1738985842-rNIRSTo8LZ7iVp6QaEIjCKwJmzrt03lu-0-c00f27445f05141676eed0abc00e99c8)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P81_1.jpg?sign=1738985842-eKHPgRWBeo9rDWmTMSkXrxG4oRzu3EDi-0-3b7c4b8f6539123157ef17a0117ca875)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P82_1.jpg?sign=1738985842-ZT7LBHwiYVDghCmXp7cfN5uHImzNUwHn-0-b38d713297c2d537d17844399c907695)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_1.jpg?sign=1738985842-YQnoki6cj25e3j3vWeCTBbSQwy2K6NLK-0-8d36915c97a8356878c0b8ea456ba727)
2.4 系统测试
本部分包括训练准确度、测试效果和模型应用。
2.4.1 训练准确度
心脏病预测准确率达到89%以上,模型训练比较成功,如图2-28~图2-31所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_2.jpg?sign=1738985842-Hdv9YNtMXPoXHq9qY2bphrSYhNwBh77U-0-86ba72374caacd1ae69fb2e569a8caa5)
图2-28 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_1.jpg?sign=1738985842-UN0gmrIOJ8dI9xIm68wR9AQ1j2Lcb3PZ-0-bb36f4c50bfd6de1b8897e962d46a7fe)
图2-29 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_2.jpg?sign=1738985842-5JQQ7OYSKkI6GnqRyB9D6OnW8YtlrTfD-0-779ac1527a211db18e503989daf7e980)
图2-30 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_3.jpg?sign=1738985842-8IoZuHJQrDmzMyf73hk3V5TA8kJJ47cF-0-028051251ecad8f8640dd61e35f5107b)
图2-31 ROC曲线面积
慢性肾病预测准确率达到100%,如图2-32~图2-35所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_4.jpg?sign=1738985842-xBIKpVpXCZg46kAiwuxYXg0BFPOnUh47-0-4efa60e462596397b70444d8a173e109)
图2-32 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_5.jpg?sign=1738985842-QBs8zsxPx6dCIbWmdV4pSVE2SqHZ4OzL-0-dea547c6ee4c1562e7b9f7167469ce9a)
图2-33 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_6.jpg?sign=1738985842-4MvgfYg4BDmXJITfMOpYLhz1mMve9g7t-0-155c140935b97255d4a2cd6f682e777c)
图2-34 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_7.jpg?sign=1738985842-awEJLz5oXS9fneAETKKlnakmeEi28HsY-0-d1b941c6e7e6e404e928b525cf6e0eaa)
图2-35 ROC曲线面积
2.4.2 测试效果
将数据代入模型进行测试,分类的标签与原始数据进行显示和对比,可以得到验证:模型可以实现疾病预测和药物推荐。模型训练效果如图2-36所示,药物推荐效果如图2-37所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_1.jpg?sign=1738985842-wPrbnXhU8r238haILZgz2rqB1Lsn4TSd-0-8723c46819ad2a3a9079b6cff86276e7)
图2-36 模型训练效果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_2.jpg?sign=1738985842-Eb4xhLGlZxhCBBguQqquJXObMlin1Bag-0-0b03e96d14fd1a83cb8253af90b8f43c)
图2-37 药物推荐效果
2.4.3 模型应用
打开cmd命令,到程序所在文件夹;输入python test.py开始测试;打开应用,初始界面如图2-38所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P86_1.jpg?sign=1738985842-OBXdp6SrA6QWojJaLLXneYDcyCxxzjxq-0-a5ff0c1a52a20ae82dc899204eb98748)
图2-38 应用初始界面
界面从上至下,分别有三个按钮。单击第一个按钮“健康预测”,可以看到界面跳转到疾病预测界面,如图2-39所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P86_2.jpg?sign=1738985842-4PX9AzlPrj8bWXETU4kB4KGcOqiZ1LOO-0-850f3057a4de9776cd1869ea9dac261c)
图2-39 疾病预测显示界面
返回主界面后,单击第二个按钮“药物推荐”,看到界面跳转到药物推荐界面,如图2-40所示;药物推荐助手如图2-41所示;对不在数据库中的症状,提示不存在,不输出任何疾病信息,如图2-42所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_1.jpg?sign=1738985842-zYRlJIxbSgkNtodx0wlr7it8hNNP9pnT-0-cfeb0b84be9171a24e116182fb0659be)
图2-40 药物推荐显示界面
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_2.jpg?sign=1738985842-LeLSk21nM6s3arJCYAH2FHvvXE47ANnn-0-141539ed85e39c146f6dba61d957be09)
图2-41 测试结果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P88_1.jpg?sign=1738985842-eqjkpqX3l16j5sC8LsIGtcU5KYvigjAH-0-9b9f1da6ae14fbe52deaa17e98ab3da9)
图2-42 药物推荐助手