如果给出症状,哪种算法最适合预测疾病?

数据挖掘 机器学习 Python nlp scikit-学习 预言
2022-03-02 22:51:17

通过 LDA 进行主题建模后,我得到以下数据集。

    Document_No Dominant_Topic  Topic_Perc_Contrib  Keywords    TextBookFindings    Disease/Drugs
0   0   3.0 0.7625  hypotension, bradycardia, mydriasis, hypersali  Hypotension,hypothermia,bradycardia NSAIDS Poisoning
1   1   5.0 0.6833  edema, cyanosis, cardiacarrest, lacrimation,    Hyperventilation,respiratoryalkalosis,edema–br...   NSAIDS Poisoning
2   2   0.0 0.8100  vomiting, nausea, diarrhea, abdominalpain,  Nausea,vomiting,diarrhea,abdominalpain– NSAIDS Poisoning
3   3   0.0 0.2625  vomiting, nausea, diarrhea, abdominalpain,  GIbleeding,pancreatitis,hepaticinjury   NSAIDS Poisoning
4   4   1.0 0.4463  insomnia, drowsiness, irritability, neurotoxic  Headache,dizziness,encephalopathy,irritability  NSAIDS Poisoning

... ... ... ... ... ... ...
1446    1446    7.0 0.5250  weakness, muscle, coagulopathy, fasciculations...   metabolicacidosis,Elevatedlactateconcentration...   Neuroleptic malignant syndrome (NMS)
1447    1447    0.0 0.0500  vomiting, nausea, diarrhea, abdominalpain, pan...   hematologictoxicity Neuroleptic malignant syndrome (NMS)
1448    1448    0.0 0.5250  vomiting, nausea, diarrhea, abdominalpain, pan...   Pancreatitis    NaN
1449    1449    0.0 0.0500  vomiting, nausea, diarrhea, abdominalpain, pan...   Hypersensitivity    Neuroleptic malignant syndrome (NMS)
1450    1450    0.0 0.0500  vomiting, nausea, diarrhea, abdominalpain, pan...   sensoryperipheralneuropathy NaN

我想在输入症状时创建一个预测系统,它显示疾病/药物的百分比匹配。所以我想在列keywords和之间创建一个预测Disease/Drugs

哪个将是最好的算法以及如何推进这一点的一些建议?

1个回答

您将面临的第一个挑战是将症状的文本标签转换为模型可以理解的数字特征。最简单的技术是

  • 序数编码,其中每个单词被分配给一个介于 1 和 N 之间的数字
  • 和 one-hot encoding (OHE),其中每个单词都成为一个唯一的 N 长度向量,除了一个之外,所有元素 == 0。

您的项目的一个好的起点是对每个症状进行一次热编码,并且对于数据集中的每个条目,对一次热编码的症状求和以获得描述所有症状的向量。该向量将作为模型的输入。

例如,如果您有以下 one-hot 编码:

  • “呕吐”-> [1, 0, 0]
  • “恶心”-> [0, 1, 0]
  • “烦躁”-> [0, 0, 1]

然后,同时出现呕吐和恶心的情况将被编码为 [1, 1, 0]。

简单技术的缺点是单词编码在语义上不是很有意义。请注意,“呕吐”和“恶心”之间的距离与“呕吐”和“易怒”之间的距离相同,尽管在这种情况下呕吐和恶心在语义上可能更接近。

因此,如果简单的技术对您来说不够好,那么您可以尝试词嵌入。Word2VecGloVe等模型将每个单词转换为一个向量,其中向量空间中的距离有意义的。所以“恶心”和“呕吐”会离得很近,而“呕吐”和“烦躁”会更远一些。

如今,有更强大的嵌入在大量文本上进行训练。示例包括BERT 和 GPT-2但我认为这对于您的用例来说将是严重的过度杀伤。


下一个挑战是选择一个可以将编码词映射到疾病的模型。这是一个多类分类问题,因此排除了二元分类器。如果有很多不同的症状,那么您的输入向量将是高维的,因此最好有一个内置特征选择或降维的模型。

一开始,我会推荐一个集成决策树模型,比如Random ForestXGBoost这些模型易于训练,并且通常在此类问题上表现良好。此外,如果您使用 scikit-learn,您可以使用该方法轻松获取每个类的概率predict_proba()

如果基于树的模型效果不佳,您可以尝试其他简单的方法,例如kNNNaive Bayes

如果您需要更多复杂性,神经网络和深度学习总是在桌面上。但是,如果您的数据集只有 1450 个示例,那么这可能不足以训练大多数 DNN。


总而言之,您需要对症状进行数字编码,一个好的第一次尝试是单热编码。您还需要选择一个适合此类问题的分类器,并且可以输出概率而不是单个预测。我认为一个好的开始是来自 scikit-learn 的树集合。如果简单的选项不能很好地工作,您可以在编码方面或建模方面增加复杂性。