![AI源码解读:推荐系统案例(Python版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/894/44509894/b_44509894.jpg)
项目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=1739178683-JAbcBwIO6MYUR7uVMlYKkp6AV1h47rwf-0-9d43b9615db2b8fa503967660082071b)
图2-1 系统整体结构
2.1.2 系统流程
系统流程如图2-2所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P45_1.jpg?sign=1739178683-QQhjasR8HZTGtmNhJtbJaZ78sgUSdKx7-0-9f3fdbe2bddf5aef9c1fab8bbfdace78)
图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=1739178683-1tbEjNP2OmYJvhSVGcX5Q1VRJC9fMK6T-0-22606b43dc1c3382d59fb9eba3fa4dfe)
图2-3 成功读取心脏病数据集
检查数据是否有默认值,如果有数据会显示为NaN,且当数据有默认值时不能对数据绘图可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P46_2.jpg?sign=1739178683-9gaS4WBJksjpqfUXc0BWIazNDiq3D4zK-0-442ddaec566cce8ba49f2f4a54ac988c)
数据集没有默认值,数据的尺度比较大,通过绘图方式观察可以检查出错误数据,如图2-4所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_1.jpg?sign=1739178683-UjXg887JOOCKZrZeGqMnUuU18pxQXain-0-fda70defd6d25ff9afbd93d6b48defbf)
图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=1739178683-fVKz7KF1YjuRHKFwQWMxzEnxo86LQgZs-0-52a22d37fb7bbd07b2c95f097ab093b7)
图2-5 血液中胆固醇含量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_2.jpg?sign=1739178683-euSjuLdcjtRwWNIEoPaJnJHzEqf3oncf-0-12aadaba1fc91dc174cf37fbd28fcb21)
图2-6 静息血压
下面是改变数据类型,例如,胸痛类型,1~4是类别变量,它的大小并不具备比较性,但是训练时数值大小会影响权重。所以要把类别变量转化为伪变量,把4个类别拆成4件,分别用0、1表示有或没有。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_2.jpg?sign=1739178683-ghGihb7i7nxYkM2mMd8mpLt8fiK5wPYu-0-24be5b31f336368f43bac5b3ea1f3581)
转换成功后如图2-7所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_3.jpg?sign=1739178683-Wo9fwp4DsHjI7vFaYKoVMvS4fs3utPfj-0-c64691d0c7a8bd2ac510d7011036cae9)
图2-7 类别变量转换为伪变量
最后使用Scikit-learn的train_test_split()函数自动划分训练集和测试集。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_4.jpg?sign=1739178683-ESG0EiQztdnpJ8FJDC2ic6iahOk4qpC0-0-b3248ba2d7b2540712f38c29d7e80015)
2)慢性肾病数据预处理
通过Pandas读取慢性肾病数据集,读取成功效果如图2-8所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_1.jpg?sign=1739178683-txJ0UFfC1C4DS3TawqrdbHSEpyfDYYm9-0-d24e2cff5d54758e964cc7d35ed5bd5a)
图2-8 成功读取慢性肾病数据集
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_5.jpg?sign=1739178683-SoamM8Zy3hI0l6G7bPnq8ooqFP1YaGqw-0-111fbd0dce02e3fa1b8c1c37aeba39b6)
对数据类型进行处理,例如食欲(appet)数据为good和poor,脓细胞团(pcc)为notpresent和present,将类别变量转换为伪变量0和1。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_3.jpg?sign=1739178683-dGag8Q5cXjhhrO1XK8UyhmHBhFWranOf-0-e11903873ea251322057de2137fbdc54)
转换成功结果如图2-9所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_2.jpg?sign=1739178683-wr3Va56bwpiPwqKyWIzeYQhyouGRLiUi-0-b2cdcd4f006a9a7803b5646813a95cc3)
图2-9 类别变量转换为伪变量
检查默认值的变量如图2-10所示。
图2-10中可以看出默认值数量不小,由于数据集不大,需要采用均值归一法,对病人和正常人分别取所有测量值的平均值来填补默认值。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_1.jpg?sign=1739178683-3yhhV5OxbvnNpZtWyCYjkSvC55L7RYJw-0-d0b33d0363af580d8a9d9a91295f04c5)
图2-10 含有默认值变量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_4.jpg?sign=1739178683-SQOeGD8Cc4bGJ4LhHYRb31Or7L9vilAb-0-ea8f86e85a4ca0e786a922370ddd7ce2)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_2.jpg?sign=1739178683-qgpoHqrujM1x8U7VDb42DXMAvEfDj4FK-0-6e04a37ebb9cbf44039ba503efbf7de3)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P51_1.jpg?sign=1739178683-EgyKKtygGcicnmF4grY0QeymK3ozHOJR-0-fd08962ae4cda352d287ca5f5c784221)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P52_1.jpg?sign=1739178683-NXsh7Sc8AenmteskOQ9Hcl2b6CWs7AR3-0-604ab401d8def4288253e9cd5b5a8f8e)
2.模型训练及保存
数据加载进模型之后,需要定义模型结构,寻找优化参数并保存模型。
1)定义模型结构
本部分包括心脏病数据集定义模型和慢性肾病数据集定义模型。
(1)心脏病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_1.jpg?sign=1739178683-us4pzT7fdd7oCdzFin7DbybrPyBxtXvC-0-a8b89122d027b1f5da309e4b7c4f3402)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_2.jpg?sign=1739178683-XKvvGkVQ3mYT32YhZiW8nprMs7PG3NNI-0-fc1ce0ef51c77cc5872ab588a93b8cab)
2)保存模型
为了能够被Python程序读取,需要将模型保存为.pkl格式的文件,利用pickle库中的模块进行模型的保存。
(1)心脏病模型保存。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_1.jpg?sign=1739178683-RgMJUAVCJud30JttM2hUODQL59Jsn0Ra-0-b7a14200e40b0bc63702c6ee59b7af71)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_2.jpg?sign=1739178683-qd9WvdLwIA88neMPAYbRlNldAjRfFI0j-0-20f68435bdd77273b45e243127821d14)
3.模型应用
对于人的疾病来说,误诊带来的风险是极大的,正确率不是100%对患者就是损失。然而以往仅仅预测是否患上疾病,是一个二分类问题。原理上,机器对疾病的预测基于各项指标的权重。本项目充分运用机器学习的优点,将各特征重要性与各指标的数值相乘求和,得到一个加权值。在程序内部,预先对患者和正常人的各指标平均值与对应特征重要性加权求和,得到患者和正常人的平均水平。在定性判断为病人后,将用户的数值与病人均值做对比,定量给出用户的病情相对于大多数患者严重程度;如果用户被判断为正常人,则将他的各项数值与正常人均值做对比,给出用户相对于大多数正常人的亚健康程度。经过处理,不仅做到定性判断,还对用户情况进行量化。一方面防止偶然的误诊带来风险;另一方面给予患者与疾病抗争的希望,给体检正常的人敲响亚健康的警钟。
1)心脏病模型应用
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_3.jpg?sign=1739178683-6BGnLdY9mu7PkboeRQUP5k9YLKm4FI4z-0-dabdfcec0216a56c3436a00740e80f75)
输出的各特征重要性如图2-11所示。
通过图2-11可以看出,年龄因素,对患病是否有影响,并不重要,符合常识。然后分别获得患者和正常人的平均值,如图2-12所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_1.jpg?sign=1739178683-adDLMunDqDjEnxTt12rQeT5Iz2FvPNAB-0-f0379eb8d992121f80e9bd1c6326c909)
图2-11 心脏病特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_2.jpg?sign=1739178683-H5qzUJKWnZKqhNsyqFH6ELpVfVFnL0qf-0-57cc3f1683731201da727d1d86ce2e02)
图2-12 心脏病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_4.jpg?sign=1739178683-4YYTSjspRzeKh6gLeP5owDHYI2KCUzew-0-d94eac92bc41ad1b33bff861252dc168)
患者和正常人加权求和后的值如图2-13所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_3.jpg?sign=1739178683-a9Htns8X8jIpn0bfJlsuhEIadRmSwqra-0-c1e1c76f26ad58b5e0f5f4fa2eae4044)
图2-13 心脏病患者和正常人加权求和后的值
将这个值保存,当用户使用时,判断出是患者还是正常人之后,根据比值大小定量判断具体情况。
2)慢性肾病模型应用创新
通过eli5得到各特征重要性,输出的各特征重要性如图2-14所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_1.jpg?sign=1739178683-OQJdMkEqr8A9BzB8vNA2KxcAjpSTWzMh-0-ad6e29aee11d6769242996bb56d0fcc8)
图2-14 慢性肾病患者和正常人特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_5.jpg?sign=1739178683-18lj0LJaAvbzFI6MLd62ZuVJDxkmuo9u-0-7b64b227fee4e9661dc6cbea43b198fa)
分别获得患者和正常人的平均值,如图2-15所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_2.jpg?sign=1739178683-iplng79Vj1NDs6xVavwNRRx70iQqQBlS-0-09aed575cdd35bea2bdbf8d8a4f12fcf)
图2-15 慢性肾病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_4.jpg?sign=1739178683-XTnavkn6P5vSKw8inXSX25Or1VWWBvTV-0-1706a075fcb66b7143e47a21fbf50ee4)
患者和正常人加权求和后的值如图2-16所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_3.jpg?sign=1739178683-XnR0n2jHnLTDZXbUZXFcb8uFTwgTzZ8d-0-55d172436937684edefea2ef19ad5bd4)
图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=1739178683-1lxzvVwEJXfoNezgNfOu1v3ZO6Yb34Jl-0-e21c9fc476fc6164032b287f3821ebc6)
会自动从csv数据源读取相应的数据,如图2-17所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_1.jpg?sign=1739178683-OY0wfL7sUppImZezesg6UDCxLxCYxL2w-0-5c655ff5a3a1b71d04a1f7f8bde2c936)
图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=1739178683-YmUQ87RlsaZNT0Pdy2DngHa0nN7GANNR-0-f5aee8364d40d3c4910759d590a0eb3a)
图2-18 样本总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_3.jpg?sign=1739178683-ygey9vpf604tAr8WnfJxy9zlgcLC8eHz-0-1c00de4d06b14ba31f61028200010b08)
图2-19 1分和10分的评论总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_4.jpg?sign=1739178683-s3SojAKEh5ffkjQeLJk9wgueRsK9BYqu-0-a92122c38616e9cf41d371ea1fe1a9d6)
图2-20 用户打分
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_2.jpg?sign=1739178683-oHtlkyVQi0hj3Qx5Dm4y27zpUGpdSoSU-0-b6c144219073ef037b43d7ec34328bc1)
打分分布如图2-20所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_3.jpg?sign=1739178683-S5vAzKeToJAkBp2lutd7Cmva34wvbETC-0-965d88df6fc1fa79f9b2b00e97af29cf)
图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=1739178683-TXfd1tRBz0J1OKscGZUfv41qyiQmSA9j-0-6d0381281d697456ebde17b37ac6f1c5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_1.jpg?sign=1739178683-afYIS80qMs2zHuur7VwYuQhtsx2bByvW-0-ba20faba9d1bebd651836f28fa228b66)
图2-21 仅取出打分为1分和10分的评论情感分析学习
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_5.jpg?sign=1739178683-ntnfdc0cAjpAdgOSXFmjWxQ0JEsVZJmN-0-1533d7a2554111d77d1bbff0dd7e82f0)
发现一句话中经常出现不合时宜的符号,该数据集是网络爬虫爬取的,所以有很多字符表示成ASCII码,防止被误识别为分隔,使用正则表达式从审阅文本中删除这些符号。
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_6.jpg?sign=1739178683-p0XvPK4AFtpMwCXqfRhbhR2QzXLxxuIz-0-933658681f60bf4c3a945c9a583e93f9)
预测的标签是喜欢与不喜欢,但是drugName和condition种类很多,写进程序中可以简化工作量,所以需要将drugName和condition列前置到review中,并将完整的字符串保存为text列。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_2.jpg?sign=1739178683-ruw9yk9plsK8BoPAh4LZuzyfnLo0mHCG-0-e6df17fec224b80f82b7819452d480b3)
CountVectorizer类将文本中的词语转换为词频矩阵。通过分词后把所有文档中的全部词作为一个字典,将每行的词用0、1矩阵表示。并且每行的长度相同,长度为字典的长度,在词典中存在,置为1,否则为0。由于大部分文本只用词汇表中很少一部分词,因此,词向量中有大量的0,说明词向量是稀疏的,在实际应用中使用稀疏矩阵存储。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_3.jpg?sign=1739178683-7l4dYX60z6BEGoerxHTVPJ7ITJfVaXJ1-0-acf4e24a14e83f55eff9062d591ca385)
2.模型训练及应用
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_4.jpg?sign=1739178683-e9VzpnKkWzPMOShcqI4yi86ac2E5zBjF-0-34b71116e952adfe005f831d52295ba7)
仅取出打分为1分和10分的评论进行情感分析学习,如图2-22所示,打分2~9分的评论如图2-23所示,代入模型分析评论情感为支持或不支持如图2-24所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_1.jpg?sign=1739178683-iz5rSm9UdK3CjA0I4BHwdqF3DEmxRhUh-0-f7ba9083c2f340ecaf6dca831a3c6f0e)
图2-22 仅取出打分为1分和10分的评论进行情感分析学习
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_2.jpg?sign=1739178683-zwpVW6Ub101G3fjilJMolZAe0IPUb531-0-7e65f6f273023c21df0419523ab3fde9)
图2-23 打分为2~9分的评论
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_3.jpg?sign=1739178683-aNBccesSycSuoOxUBfLtMuqoNiiZGi1k-0-3dc1c9e5669b6fa70d122545aef8c5ee)
图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=1739178683-yvmYaivpC4uDzX0Ob2zNUJz9ir52NpTK-0-86f5a876d8435fc3259cd15e508a8c3f)
3.模型应用
将两个csv文件合并成一个,本项目对某一特定症状选取支持率前三名的药物。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P61_1.jpg?sign=1739178683-FCuq4YJ09RZPf5zbvbYbDyqynaSXIONj-0-39eb689f9f5de9bc6c5a361843086079)
得到一个csv数据库,但是数据库中除了特定的药物名称,还有一些特殊字符,通过编写Python脚本文件将它们清理干净。
2.3.3 模型测试
本部分包括模型导入及相关代码。
1.模型导入
输入数据包括两部分:如性别、年龄、食欲需要用户手动输入;心率、心电图波形参数,需要用户接入不同的传感器测量。考虑到应用的便捷性,直接从传感器读取所有的参数进行预测。
一位用户输入的数据如图2-25所示,判决结果如图2-26所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_1.jpg?sign=1739178683-nvPYn7gdItBrb8bSarmYISmus1Ml1BJj-0-a02a82be4687116a2ba8ed46aab5d8b9)
图2-25 一位用户的数据
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_2.jpg?sign=1739178683-dNiDETlepdFq6rVKvHtBgoDBDDU7Nr22-0-7726c450b956168146cc1f461b1f4cfc)
图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=1739178683-GBnZ9Dw2e0bOFk8cM17bG0cdbjk1vslN-0-c1397cbe1c2b79e76ccb93177b772f7c)
图2-27 量化
之前平均值是病人比正常人的小,所以大于分界面更好。病情指数比平均数的四分之一还小,量化后督促病人抓紧时间治疗。
2.相关代码
本部分包括模型预测代码、模型应用创新代码、用户接口及界面可视化代码。
1)模型预测
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_4.jpg?sign=1739178683-ZlyPmrxlSsathMVIghyHn5k5WFZZhVTA-0-9c5ec2eab32e1cc44ac612df602b83ec)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P63_1.jpg?sign=1739178683-K6lwcT7rEaXXQCzJynFE3OdGYorILuWm-0-9624336dd95b1c936400ffd44b340063)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P64_1.jpg?sign=1739178683-46s1K0JbkD8ECwSq3v9ZhftNupBKoPOR-0-b09f764199d17000522ea50e8ca1e5bb)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P65_1.jpg?sign=1739178683-yYIK6wgFExjfXVz9By7UKF49HTKMS3iV-0-b3dd6ebfa1313969ac147d9073b7793e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P66_1.jpg?sign=1739178683-AoDyhEvy81mivIzXnSTfhJk3UXvm0sYl-0-802d61b51c7185cf7a92949aaacd2011)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P67_1.jpg?sign=1739178683-yOzMkzIY1LFLUlUfaaB9WEu2R1l63PKO-0-8134b962a66c9fa2e479c34d61874615)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P68_1.jpg?sign=1739178683-rZHqhUqwUKHdLTZyJYYUKGpqoG7TwXHX-0-8f02711cf2c4219ad277268a8097638b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P69_1.jpg?sign=1739178683-QzezqVJgZlUV4vdasiVe8PDaLkMGBCYm-0-54910b40ff432f174691cd8786ddf400)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_1.jpg?sign=1739178683-0cDeuTxfUAb7YLas7edQtB7o6c0qSUmz-0-08e247622bedc17eaaea1bc2c164cbab)
2)模型应用创新
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_2.jpg?sign=1739178683-KPwJFV1mt2f0FqtaBAUykLxl22r1B1EO-0-41b1bb655a1641918a7551872b782bda)
3)用户接口及界面可视化
本部分为主界面GUI设计及子界面调用。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P71_1.jpg?sign=1739178683-vnocmBzMkP3NiXjEs48SZ5x6TCXqsdwG-0-1e431eff8adaf7ad4b4bb2480ebec2b5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P72_1.jpg?sign=1739178683-I6slr6Fa2zPKvLqdtG32m1yUlKpDHnxF-0-3d3f8b6a8526684b81921837b15f299a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P73_1.jpg?sign=1739178683-zFKnclPX9Snrl4kmNof2NbLRTmA6wriD-0-2b277fc30cc54f01ddd8ccc8af2bd335)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P74_1.jpg?sign=1739178683-8ABegANN6QBr7tR8RaXObNUk0LUntFqe-0-ffe8276a9cfdd2e2fecb77339da0cc9b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P75_1.jpg?sign=1739178683-YUI0Nz2pqMYQyx6rY8Y71w2WD06yqKSO-0-8183d4005cb008f95718d484527c8fc0)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P76_1.jpg?sign=1739178683-zUHUhuz6LdQjMbYafdMh6dVLsVex5s29-0-d2103645d4268ec54cd9a8bf8edf075a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P77_1.jpg?sign=1739178683-UhaNIy7eyRb3Zzd2G1mpYXyrwOboGxiX-0-48af8ab99f596a0e518996318a61b8ab)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P78_1.jpg?sign=1739178683-1RYgRLgawSX2D0IKacFnyGJeSpdhKTf8-0-076364b8c0c8575790edbb3f9cc6944c)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P79_1.jpg?sign=1739178683-0MLRfipFrkKms7RYfRf2hOvrH6nh1Jtj-0-a0510f932c110da6fde709f89caa16ab)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P80_1.jpg?sign=1739178683-mWz46KrpxfW0k55aAT9mRgVjGG7NIM3i-0-2d60951198bc6276958cf646eb6092df)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P81_1.jpg?sign=1739178683-9oImNXtfbqOSfVNk8rirBjb92A1T2rGQ-0-fd4a133d0c4f294dec764895979113c7)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P82_1.jpg?sign=1739178683-I27lcUOmjmc7w9sc93HbE0Y4YbJQrviI-0-3a686899955f15f4883435631e4bd38b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_1.jpg?sign=1739178683-gUTkgejFvYAtEEwX8IyPh0CJmTTpr2zK-0-ad82b2bc9fb77e41ba67c029a7383dd8)
2.4 系统测试
本部分包括训练准确度、测试效果和模型应用。
2.4.1 训练准确度
心脏病预测准确率达到89%以上,模型训练比较成功,如图2-28~图2-31所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_2.jpg?sign=1739178683-e6lk5vXIUaIr6YKZW49mYfvytIyTMR9i-0-27838a40b63a871c1bc0e60d2b99de38)
图2-28 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_1.jpg?sign=1739178683-jpWvqRnrfwI5x12vaaz2GJjLmqjYkgkR-0-5752bcf6b98bc98ae783d8c6b8ce7353)
图2-29 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_2.jpg?sign=1739178683-aDtvDWd6xKQOmGmPA0lV2Ah4oTAify7U-0-a6a179098f464638142e2827deaa07cc)
图2-30 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_3.jpg?sign=1739178683-rWg4fVo3v55EhjZcqTTI5dUVvwo5TbzS-0-251887f4bc6f42a949526713244a6df5)
图2-31 ROC曲线面积
慢性肾病预测准确率达到100%,如图2-32~图2-35所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_4.jpg?sign=1739178683-A3rbKwgfuqE6tE6P8BzKs0huSD5AN6U6-0-4e9bb1d7934664b6e78e5b79cd40c5e3)
图2-32 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_5.jpg?sign=1739178683-50bXZkeUbSkAN50np2pvIZkEtA2RtbWp-0-9f0d978825fd89eecb06f0dbb305afe5)
图2-33 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_6.jpg?sign=1739178683-oDlBbY8LHTt47l6oZaQyeS9RpiRNFKoc-0-fe27b71cd289a3b461dc7851d6c9cdc2)
图2-34 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_7.jpg?sign=1739178683-aoOoNHZKzR9E3nelJbAHjsL8XptVxkCT-0-0f44deadd874676e0d9fc4419a9c53fb)
图2-35 ROC曲线面积
2.4.2 测试效果
将数据代入模型进行测试,分类的标签与原始数据进行显示和对比,可以得到验证:模型可以实现疾病预测和药物推荐。模型训练效果如图2-36所示,药物推荐效果如图2-37所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_1.jpg?sign=1739178683-9yi4UT3C1eEUldES45XQxAjiYiMsBJrh-0-9f253d9a8268a1f4c544377efa9f17fb)
图2-36 模型训练效果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_2.jpg?sign=1739178683-x8ilvnWqGK03nMIxXfdsUtAeGQlCCCB8-0-faca2a4315961254412995228a4331e3)
图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=1739178683-4dc5IXSAA1pO3FgTC9FUlBtmflH69AZ4-0-4b5002b5fefe7562a7d57b59d9a20cb9)
图2-38 应用初始界面
界面从上至下,分别有三个按钮。单击第一个按钮“健康预测”,可以看到界面跳转到疾病预测界面,如图2-39所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P86_2.jpg?sign=1739178683-aGeRw1OkSox15ULOV7wjAPKmcwOX2KUU-0-07a128860656cb7d4e57a05865072b19)
图2-39 疾病预测显示界面
返回主界面后,单击第二个按钮“药物推荐”,看到界面跳转到药物推荐界面,如图2-40所示;药物推荐助手如图2-41所示;对不在数据库中的症状,提示不存在,不输出任何疾病信息,如图2-42所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_1.jpg?sign=1739178683-nL0yMBo3BnxcNFzLDQuYRmh5C0tLizCT-0-f0ab3b0d02b5ac29e4d958292fadda36)
图2-40 药物推荐显示界面
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_2.jpg?sign=1739178683-fS7x7cPeLMzdPtvW6K0jjrQ73rX7qzUH-0-d636fbcba0184173ea10cc4fff346fb7)
图2-41 测试结果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P88_1.jpg?sign=1739178683-ZPZRPDwuqqHPkMfLzKivZ9nYTe6PrK17-0-369f4a7e4b71ac62039849c764226fee)
图2-42 药物推荐助手