预测化合物的组成

数据挖掘 机器学习 深度学习 聚类 预测建模 词嵌入
2022-03-04 04:49:11

我有一个包含化合物名称及其成分的数据集。像下面

硫酸=>[H,S,O](氢、硫、氧)草酸=>[H,C,O]草酸钠=>[Na,C,O]硫酸钾=>[K,S,O ] ...

现在我需要训练一个模型,它可以告诉我硫酸钠为 [Na,S,O]。请注意,硫酸钠表示训练数据集中没有的东西。我曾尝试寻找可能的想法,但没有任何想法。然后我认为它可能是层次聚类

 Sodium-Oxalate
    |    |
Oxalate  Sodium
|  |      |
C  O      Na

但是在层次聚类中,基/叶是不同的。但在这里它们是共享的。它就像一个图表。那么什么机器学习算法可以提供帮助呢?还有其他聚类吗?NLP/单词聚类(如果是的话)?

我能想到的另一种方法是Word2Vec,我为每个单词(C、H、Sodium)生成嵌入,所有这些都会有嵌入。并且基于更接近我所要求的词的内容,我将给出输出。但这需要大量的数据。我只有大约 1k 种常见化合物。并且该方法不会以较少的数据推广到任何此类问题。

1个回答

尝试对训练集中的元素(H、C、I 等)进行 one-hot 编码,并对化学描述符(“酸”、“草酸”等)进行相同的编码。然后尝试将数据馈送到一个简单的前馈神经网络,将描述符的 one-hot 编码映射为 yourx_trainx_val到化学元素,即 youry_trainy_val

对于编码,请查看Scikit 学习编码器。

我认为这种简单的方法可能会奏效,因为化学名称是逻辑命名的,因此任何有经验的化学家都确切地知道化合物中的哪些元素,给定它的名字。您的问题不需要预测中的更多信息,例如实际的化学成分,如(乙醇)。CH3CH2OH

关于少量数据:研究类似 K-fold 交叉验证的东西。使用它,您可以选择部分数据作为验证数据,并训练模型。然后重复这个过程,选择数据的不同部分。这将有助于充分利用有限的数据集,尽管它可能会引入过度拟合,因为您的模型最终会看到所有数据!

这是此方法的示意图:

k折交叉验证

Scikit Learn 有一个类可以为您实现它。