预测疾病药物

数据挖掘 Python scikit-学习 预测建模 决策树 分类器
2022-02-10 11:39:56

我有一个格式为:

Keywords                                                         Disease/Drugs
bradycardia, insomnia, hypotension, hearinglos...                 NSAIDS Poisoning
vomiting, nausea, diarrhea, seizure, edema, an...                 NSAIDS Poisoning

pancreatitis, gi, symptoms, restlessness, leuk...                 Chronic abacavir use (Nucleoside Analog Revers..
ards, apnea, hepatotoxicity, dyspnea, pulmonar...                 Chronic stavudine and didanosine use (Nucleosi...
    

有很多数据,但都是这种格式。

将上面的数据转换成格式,展开,按照,

Keywords                          Disease/Drugs
bradycardia                        NSAIDS Poisoning
insomnia                           NSAIDS Poisoning

pancreatitis                       Chronic stavudine and didanosine use (Nucleosi...

DecisionTreeClassifier现在我在对 Input 列进行编码后创建了预测系统Keywords

此外,我使用以下方法找到了前 10 个预测:

p_probability = model.predict_proba([[t]])
best_n = np.argsort(p_probability, axis=1)[:,-10:]   

当我输入单个症状bradycardia时,它会显示 10 个最佳预测。

此外,当我输入 5 个症状的列表时,它会显示 50 个最佳预测。

由于症状列表可能包含常见疾病/药物,因此我想创建一个系统,当输入任意数量的症状列表时,将仅显示 10 个最佳预测。

4个回答

我了解您有疾病的关键字和给予该患者的药物。考虑到问题的质量,我真诚地建议你开始不做任何机器学习,只做一些基本的统计。

如果您想查看前 10 种最佳药物bradicardia,可能最好的方法是计算频率。通过这种方式,您应该能够找到最常用的治疗药物bradicardia

给定症状列表,找到以前提供的药物并关闭过去提供的药物就像一个查询一样,如果一个人表现出与您的新患者相同的症状,如果您发现过去的查询具有相同的症状,您可能想要推荐相同的症状。然后为您的查询的下一个关闭查询排名。

这将没有 ML。使用 ML,您需要对数据集进行适当的清理,并构建排名系统。首先,我将向您推荐逐点排名系统

我仍然相信您应该先尝试不使用 ML。

您应该以不同的方式准备训练数据。通过在单独的行中展开关键字,您将丢失有关疾病/药物症状相关性的信息。

例如:恶心+失眠的患者 -> 睡眠障碍而恶心+腹泻的患者->食物中毒

给定您的数据集,您必须对关键字进行一次热编码并将它们用作特征来训练您的模型。

在此处输入图像描述

然后给出一个新的患者信息: 在此处输入图像描述

您将其编码为: 在此处输入图像描述

并使用您的模型进行预测,与以前一样。

p_probability = model.predict_proba([[t]])
best_n = np.argsort(p_probability, axis=1)[:,-10:] 

通过这种方法:

  1. 您可以在模型中输入症状列表
  2. 您将获得每个预测的前 10 个结果

我想这是一个特殊的 NLP 问题,你基本上处理“翻译”因此,您可以查看“sequence-to-sequence”学习(神经翻译模型),在其中您尝试将一个关键字或一组关键字“翻译”成一种药物:xy

bradycardia->NSAIDS Poisoning

Keras/Tensorflow 有许多有用的资源,例如:

由于您提到基于 5 种症状,您将获得 50 种疾病预测。

根据您的用例,在通过应用您的 ML 算法(朴素贝叶斯/决策树)获得疾病预测后,症状可以与许多疾病相匹配。

无论输入多少症状,要始终获得前 10 个预测,您可以使用np.uniqueget unique frequency counts 并使用np.argsort按频率计数排序并获得前 10 个。

根据您的代码


p_probability = model.predict_proba([[t]])
best_n = np.argsort(p_probability, axis=1)[:,-10:]   

假设p_probability(对于 5 个症状给出 50 个预测)是一个包含 50 个值的数组,格式如下

     array([‘NSAIDS Poisoning’,’Chronic stavudine and didanosine use’……, ‘NSAIDS Poisoning’, ‘NSAIDS Poisoning’,’Chronic abacavir use’])

考虑到价值“慢性阿巴卡韦使用”是第 50 个预测


#disease_predictions is value of all disease predictions from p_probability 
disease_prediction_list = p_probability

#when return_counts is true, returns 2D array all unique value and it’s frequency count
unique_value, freq_count = np.unique(disease_prediction_list, return_counts=True)


#sorted index based on frequency count
freq_count_sort_index = np.argsort(-freq_count)


#predictions are now sorted based on frequency count 
frequency_sorted_prediction= unique_value[freq_count_sort_index]

#Top 10 predictions sorted based on frequency counts
top_10_prediction= frequency_sorted_prediction[-10:]