DeepChem手册第三章3.3教程

3.3 教程
如果你刚接触DeepChem,你可能了解基础。DeepChem是什么?为什么你要使用它?
简单的回答案DeepChem是一个科学的机器学习库。(“chem”提示一个历史事实是DeepChem早期是注重于化学应用的,
但是我们现在更广泛的支持所有的科学应用。)
为什么你想用DeepChem而不是其它的机器学习库呢?简单的说,DeepChem维护了大量的便于科学的深度学习的工具包括加载科学
数据集,过理它们,转换它们,分割它们,学习它们的类。除此之外DeepChem使用大量的其它机器学习框架如scikit-learn, TensorFlow, and XGBoost。
我们正在实验增加用PyTorch和JAX实施的模型。我们的关注点是用手头能获得的任务工具以便于科学实验。
本教程的后面,我们将提供DeepChem’s API的快速浏览。DeepChem是大型库,所以我们不会覆盖所有的方面,但是我们会给你足够的起点。
内容
数据处理
特征工程
数据分割
模型的训练与评估
更多的教程

3.3.1数据处理
dc.data模块包含处理数据集对像的工具。这些数据集对象是DeepChem的核心。
在机器学习中数据集是数据集合的抽像。我们在此只是展示而不是更深入的解释。
>>> import deepchem as dc
>>> import numpy as np
>>> N_samples = 50
>>> n_features = 10
>>> X = np.random.rand(N_samples, n_features)
>>> y = np.random.rand(N_samples)
>>> dataset = dc.data.NumpyDataset(X, y)
>>> dataset.X.shape
(50, 10)
>>> dataset.y.shape
(50,)
这里我们使用了NumpyDataset,它是贮存于内存的数据集。小对于小型数据集可以工作得很好,很方便实验,
但是对于大型数据集不太方便。对于大型数据集我们有DiskDataset类。
>>> dataset = dc.data.DiskDataset.from_numpy(X, y)
>>> dataset.X.shape
(50, 10)
>>> dataset.y.shape
(50,)
这个例子我们没有指定数据的目录,因此这个DiskDataset存放在临时文件夹。注意dataset.X和dataset.y
加载自磁盘。因此这对于大型数据集来说代价非常贵。

3.3.2 特征工程
“Featurizer”是转换原始输入到经处理的适合机器学习的形式的代码块。dc.feat模块包含大量处理分子、分子复合物和无机晶体的特征化器。
我们给你展示关于使用特征化器的例子。

>>> smiles = [
... 'O=Cc1ccc(O)c(OC)c1',
... 'CN1CCC[C@H]1c2cccnc2',
... 'C1CCCCC1',
... 'c1ccccc1',
... 'CC(=O)O',
... ]
>>> properties = [0.4, -1.5, 3.2, -0.2, 1.7]
>>> featurizer = dc.feat.CircularFingerprint(size=1024)
>>> ecfp = featurizer.featurize(smiles)
>>> ecfp.shape
(5, 1024)
>>> dataset = dc.data.NumpyDataset(X=ecfp, y=np.array(properties))
>>> len(dataset)
5
这里我们使用CircularFingerprint并转换 SMILES到ECFP。ECFP是指纹,它是由化学结构信息组成的向量,我们可用它作为许多模型的输入。然后,你可能有包含SMILES和领储如HOMO-LUMO gap之类特征的CSV文件。这种情况,通过使用DataLoader,立即可以加载和特征化数据。
>>> import pandas as pd
>>> # make a dataframe object for creating a CSV file
>>> df = pd.DataFrame(list(zip(smiles, properties)), columns=["SMILES", "property"])
>>> import tempfile
>>> with dc.utils.UniversalNamedTemporaryFile(mode='w') as tmpfile:
... # dump the CSV file
... df.to_csv(tmpfile.name)
... # initizalize the featurizer
... featurizer = dc.feat.CircularFingerprint(size=1024)
... # initizalize the dataloader
... loader = dc.data.CSVLoader(["property"], feature_field="SMILES",
    featurizer=featurizer)
... # load and featurize the data from the CSV file
... dataset = loader.create_dataset(tmpfile.name)
... len(dataset)
5

3.3.3分割器
dc.splits模块是科学分割器的集合。通常我们需要将原数据分割为训练集,验证集,测试集以调试模型和评估模型的性能。我们将展示分割器的使用。
>>> splitter = dc.splits.RandomSplitter()
>>> # split 5 datapoints in the ratio of train:valid:test = 3:1:1
>>> train_dataset, valid_dataset, test_dataset = splitter.train_valid_test_split(
... dataset=dataset, frac_train=0.6, frac_valid=0.2, frac_test=0.2
... )
>>> len(train_dataset)
3
>>> len(valid_dataset)
1
>>> len(test_dataset)
1

这里,我们用RandomSplitter,将数据按训练:验证:测试=3:1:1的比例随机分割。但是随机分割有时会高估模型的性能,尤其是小型数中不平衡数据。请小心评估模型。
dc.splits提供很多方法和算法来合适的评估模型的性能,如交叉验证或使用分子拼接分割。

3.3.4模型训练和评估
dc.models包含大量的科学应用模型。大部分模型继承自dc.models.Model,我们只需要通过调用fit方法来训练模型。你不用关心使用具体的框架APIs。我们将向您展示模型的用法。
>>> from sklearn.ensemble import RandomForestRegressor
>>> rf = RandomForestRegressor()
>>> model = dc.models.SklearnModel(model=rf)
>>> # model training
>>> model.fit(train_dataset)
>>> valid_preds = model.predict(valid_dataset)
>>> valid_preds.shape
(1,)
>>> test_preds = model.predict(test_dataset)
>>> test_preds.shape
(1,)
这里,我们使用SklearnModel并训练模型。即便你要使用Tensorflow或PyTorch深度学习模型,你只要调用fit方法。
然后,如果你使用dc.metrics.Metric,你只要调用evaluate方法来评估模型。
>>> # initialze the metric
>>> metric = dc.metrics.Metric(dc.metrics.mae_score)
>>> # evaluate the model
>>> train_score = model.evaluate(train_dataset, [metric])
>>> valid_score = model.evaluate(valid_dataset, [metric])
>>> test_score = model.evaluate(test_dataset, [metric])

猜你喜欢

转载自blog.csdn.net/lishaoan77/article/details/114455363
今日推荐