![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=1739259091-Q9lYdAIzFkgTnsnkAAvI48G5HWKtIMl0-0-fe49cbdc66d3f671e01997294c3f3795)
图2-1 系统整体结构
2.1.2 系统流程
系统流程如图2-2所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P45_1.jpg?sign=1739259091-f45TdAhJwJ9NnDnmo5zAwvSA1TDHrvOC-0-08682f6385fec37b4d305661f611a711)
图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=1739259091-hm2v0iiH6pCZU3XwzrxWDgFMa0QfWw8K-0-7b25d60129cf04209956b596b09fe065)
图2-3 成功读取心脏病数据集
检查数据是否有默认值,如果有数据会显示为NaN,且当数据有默认值时不能对数据绘图可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P46_2.jpg?sign=1739259091-KeTW47TyGjxOym7PkeZskvX1sp1v7AcZ-0-4f6f6a68296be9f3048761321eb07beb)
数据集没有默认值,数据的尺度比较大,通过绘图方式观察可以检查出错误数据,如图2-4所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_1.jpg?sign=1739259091-ZXPyQWKirFyrgk1h2UuNrkIdbjkJs492-0-d87c2ffd631354d5d3bc2fb57dbb66ec)
图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=1739259091-BEODI030wIeZeG4xfh56OcpaYgE13vvw-0-a003d56ecc316caca8a01ed19c38c5ed)
图2-5 血液中胆固醇含量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_2.jpg?sign=1739259091-86VvldsWAjS7f2J57WtkWpVkd8ZU37wO-0-79827ffec05bc5a69fbe2481b1ca801b)
图2-6 静息血压
下面是改变数据类型,例如,胸痛类型,1~4是类别变量,它的大小并不具备比较性,但是训练时数值大小会影响权重。所以要把类别变量转化为伪变量,把4个类别拆成4件,分别用0、1表示有或没有。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_2.jpg?sign=1739259091-8GXIwS2LxcmHJHVWUvlm8oR9TMkfIYmR-0-7ce4d4ea12a1b7f677287ca331f7ad87)
转换成功后如图2-7所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_3.jpg?sign=1739259091-aohk94R8zBbhMhW1OzoraTwzRIdK1qpK-0-d8051e906901fed56bba85296d23e46d)
图2-7 类别变量转换为伪变量
最后使用Scikit-learn的train_test_split()函数自动划分训练集和测试集。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_4.jpg?sign=1739259091-HQlUeJZpXcApQ8THjdf2ZaFYKKGhnC3A-0-05d1375bde91e86bef7e9e87c6b4e470)
2)慢性肾病数据预处理
通过Pandas读取慢性肾病数据集,读取成功效果如图2-8所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_1.jpg?sign=1739259091-pbqMND4uipe1PKrMqwXu05CsBxxFpgU1-0-a01b3116a131eb29433ddb0bb65e5ee7)
图2-8 成功读取慢性肾病数据集
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_5.jpg?sign=1739259091-wNvMUfEmmlM0JFVndhxtj8QbmHmP0BQz-0-6ca8a0dcc0965d4620932b49ca3331e3)
对数据类型进行处理,例如食欲(appet)数据为good和poor,脓细胞团(pcc)为notpresent和present,将类别变量转换为伪变量0和1。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_3.jpg?sign=1739259091-7bLwTR7DiFa0yU7nkbzbotF51qonW2QP-0-77f01c39b8631e8d695656c65152305c)
转换成功结果如图2-9所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_2.jpg?sign=1739259091-vXBPinAEfF2DEauhnWNQO8lLRDq1Ufx6-0-4ee3c5b4d72bfe29370fbc6c37e723f8)
图2-9 类别变量转换为伪变量
检查默认值的变量如图2-10所示。
图2-10中可以看出默认值数量不小,由于数据集不大,需要采用均值归一法,对病人和正常人分别取所有测量值的平均值来填补默认值。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_1.jpg?sign=1739259091-NSUNIc2NGXMpiyASLMDbdpS1fpSqmT36-0-2d0aae5e31917df76a409bb7a4f330fb)
图2-10 含有默认值变量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_4.jpg?sign=1739259091-dLiqho7SkrHrvaoiGHIJoF3Asb6L1htQ-0-df98a75dd8af9f5e960e43f2f5b1676b)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_2.jpg?sign=1739259091-emenw2kNc2P37AzuGkmgRgCKmFoHZhTZ-0-4c76f9f3c6d2bf00bc0a577916319e30)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P51_1.jpg?sign=1739259091-MCoh1ME7beVhCfvJ31ClvgEsXJSR1rbr-0-316bb4aece57793c791b5dfe5818821e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P52_1.jpg?sign=1739259091-KFfq0MEscV4FjTE2U55OCZhhoyosM0K4-0-abbd58fb7b90cbd44c0b1936124b53d7)
2.模型训练及保存
数据加载进模型之后,需要定义模型结构,寻找优化参数并保存模型。
1)定义模型结构
本部分包括心脏病数据集定义模型和慢性肾病数据集定义模型。
(1)心脏病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_1.jpg?sign=1739259091-D9c5Vrmy0elBCatZLLh7QVwi4w11dAxd-0-98f0d2b3503e53bac729e6d992fed938)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_2.jpg?sign=1739259091-0jOoktxiq73F3KmOtR6WVPTg6t1FmsPN-0-7fd5c817a962e7a5214e94bfcea8a8db)
2)保存模型
为了能够被Python程序读取,需要将模型保存为.pkl格式的文件,利用pickle库中的模块进行模型的保存。
(1)心脏病模型保存。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_1.jpg?sign=1739259091-mDP2GEoXMPsXPBbMBfKAT6z3wotN5WCK-0-bf5e675cdb21671f4245fad367af6caf)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_2.jpg?sign=1739259091-Ahoj59PhYYNtN4rspV4guUeHNn0Bt5C5-0-ed3a287d79caaf98b92d8756c12a730a)
3.模型应用
对于人的疾病来说,误诊带来的风险是极大的,正确率不是100%对患者就是损失。然而以往仅仅预测是否患上疾病,是一个二分类问题。原理上,机器对疾病的预测基于各项指标的权重。本项目充分运用机器学习的优点,将各特征重要性与各指标的数值相乘求和,得到一个加权值。在程序内部,预先对患者和正常人的各指标平均值与对应特征重要性加权求和,得到患者和正常人的平均水平。在定性判断为病人后,将用户的数值与病人均值做对比,定量给出用户的病情相对于大多数患者严重程度;如果用户被判断为正常人,则将他的各项数值与正常人均值做对比,给出用户相对于大多数正常人的亚健康程度。经过处理,不仅做到定性判断,还对用户情况进行量化。一方面防止偶然的误诊带来风险;另一方面给予患者与疾病抗争的希望,给体检正常的人敲响亚健康的警钟。
1)心脏病模型应用
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_3.jpg?sign=1739259091-Kyxkb35XcE2kHsOv8x1Ddr3Pa8XlwE7Z-0-9b05c6af7291c80d6bef668d10748092)
输出的各特征重要性如图2-11所示。
通过图2-11可以看出,年龄因素,对患病是否有影响,并不重要,符合常识。然后分别获得患者和正常人的平均值,如图2-12所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_1.jpg?sign=1739259091-ckqInN2attv5EI6vP0zh88b8FqjCOzxa-0-879e63fd243717df66dfff4cdd72f6b4)
图2-11 心脏病特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_2.jpg?sign=1739259091-0pe5xogkBWskHvjomXfe7Edaa709jE8X-0-d3ee5ada92de6494c0a5f8d18181f255)
图2-12 心脏病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_4.jpg?sign=1739259091-4pymRy2w9xzQa5o2hcFpEwcV9ZNlGB1o-0-8f1bdf95caf5c883e996f6d82a06e30a)
患者和正常人加权求和后的值如图2-13所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_3.jpg?sign=1739259091-9jve4tEOAKH5bUsWuwtS2CRAQ0PnSIsu-0-b3be8cc76120c1e247a8ff4718a71713)
图2-13 心脏病患者和正常人加权求和后的值
将这个值保存,当用户使用时,判断出是患者还是正常人之后,根据比值大小定量判断具体情况。
2)慢性肾病模型应用创新
通过eli5得到各特征重要性,输出的各特征重要性如图2-14所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_1.jpg?sign=1739259091-AIBgyKb0buwazttSSnivVGGrkkk0ETse-0-4ea418606b1d5286ccd38218e9b93771)
图2-14 慢性肾病患者和正常人特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_5.jpg?sign=1739259091-xG3dDbrrUtFvi6o1GKFuZ8vLdIqdKmhv-0-3c1997e17c248199dbe5cab9ad09caa9)
分别获得患者和正常人的平均值,如图2-15所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_2.jpg?sign=1739259091-1hp5RHCpCFxYk7fTtOa7pJ2YL6wkvlN3-0-bcd9a63323d61681be59b047ee68aad0)
图2-15 慢性肾病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_4.jpg?sign=1739259091-xU2M5cjBA3t6Nr91dLR586k1hr0ntrRr-0-9184ed98c8345dd0c888de41f66dfb94)
患者和正常人加权求和后的值如图2-16所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_3.jpg?sign=1739259091-lrxWmKdKZZPVzSJ3QxhytnzCiYL420Jz-0-67264aef6182dd75d49a76116c6e6b64)
图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=1739259091-EKm099xDebZeyn1YgaBZiotAF3vJpaNu-0-b998e187c327ae755fdf27b1762a7708)
会自动从csv数据源读取相应的数据,如图2-17所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_1.jpg?sign=1739259091-6gwQoRCS7TRTIgx8BqfgZe805Kps6iDw-0-75a554523f6e6ddec13b748471f93bae)
图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=1739259091-dPEua2oaTy8nzJK1KVXgn538oyq4L6uJ-0-0fed5938141893fd2d83ee522575c7b1)
图2-18 样本总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_3.jpg?sign=1739259091-bDg2bmOn8rliOllgWq5kAv2ilEEMDePo-0-6d98fecba96de9669a60f2a9bea3592c)
图2-19 1分和10分的评论总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_4.jpg?sign=1739259091-wGjkEsrmV9tGEszhX9XVudn79nqN5ZWD-0-1c9bffc781499f4082b58c8f00ad31f6)
图2-20 用户打分
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_2.jpg?sign=1739259091-n45Lo3b3kkSwaZqXLwLJI7eR0lK8U2P2-0-cecedd02f4b3a59ba1e13c60fddfca48)
打分分布如图2-20所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_3.jpg?sign=1739259091-67VWbDWdFftDeQr724s68iO8bo5PCfmU-0-4b5a4cff9939cd620aab84504115f1f9)
图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=1739259091-lCZeBfWZQVrKaI1mof9aLvHVbgZ9ZRv3-0-d180b194a62dc477c539e4076fcd7173)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_1.jpg?sign=1739259091-4Like1GbN4IMo79tbKbD7AIfOvIVRetP-0-b5f676b85ec4eef9bed5f0ee8ecbd520)
图2-21 仅取出打分为1分和10分的评论情感分析学习
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_5.jpg?sign=1739259091-byLF3LqJIOZaKvqY78yR3gdPOazp5Yyt-0-f2040be42d88474d3331a78ab2fd63ae)
发现一句话中经常出现不合时宜的符号,该数据集是网络爬虫爬取的,所以有很多字符表示成ASCII码,防止被误识别为分隔,使用正则表达式从审阅文本中删除这些符号。
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_6.jpg?sign=1739259091-0ApGU4Xo6gS6kUjLswhowbJqVSxiNbb4-0-5c799b92086579216bb9e3bc598a650a)
预测的标签是喜欢与不喜欢,但是drugName和condition种类很多,写进程序中可以简化工作量,所以需要将drugName和condition列前置到review中,并将完整的字符串保存为text列。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_2.jpg?sign=1739259091-2iN7HBIx8Lclk1hEuIUsRD9LXoZvsizt-0-5a7d43a4639afb30ce53eb12c41af2e6)
CountVectorizer类将文本中的词语转换为词频矩阵。通过分词后把所有文档中的全部词作为一个字典,将每行的词用0、1矩阵表示。并且每行的长度相同,长度为字典的长度,在词典中存在,置为1,否则为0。由于大部分文本只用词汇表中很少一部分词,因此,词向量中有大量的0,说明词向量是稀疏的,在实际应用中使用稀疏矩阵存储。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_3.jpg?sign=1739259091-XQ1vVZnO1VKEsdvLI1pbtUlc1zbSajiA-0-d8772de6015c5672a542866e73721c5f)
2.模型训练及应用
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_4.jpg?sign=1739259091-StscbMZUbZeMeMNkkSziOZYKcBNVQq4u-0-696f9cefbeec937127be168ce0f345b2)
仅取出打分为1分和10分的评论进行情感分析学习,如图2-22所示,打分2~9分的评论如图2-23所示,代入模型分析评论情感为支持或不支持如图2-24所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_1.jpg?sign=1739259091-yqQDVoSD8qi4k3wD6XsTOgp8WH2vLqKB-0-4d6b3a291b1b41e591d3cc9295c9205e)
图2-22 仅取出打分为1分和10分的评论进行情感分析学习
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_2.jpg?sign=1739259091-04HbgKx58Xakn2s2a1tGLJ4FtsVfcHkS-0-b42ca3b69093fd3cc56bb66ad75e2a05)
图2-23 打分为2~9分的评论
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_3.jpg?sign=1739259091-Yaj2UgqWxixsljH3zz0K1k75VREihsnk-0-3f8f19b91d09a172af09262096c9ea8d)
图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=1739259091-E9yT5DYQSN89JcoXBYQdhf9LePXHg7bg-0-644fae407ca31787268e99c90a83ed80)
3.模型应用
将两个csv文件合并成一个,本项目对某一特定症状选取支持率前三名的药物。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P61_1.jpg?sign=1739259091-gjH0oAqbnS5RFAo3clEDnFm2ByomrPx1-0-a3700312c26aac63e28470a12c9634f9)
得到一个csv数据库,但是数据库中除了特定的药物名称,还有一些特殊字符,通过编写Python脚本文件将它们清理干净。
2.3.3 模型测试
本部分包括模型导入及相关代码。
1.模型导入
输入数据包括两部分:如性别、年龄、食欲需要用户手动输入;心率、心电图波形参数,需要用户接入不同的传感器测量。考虑到应用的便捷性,直接从传感器读取所有的参数进行预测。
一位用户输入的数据如图2-25所示,判决结果如图2-26所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_1.jpg?sign=1739259091-jbCH6acn8FNRPP8aW2EVT4XBRz1vBFXl-0-33cfb760daf0d0e09f2ec1884da330f3)
图2-25 一位用户的数据
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_2.jpg?sign=1739259091-DQKER1gy1MDAdWnCilhHJ50XD89qRirS-0-ad27da1dab4c1b250ba2736b7f0e06fd)
图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=1739259091-BeOJvUbkXUwTMafs7RtuT8vv5Heqljtj-0-b21c9c1666cab911431a44dbb3b9b320)
图2-27 量化
之前平均值是病人比正常人的小,所以大于分界面更好。病情指数比平均数的四分之一还小,量化后督促病人抓紧时间治疗。
2.相关代码
本部分包括模型预测代码、模型应用创新代码、用户接口及界面可视化代码。
1)模型预测
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_4.jpg?sign=1739259091-iinojLOm4q71yXgmcR6qJlUwKJsxAgcL-0-915c6e7c297c765d74d2a8e951c4aecc)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P63_1.jpg?sign=1739259091-J7rm5o80Lxd5JHu7E2bOOPX3iD8hEM4A-0-2ab89edb5e347f219c3b14b35c186a50)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P64_1.jpg?sign=1739259091-MAFCUpRn0SEE05kAWtzkjUSLXLOX5PbJ-0-46db9c12dbfb2742fd2ff67ed4d62a76)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P65_1.jpg?sign=1739259091-netYOrTOaN7P0qdicHXaxjpmu3Aran4A-0-87d70fe4299bcfce7852d0f87eb27a5a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P66_1.jpg?sign=1739259091-y7HZrFOw6HhZ2ZFJl6gAcLjmdtKvB0wd-0-6b306b3672ccebccad76b825b914f24e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P67_1.jpg?sign=1739259091-RuYgaZyZPI6BqDoToNX0foaZoQDVJ8Yx-0-dcc1a8b18571e97f0b003026a0beb287)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P68_1.jpg?sign=1739259091-BYoz5GX2GS23BeMB4BcbFC8Y1eAo9lUh-0-15fd7357009c802d0e1fb80a94ef2141)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P69_1.jpg?sign=1739259091-iO1rAi4Jh1GAb8Jz5ZBGtJLeMudCjONz-0-30f0e86affeea93612e5c76dfa8151e6)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_1.jpg?sign=1739259091-iMCoJF8cB7riuzbG4PVsi6KBzJF6OEvz-0-28784a4cc0d02a0d97e9d61a4f1bb391)
2)模型应用创新
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_2.jpg?sign=1739259091-9Iz0Tc5JiqVz0J4h6pBiFbcp0ifVQvAy-0-2a4fb64f00b390d1e64673435af8e018)
3)用户接口及界面可视化
本部分为主界面GUI设计及子界面调用。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P71_1.jpg?sign=1739259091-pwh7ysRVdWBC533Pfda25r0HLbxe79ql-0-064dd5f56134b216e7f6b697783ec00f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P72_1.jpg?sign=1739259091-AWrSEJM6YOOadAuDhU70v0ncBI3Ow9ie-0-85b539dfd22705c7569b0211013e27af)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P73_1.jpg?sign=1739259091-uTe9YB3YVeaURSlrL2mgKzkbQskNoidZ-0-5ec0c65c1c5bf3b59a8ed2ff879001e8)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P74_1.jpg?sign=1739259091-0fWWOOWLLBw0XksuPoHs0YozF57BX6DA-0-b0612d83d8ca398afd21ab48e45a0965)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P75_1.jpg?sign=1739259091-gNn2WFQ9gASmuEhxD1WYd84AHICQSUnE-0-cfb3c9281db202875a5040810272fb8e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P76_1.jpg?sign=1739259091-TDtxT9XO9Akp023EgdAsN5szFNsdhfFJ-0-3d7bdae12f0fc57cdf3187cce040e1cf)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P77_1.jpg?sign=1739259091-X36PkPNoysvEsiDTpJBGRLPcz0pB78fU-0-9e080b3a7ddec344508161688824abc5)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P78_1.jpg?sign=1739259091-nckDvW7xAUbp5PGJPvNsGBbPC2rmqHnO-0-635a0acf24959c8eecac645e2e2de0b4)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P79_1.jpg?sign=1739259091-g7y0Gf1yPh4W07SX7z5WxAwZG9CQKXwF-0-3703de04a71e8cd15ae3684786e2648a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P80_1.jpg?sign=1739259091-dFMt3LXOixxwG9LntJspiLOE42NcgqTx-0-aeef64a48a295d0731a1280943431650)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P81_1.jpg?sign=1739259091-rp4NOKjV7kaigZUZSRYDHnKc8wUlvwig-0-55bc80c064eb1466a04b61825d4c8cee)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P82_1.jpg?sign=1739259091-QTIi8oamsvYvjcjQbcjlbQfqJM9TJ6zG-0-75925e62e0d77b430b4677098b4cb245)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_1.jpg?sign=1739259091-iLHGPpzfYv0KyGA5QIQcOgnSahExOS5k-0-966311c30108565ad705483ae50a37b3)
2.4 系统测试
本部分包括训练准确度、测试效果和模型应用。
2.4.1 训练准确度
心脏病预测准确率达到89%以上,模型训练比较成功,如图2-28~图2-31所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_2.jpg?sign=1739259091-WSwusmlAWtwzutD4nV6ZtpxMdl9GxeAc-0-0bbd26862a4aa180ac0e23d0f813011f)
图2-28 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_1.jpg?sign=1739259091-QuBNfa5L06rieRFNaocRquxhHGmXwBJl-0-872f51dc89ba8b10835c659915008876)
图2-29 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_2.jpg?sign=1739259091-am9evn6cqIu19prb2vtvb8YIe6pMIOqJ-0-a18f55a46d074795a64ad5c0eb969355)
图2-30 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_3.jpg?sign=1739259091-CYcZQsbnx1wG1Y76oZEERggLb8mm0xsk-0-fbadf48d8f13a38f86fda140f6aec5ff)
图2-31 ROC曲线面积
慢性肾病预测准确率达到100%,如图2-32~图2-35所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_4.jpg?sign=1739259091-0vBmiMKRL0eQpqWU46R6llE25jRpXVbo-0-d6bf318ebfbc2600ba07c85bb1cdb225)
图2-32 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_5.jpg?sign=1739259091-xNKhUUcbEzqvRv2uUu4Hsf8qmTqnLoTM-0-2c1052d07977a1fc3c955e36b9e8e598)
图2-33 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_6.jpg?sign=1739259091-EUYQbgtVkev7iiqYcr5VK2NVDNDLTd3Y-0-9ed72d3a5cdf297536af51c732f12988)
图2-34 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_7.jpg?sign=1739259091-PC8wUoVEmqKikrawDTfbOmk9w2h5DstU-0-fc99b2d6b7bf8f8ef55708a1c856517a)
图2-35 ROC曲线面积
2.4.2 测试效果
将数据代入模型进行测试,分类的标签与原始数据进行显示和对比,可以得到验证:模型可以实现疾病预测和药物推荐。模型训练效果如图2-36所示,药物推荐效果如图2-37所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_1.jpg?sign=1739259091-4o5Hn1IJf1mE8XykczLwmJQM8pAWHUOZ-0-c901c643716a7d6ba2bcca077fdf7910)
图2-36 模型训练效果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_2.jpg?sign=1739259091-LMUNkzsIj8u79qj8WzkJeGuQFMbP6vvY-0-f3bedbf5e7add6368161e37b950afa83)
图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=1739259091-kdT9QaJEKFDJSz7iMMyQm4cbdV2c5dkD-0-79f368084b4e28002b6da4578df5352e)
图2-38 应用初始界面
界面从上至下,分别有三个按钮。单击第一个按钮“健康预测”,可以看到界面跳转到疾病预测界面,如图2-39所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P86_2.jpg?sign=1739259091-4YbgTs6yD58W2aGCOv9ovKJyM1AnHHIN-0-7f715b5776e1131ab15860a5276fcb77)
图2-39 疾病预测显示界面
返回主界面后,单击第二个按钮“药物推荐”,看到界面跳转到药物推荐界面,如图2-40所示;药物推荐助手如图2-41所示;对不在数据库中的症状,提示不存在,不输出任何疾病信息,如图2-42所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_1.jpg?sign=1739259091-p0ArmBmI6QZIp7Tt4nGvG1YfW09We8hu-0-5d9e2df8b8f7478c4a0562dc8953e02f)
图2-40 药物推荐显示界面
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_2.jpg?sign=1739259091-4DpNEFqMcTKAWXD4pwXmBIkotaevAzNo-0-294234b8b7c69a75bd3323f8bdf3f99c)
图2-41 测试结果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P88_1.jpg?sign=1739259091-x2U1TwET6QUd2QPydSPaJ9kevcnODDXb-0-82be5f8939b7e959f6ea0b8d33d60d92)
图2-42 药物推荐助手