![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=1739354669-PmCAK0g6IcbHIJIOdDcSCIMrKohcUWPa-0-1d78ce373935f2d6a5b9724a69051846)
图2-1 系统整体结构
2.1.2 系统流程
系统流程如图2-2所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P45_1.jpg?sign=1739354669-d60MtzIi3jVCoiFpWCLWtqCa1FlHYU6n-0-74c2ad8e5657f607ac52cc81edb72325)
图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=1739354669-dTPXr08kWJbTbAJwdwYoTJKw1oCOuhdv-0-844e5269c638f0fe065b2b43b5260da9)
图2-3 成功读取心脏病数据集
检查数据是否有默认值,如果有数据会显示为NaN,且当数据有默认值时不能对数据绘图可视化。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P46_2.jpg?sign=1739354669-YaK9RiMjuY2hRrAhX6Ke6b9PVVNTp8Xl-0-acea39613dc356f1d4936e145de6966f)
数据集没有默认值,数据的尺度比较大,通过绘图方式观察可以检查出错误数据,如图2-4所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_1.jpg?sign=1739354669-YjdbfUqNJn3ykSDD0u55EvpoM1Gd939n-0-85dbcd6ce1f3e8fc53740999f584f900)
图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=1739354669-vW8FWnELw3rJBiWAUnUNDSv9gFGxnDK3-0-87c3ac056bfb2275b7776e10af679cec)
图2-5 血液中胆固醇含量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_2.jpg?sign=1739354669-BIMP7scDt8vkXtb1RaYLQz7qUUk7LYHA-0-cd5bb4ba947d72662115e5a69ea6c715)
图2-6 静息血压
下面是改变数据类型,例如,胸痛类型,1~4是类别变量,它的大小并不具备比较性,但是训练时数值大小会影响权重。所以要把类别变量转化为伪变量,把4个类别拆成4件,分别用0、1表示有或没有。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P47_2.jpg?sign=1739354669-oxkMVLS64w7YIjMapdNVUCmcLUBRj1zO-0-254c179e3e09a156c4cb1426d71a616e)
转换成功后如图2-7所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_3.jpg?sign=1739354669-YkFPlBgWurdgEAC6mHsCiBgFcq3zb4V0-0-0892eaf072add5f3240feed0001799fa)
图2-7 类别变量转换为伪变量
最后使用Scikit-learn的train_test_split()函数自动划分训练集和测试集。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_4.jpg?sign=1739354669-jdhUGIjCtdJE7ur8QvXf8dZje3XQHMzI-0-416b6d927f5a52e2a8be25c85552b380)
2)慢性肾病数据预处理
通过Pandas读取慢性肾病数据集,读取成功效果如图2-8所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_1.jpg?sign=1739354669-EqHfpZmzT3MSuSjKGuoq1n5F1emggmY7-0-2e571ec155e61a015ec43c5d9d25ddd7)
图2-8 成功读取慢性肾病数据集
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P48_5.jpg?sign=1739354669-IcYc7Kn4OS9TWVKYgoclFELDaQa1qRcP-0-0b132fddfb6b9d2610015b05cf163df3)
对数据类型进行处理,例如食欲(appet)数据为good和poor,脓细胞团(pcc)为notpresent和present,将类别变量转换为伪变量0和1。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_3.jpg?sign=1739354669-wxBMz8sRe03iKriZy1CsPenqYM9Q1Fpu-0-4cb3a88d2584ec2555285d8ff3acff94)
转换成功结果如图2-9所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_2.jpg?sign=1739354669-q5UuBaUQkZ0Qx3nMTxXiExS1xWbgM22j-0-fc200978c236c2042d793098cf218b63)
图2-9 类别变量转换为伪变量
检查默认值的变量如图2-10所示。
图2-10中可以看出默认值数量不小,由于数据集不大,需要采用均值归一法,对病人和正常人分别取所有测量值的平均值来填补默认值。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_1.jpg?sign=1739354669-H19oPtJ1jd8wu6KxgZdep3V0x2tklg9z-0-376c6ac36d788a8756e3b3f36f29a2e2)
图2-10 含有默认值变量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P49_4.jpg?sign=1739354669-Ej2qoYM00soUI24FPV0SdrIXvRUEXYGy-0-ff361394b480f4f45fb9a78e7c93c36a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P50_2.jpg?sign=1739354669-I8b67ExAN4EX83OK9Bv7HRLt15kuQ53U-0-0b7a78181e974bb05a2819537678d4d3)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P51_1.jpg?sign=1739354669-a7gHyny0zZ3U90yX37UoMxwXJ6YPkM0q-0-c0faad57c5d43efb01c18a868f0ca4cd)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P52_1.jpg?sign=1739354669-k8Pqn6DYxjLeYyoE2IQLvWj0biyzNsVp-0-66085b0eb51f1ec6d35ab9ace089c62e)
2.模型训练及保存
数据加载进模型之后,需要定义模型结构,寻找优化参数并保存模型。
1)定义模型结构
本部分包括心脏病数据集定义模型和慢性肾病数据集定义模型。
(1)心脏病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_1.jpg?sign=1739354669-l8b7s1KDXHbTAokgbO2jeoETvhM40d04-0-78e57089d38a97c5ccca8874ff4e5f1e)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P53_2.jpg?sign=1739354669-TdxZz5rVIwgBIUhwwRpeTByCWE2JqTCH-0-acc614289fd35b36fcb6552d55b80146)
2)保存模型
为了能够被Python程序读取,需要将模型保存为.pkl格式的文件,利用pickle库中的模块进行模型的保存。
(1)心脏病模型保存。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_1.jpg?sign=1739354669-mY0iOMg2L2fyA2sWKKYoOmUY4WlpQ5lE-0-778b313aed585877838d38041ac3c3e2)
(2)慢性肾病数据集定义模型。
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_2.jpg?sign=1739354669-Q6yxMcMNSNk3MHU143iqZofrW2YHEUbW-0-8076f038e868af98e6224c14aaedf5b6)
3.模型应用
对于人的疾病来说,误诊带来的风险是极大的,正确率不是100%对患者就是损失。然而以往仅仅预测是否患上疾病,是一个二分类问题。原理上,机器对疾病的预测基于各项指标的权重。本项目充分运用机器学习的优点,将各特征重要性与各指标的数值相乘求和,得到一个加权值。在程序内部,预先对患者和正常人的各指标平均值与对应特征重要性加权求和,得到患者和正常人的平均水平。在定性判断为病人后,将用户的数值与病人均值做对比,定量给出用户的病情相对于大多数患者严重程度;如果用户被判断为正常人,则将他的各项数值与正常人均值做对比,给出用户相对于大多数正常人的亚健康程度。经过处理,不仅做到定性判断,还对用户情况进行量化。一方面防止偶然的误诊带来风险;另一方面给予患者与疾病抗争的希望,给体检正常的人敲响亚健康的警钟。
1)心脏病模型应用
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_3.jpg?sign=1739354669-58QiT3jLkJt0hDonKdloQ82ezLTxnkMd-0-959cb0683be94b6eaca3c20423301c53)
输出的各特征重要性如图2-11所示。
通过图2-11可以看出,年龄因素,对患病是否有影响,并不重要,符合常识。然后分别获得患者和正常人的平均值,如图2-12所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_1.jpg?sign=1739354669-dJd2WIW5ATNlRK9vWJsQ8LxvurtiFXaL-0-5ff9db1fdf78a64885b745db3a0e7a8e)
图2-11 心脏病特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_2.jpg?sign=1739354669-DoGSaI9k1g6QmPqC5uP0fW6in6yTLP6i-0-44468728448562241e35db31f6a8e3fe)
图2-12 心脏病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P54_4.jpg?sign=1739354669-96f02ZBvs02IJHYl5JTbpO68w0kOIj2X-0-432e4cf50e26ce052db842ad3d4a24c4)
患者和正常人加权求和后的值如图2-13所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_3.jpg?sign=1739354669-74RE3Bou5Bv59hCrarCVj33Yj0yrj4Gb-0-99ded8c1690ac053d0a148fc8d769aeb)
图2-13 心脏病患者和正常人加权求和后的值
将这个值保存,当用户使用时,判断出是患者还是正常人之后,根据比值大小定量判断具体情况。
2)慢性肾病模型应用创新
通过eli5得到各特征重要性,输出的各特征重要性如图2-14所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_1.jpg?sign=1739354669-6Cwx4w2LvIwf3jtGev9qVvjMBVytVntp-0-b71bbacb63fb76ca3b9635690d2a8f05)
图2-14 慢性肾病患者和正常人特征重要性
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P55_5.jpg?sign=1739354669-99XEEWjMHUgQBy9tu5vcsy6EANgUxqGa-0-df6acc7bad37f7896996c628b4ff84e6)
分别获得患者和正常人的平均值,如图2-15所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_2.jpg?sign=1739354669-fXxvBFQV8lYZdA9rvEiMyygkXyxRIIKJ-0-d90ca27c4e78b54b410db79b9774bb0b)
图2-15 慢性肾病患者和正常人平均值
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_4.jpg?sign=1739354669-INXZRGLB4shP0R93zPA8T6RGk1omGDQ5-0-c0d05aac3d1f48aca58e2fc556bdca76)
患者和正常人加权求和后的值如图2-16所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P56_3.jpg?sign=1739354669-DzMRVqOeBQBfNTEtTKoEk0NQOzTCBBuq-0-ba4522a5c7b958e10d4f3f337e2d1e2d)
图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=1739354669-HonLvvbKxXkIfj6e7YZRg0xNdCFzpadb-0-4c7c3159228d74bc69a78c0d7af884d3)
会自动从csv数据源读取相应的数据,如图2-17所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_1.jpg?sign=1739354669-JjAtkqupQ2eIxEAyXokynnD3bbLR4xVC-0-6b8c4c79c6894d8403347d0c07801675)
图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=1739354669-hIXeR1tbdSdmbqGotLItFyCq14n51LEF-0-cd523b27684509698ccddc823cf3344d)
图2-18 样本总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_3.jpg?sign=1739354669-xZZTVqogGwg5VeAK6kc7HS1pzUKvoiMo-0-4aaa523c705a5e131441614843a5ebb1)
图2-19 1分和10分的评论总量
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P57_4.jpg?sign=1739354669-JJo6rStOdDn87Dlr5u3gJQO3UXJUir5k-0-7e9a0d6399f67e221aeb96ff1d7b1536)
图2-20 用户打分
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_2.jpg?sign=1739354669-pTRzjnTXEXUkqRGSlHqwfb7XyjN2U0P1-0-9ad758768715ce93ae419229d292a528)
打分分布如图2-20所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_3.jpg?sign=1739354669-c1p8zbkMRUhvpKznn7C0DBaIlYgnXtOs-0-e8323c91819d9f1f511883232c063b48)
图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=1739354669-pWg6RCvsK3GLhBgP9HwCFDn3PnN2iYxg-0-196fdd500d614d51129f1f846459b639)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_1.jpg?sign=1739354669-tMUcmmfPJCfnNHrgu6kuVAzqWtmWJtsL-0-dd92bed19d0b3f1ae6bdb732e143fb6d)
图2-21 仅取出打分为1分和10分的评论情感分析学习
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_5.jpg?sign=1739354669-PUDQ2DUtOHaWpDnLtiFEZrFXZevSP7vJ-0-56fedef39603062d500ef89be36e32af)
发现一句话中经常出现不合时宜的符号,该数据集是网络爬虫爬取的,所以有很多字符表示成ASCII码,防止被误识别为分隔,使用正则表达式从审阅文本中删除这些符号。
评论(review)中,句子两端有引号,编写函数将引号删除。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P58_6.jpg?sign=1739354669-vetECH9lXECeo5HoiQLYNeUa12ooutEA-0-e72c39c7cde37cda44267fa056d8b689)
预测的标签是喜欢与不喜欢,但是drugName和condition种类很多,写进程序中可以简化工作量,所以需要将drugName和condition列前置到review中,并将完整的字符串保存为text列。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_2.jpg?sign=1739354669-CF1oLwQbLk3Icrm4yEVbbKPec7Cf3iB7-0-a0abb80c92f8856514c8f8becbe0ea63)
CountVectorizer类将文本中的词语转换为词频矩阵。通过分词后把所有文档中的全部词作为一个字典,将每行的词用0、1矩阵表示。并且每行的长度相同,长度为字典的长度,在词典中存在,置为1,否则为0。由于大部分文本只用词汇表中很少一部分词,因此,词向量中有大量的0,说明词向量是稀疏的,在实际应用中使用稀疏矩阵存储。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_3.jpg?sign=1739354669-zv7SXmu4cI5i0jkQi3STK59dCobNOnVn-0-454e69d97f5f698c0c599eddc8da265c)
2.模型训练及应用
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P59_4.jpg?sign=1739354669-UWfR9BTRJlgmSr80g06BtHouoqbKklLw-0-927db52497e6c35a186f56c0d820d957)
仅取出打分为1分和10分的评论进行情感分析学习,如图2-22所示,打分2~9分的评论如图2-23所示,代入模型分析评论情感为支持或不支持如图2-24所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_1.jpg?sign=1739354669-Wnrr3qshf96DbR7Nhfii0wh15ON9Ti7N-0-f478681a5c35e4eec897013465284e9c)
图2-22 仅取出打分为1分和10分的评论进行情感分析学习
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_2.jpg?sign=1739354669-7WePx1NmZHR2RholWkXZf0i6G86PsJ4v-0-690fd24e561ecf0e54af02ea9b1c790e)
图2-23 打分为2~9分的评论
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P60_3.jpg?sign=1739354669-1SLvI48dbzTmyzvDKmh7xPiTlkZ3QJW3-0-440059d7419a67ecb646063199e7d534)
图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=1739354669-1evHqqjjI89ESPqxrNHzd6LTN2w6U0xd-0-b48d28ec51ad4707897f1203f69b1c0a)
3.模型应用
将两个csv文件合并成一个,本项目对某一特定症状选取支持率前三名的药物。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P61_1.jpg?sign=1739354669-al7HljAoVg4pDhwNDoBwR6jvKIfUfKRM-0-bb766abc88b3802d7580216282664aee)
得到一个csv数据库,但是数据库中除了特定的药物名称,还有一些特殊字符,通过编写Python脚本文件将它们清理干净。
2.3.3 模型测试
本部分包括模型导入及相关代码。
1.模型导入
输入数据包括两部分:如性别、年龄、食欲需要用户手动输入;心率、心电图波形参数,需要用户接入不同的传感器测量。考虑到应用的便捷性,直接从传感器读取所有的参数进行预测。
一位用户输入的数据如图2-25所示,判决结果如图2-26所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_1.jpg?sign=1739354669-drqJ9FByhuBy1fY8Du0Osznf6P5eqUMY-0-ce26526008db55adf390f07caa717f3c)
图2-25 一位用户的数据
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_2.jpg?sign=1739354669-M03CcHltKQ2Vmo4i9NsvyoVjYuIfuTiC-0-ad19235564e99db06ac123c0709b071b)
图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=1739354669-UkRh83m8pNzVL6SDkGUzFnbNG4Kc7Ld4-0-8c379374a6d403860a139e1d85cd0cdb)
图2-27 量化
之前平均值是病人比正常人的小,所以大于分界面更好。病情指数比平均数的四分之一还小,量化后督促病人抓紧时间治疗。
2.相关代码
本部分包括模型预测代码、模型应用创新代码、用户接口及界面可视化代码。
1)模型预测
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P62_4.jpg?sign=1739354669-NyY5IUZmGYBkjMb3nkvFmwsIVwMd9MYN-0-8bc1f575dd6d21eee94f5fd0d35c2741)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P63_1.jpg?sign=1739354669-SdO8x6NGqJC6cTfu7OaYQeSR5RyZsu62-0-e300eba66727368970baee12fde68a2a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P64_1.jpg?sign=1739354669-Nh6lrFBhbrYRdlYTMWwixT75QgcoE3Ni-0-f03f1bf3d0c7882285d6ef641584b970)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P65_1.jpg?sign=1739354669-2wMzE8sdgALPvB4KCJO5lCCUu2WgjwZz-0-217121f11ea2f652b6c7f8b283006ea6)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P66_1.jpg?sign=1739354669-bfuAvs5VqdcrXclofR0J9Bfzp7hj1Doe-0-c2bc7b4a6b86a4a0d77d1de23576cdc0)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P67_1.jpg?sign=1739354669-TgmoOPl0zrLbs8m0qlyXzyWfmvqPNiuA-0-df9703a948d4d0524d68dfbc9e6cebc6)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P68_1.jpg?sign=1739354669-D78VdRslI201wlmZ60iAcgZE9GHbRJ30-0-4a9336e1b3052f7fc6aab49ecf3571f7)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P69_1.jpg?sign=1739354669-BSWQyuZACJrB3fdDKBmjEIWG1a0Ciozb-0-5e02c8b91b74078a74b02534689a9225)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_1.jpg?sign=1739354669-1WfLYAzNRrQp1S8TrBWFJ48hsci33HsR-0-bb5fcf7aa8e707218bff6a12c0ba7e3a)
2)模型应用创新
相关代码如下:
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P70_2.jpg?sign=1739354669-fhkLB10QWHPV9bij1kH0wuhviKvZi9aU-0-4421db36628bc8913f5543e2c35087cb)
3)用户接口及界面可视化
本部分为主界面GUI设计及子界面调用。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P71_1.jpg?sign=1739354669-yxunagyIo4XvHJr9WIttnJjYdvtTNyQ9-0-224050cc2d5fe906eb8d809c98d91d85)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P72_1.jpg?sign=1739354669-xwusEZo7jgDDwZ2hdeC3XH5hgjPR65Da-0-056376091ebe87e9263314ca2e08c6cd)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P73_1.jpg?sign=1739354669-GoUgYr34mjN7nckw9vOD11u4coZrcqza-0-7c94986b8cc347ace3d6e587a3304fda)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P74_1.jpg?sign=1739354669-mXv72arqhSiOy12Hy4kH7DgVUgKarCDB-0-ca05e210acfe246bd60ca149b8ee6a0f)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P75_1.jpg?sign=1739354669-tXwKBHzXQymjHTPEnINFgS11vAxtfFtz-0-b0d529983eaf5052060fd13282f112cf)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P76_1.jpg?sign=1739354669-2YcVqLk83eTZ5hi7J3BWNz2xRcnDiM4y-0-e9bba29d45dddd3762dca358f25f021a)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P77_1.jpg?sign=1739354669-zW7OuVlJHP3kyiNxAQEtTb4vx3W7qkAS-0-48d9d8c97e9728055eadf6d88000755e)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P78_1.jpg?sign=1739354669-KlHjE9UDw5NMZyQjjYeFM16hXm7veRo8-0-e91acf210d14ed765a5be477412a8257)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P79_1.jpg?sign=1739354669-cFddLdqsF8DIXDKgthAM1RfuLU6aAoW3-0-14cb7e28e549634cca87e9d98272c2ec)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P80_1.jpg?sign=1739354669-DydffLQoC1nBNVSoZa1iB0Gw04Hp6zAl-0-1525732c82004eafcd806b9fb482a033)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P81_1.jpg?sign=1739354669-lgKZ1ujCWxUyg21Bv5XtuMPNT7o9raPB-0-d0440ba0c353e08f425c9d6e6d5a8267)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P82_1.jpg?sign=1739354669-ORLRmjJNsQoZvTuu2oZgPEaYT3HjG5dX-0-50713babf8717bc4f66a216d5502fac2)
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_1.jpg?sign=1739354669-tHxGpk9Wrq1VraIXlRfkukuRF0DOeZFm-0-49e0954ed63f5486da4bfd317dec7cd3)
2.4 系统测试
本部分包括训练准确度、测试效果和模型应用。
2.4.1 训练准确度
心脏病预测准确率达到89%以上,模型训练比较成功,如图2-28~图2-31所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P83_2.jpg?sign=1739354669-6C2fFCCZ9oYoITrPbdxQoYOchCJyIYcB-0-e089e465270efe2ebaba6290e5109ec7)
图2-28 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_1.jpg?sign=1739354669-z2tFqdA7Dt6Yvw7BvMSf8564wHJ9KZiK-0-6718483e12dc321f23a802b98407c75b)
图2-29 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_2.jpg?sign=1739354669-rf3h56KvQTQlMoBACCUcxEehDr3ZXwVB-0-1b97b73154f2fca3f404edcb91b786ff)
图2-30 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_3.jpg?sign=1739354669-ckhBENWk81DCfaM2aApW8lWtpbIQY51b-0-800e74b0ced88cc270a4ac0cde0ee819)
图2-31 ROC曲线面积
慢性肾病预测准确率达到100%,如图2-32~图2-35所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_4.jpg?sign=1739354669-PtuHGsJDrcHeQCm1IAoOcOHGjqS0DgO1-0-55faadd6f6f1dd3f696a26cabcc3cf2b)
图2-32 模型准确率
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_5.jpg?sign=1739354669-6nVTuVrE6vctOryvQNBkBSmf2iNOJFF7-0-a0c1aa628efa81562dd1fc15bc0d3a7e)
图2-33 混淆矩阵
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_6.jpg?sign=1739354669-7QNNFhsO8MSYKdPECeuiquNX1kIIf2qt-0-59c55d340969b5c4c43d55237527fa42)
图2-34 ROC曲线
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P84_7.jpg?sign=1739354669-wSYmsyQHIPHiUtOoCxsv5QVfH09quDyl-0-fe20796b8db9313dd262cf11c0da2384)
图2-35 ROC曲线面积
2.4.2 测试效果
将数据代入模型进行测试,分类的标签与原始数据进行显示和对比,可以得到验证:模型可以实现疾病预测和药物推荐。模型训练效果如图2-36所示,药物推荐效果如图2-37所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_1.jpg?sign=1739354669-t0wvWkhpUTv7r0zeqjn9V9bZ3q2UNx46-0-04947f534eac872eb2a2add6502d9bea)
图2-36 模型训练效果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P85_2.jpg?sign=1739354669-QBDX1ePlVIHl0uqPYXW7o5HPtGKUWJpH-0-2c6f152d083997692390eeb28b52d5d2)
图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=1739354669-YemTZ35xJcq8KCpXd7vauErvpYRsTvY8-0-8252eeb88ef236c2e38e61eeb07b0bd2)
图2-38 应用初始界面
界面从上至下,分别有三个按钮。单击第一个按钮“健康预测”,可以看到界面跳转到疾病预测界面,如图2-39所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P86_2.jpg?sign=1739354669-JFMwl77YMSZUn4bigEZr08H1KTryAvvk-0-06fc2b53c222335ac988b9479d044143)
图2-39 疾病预测显示界面
返回主界面后,单击第二个按钮“药物推荐”,看到界面跳转到药物推荐界面,如图2-40所示;药物推荐助手如图2-41所示;对不在数据库中的症状,提示不存在,不输出任何疾病信息,如图2-42所示。
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_1.jpg?sign=1739354669-W01zNnvTv8tUZu0pgXGegY3yBubBfLKt-0-eb75f80a5607836db16e70e9c8d0a5d8)
图2-40 药物推荐显示界面
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P87_2.jpg?sign=1739354669-jGpzpgmkuI0HOlDI1qRbbFT9rFTBgjyl-0-47ded8a5002eac8b8aba5c90eaffc8db)
图2-41 测试结果
![](https://epubservercos.yuewen.com/B03920/23721604509499706/epubprivate/OEBPS/Images/Figure-P88_1.jpg?sign=1739354669-esse72CoXdPZauvG6WjLJLEZuZR47wfn-0-f8e628696e83eac1f2e17a361e493afd)
图2-42 药物推荐助手