DeepChem教程8:处量分割器

DeepChem教程8:处量分割器

使用机器学习时,你通常要将你的数据分为训练集,验证集,测试集。MoleculeNet加载器可以自动的处理这些。但是你要如何分割数据呢?这个问题刚开始看简单,但是后面会变得复杂。有许我种方法分割数据,选择哪一种方法会对结果的可靠性造成很大的影响。本教程介绍一些DeepChem提供的分割方法。

Splitters

DeepChem中,将样本分为多个数据集的方法由Splitter对象确定。对你的数据选择合适的方法是非常重要的。否则,你的训练模型看起来会比它实际工作得要好很多。

考虑一下典型的药物开发流程。你可以从筛选成千上万种分子是否与你感兴趣的靶开始。一旦你找到一个看来有用的分子,你要通过成千上成次的小的改造来优化它,从而得到亲和力更强的分子。然后你要进行动物试验看它是否有不可接受的毒性,然后要进行更多的改造来修正问题。

这对化学这数据集有重要的影响:它们通常包括许多分子,相互之间非常相似。如果你用原始的方法分割数据到训练集和测试集,训练集中会包含许多与测试集相似的分子,即便它们并不完全相同。结果,模型对于测试集工作得很好,然后你用其它与训练集不太相似的数据的时候就会失败。

我们来看一下DeepChem中的分割器。

RandomSplitter

这是一个最简单的分割器。它只是随机的选择样本到训练集、验证集、测试集中。

我们不是说那不是一个好办法吗?这取决于你的数据。如果每个样本依赖于其它样本,这与其它人割方法一样好。没有通用的选择分割器的最好的方法。它全取决于你的数据集,对于某些数据集来说这是一个好的选择。

RandomStratifiedSplitter

是有些数据集是非常不平衡的:只有一小部分样本是正的。这种情况下,随机分割会导致验证集或测试集中没有正的数据。这样就不可能评估性能。

注意这个问题,将正和负样本平均分配。如果你要求80/10/10分割,验证集和测试集将不但包括10%的样本还包含10%的正样本。

ScaffoldSplitter

这个分割器解决上面提到的许多分子相似的问题。它识别形成分子核心的scaffold,并保证所有有相同的scaffold的分子分到相同的数据集。这还不是很好的方案,因为两个有不同scaffolds的分子可能在其它方面非常相似。但对于随机分割是很大的改进。

ButinaSplitter

这是另一个处理相似分子的分割器。它基于分子指纹聚合相似分子,使得有相似指纹的分子趋于同一个数据集。这种分割方法所需的时间是分子数的平方,所以主要用于小型数据集。

SpecifiedSplitter

这种分割器让用户做所有的事。你告诉它哪。个样本放到哪个数据集。当你事先知道你的数据的分割方法时是非常有用的。

一个例子是临时分割。考虑一下你不断产生和测试新分子的研究项目。随着你获得的数据的增多,你不断返回你的模型到稳定增长的数据集中,然后用它来预测没有测试的分子。验证这是否工作得好的方法是挑一些数据,用当时所有的数据训练模型,看它对后来产生的其它数据是否工作得好。

使用不同分割器的影响

我们来看一个例子。我们加载Tox21毒性数据,使用andom, scaffold, Butina 分割。每个分割器用训练集和测试集训练和评估模型。

In [1]:

import deepchem as dc
splitters = ['random', 'scaffold', 'butina']
metric = dc.metrics.Metric(dc.metrics.roc_auc_score)
for splitter in splitters:
    tasks, datasets, transformers = dc.molnet.load_tox21(featurizer='ECFP', split=splitter)
    train_dataset, valid_dataset, test_dataset = datasets
    model = dc.models.MultitaskClassifier(n_tasks=len(tasks), n_features=1024, layer_sizes=[1000])
    model.fit(train_dataset, nb_epoch=10)
    print('splitter:', splitter)
    print('training set score:', model.evaluate(train_dataset, [metric], transformers))
    print('test set score:', model.evaluate(test_dataset, [metric], transformers))
    print()
splitter: random
training set score: {'roc_auc_score': 0.9560766203173238}
test set score: {'roc_auc_score': 0.8088861019955839}
splitter: scaffold
training set score: {'roc_auc_score': 0.9582835670901536}
test set score: {'roc_auc_score': 0.6803307954037949}
splitter: butina
training set score: {'roc_auc_score': 0.9578120869103354}
test set score: {'roc_auc_score': 0.6057007877463954}
它们对于训练集产生相似的结果。但是对于测试集,random分割器有更高的性能。Scaffold分割对于测试集的分值较低。Butina分割器的分值更低。这是否意味着随机分割更好?不!它意味着随机分割不能告诉你关于你的模型工作得好坏的准确量度。由于测试量中包含大量与训练集中相似的分子,它不是真正独立的。因此模型看起来要比它实际工作起来好很多。Scaffold分割和Butina分割给出了一个更好的指示你未来对非独立数据的期望。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值