'''
by wufeil
deepchem教程2
Tutorial 2: Working With Datasets
deepchem内置数据集及其简单建模
'''
import deepchem as dc
print(dc.__version__)
'''
加载seepchem内置数据
'''
tasks, datasets, transformers = dc.molnet.load_delaney(featurizer='GraphConv')
train_dataset, valid_dataset, test_dataset = datasets
'''
查看数据集的信息:
关于数据类型,deepchem有三种数据类型:
1.数据类型为DiskDataset对象。DiskDataset是已保存到磁盘的数据集。数据的存储方式可以有效地进行访问,
即使数据总量远远大于计算机的内存也是如此。
2.NumpyDataset是一个内存中数据集,用于保存NumPy数组中的所有数据。当处理可以完全容纳在内存中的中小
型数据集时,它是一个有用的工具。
3.ImageDataset是一个更专门的类,可将部分或全部数据存储在磁盘上的图像文件中。当使用以图像作为输入或
输出的模型时,此功能很有用。
这里的train_dataset为DiskDataset类型。
每个数据集都存储一个样本列表。 粗略地说,样本是单个数据点。 在这种情况下,每个样本都是一个分子。 在其他数据
集中,样本可能对应于实验分析,细胞系,图像或许多其他事物。
对于每个样本,数据集都存储以下内容。
特征:X 大写
标签:y
权重:w 用来表示某些数据值比其他数据值更重要。 在以后的教程中,我们将看到有关此用法的示例。
ID: ids, 用于标记样本。 有时它只是一个整数索引,但是在此数据集中,ID是描述该分子的SMILES字符串。
'''
print(train_dataset)
'''
查看数据集的内容, get_shape()发现数据集中有
'''
print(train_dataset.get_shape())
print(train_dataset.ids)
for X, y, w, ids in test_dataset.itersamples():
'''
查看每一条数据内容
'''
print(X, y, w, ids)
'''
数据集转化为dataframe的数据类型有些问题,to_dataframe()函数有问题,不知道是不是版本问题,请尝试2.4版本
dataset_test = test_dataset.to_dataframe()
print(dataset_test)
'''
'''
创建自己的数据集,一 NumpyDataset为例
'''
import numpy as np
X = np.random.random((10,5)) #10个样本,5个特征
y = np.random.random((10, 2)) #多任务模型数据,2个标签
dataset_1 = dc.data.NumpyDataset(X=X, y=y)
X2 = np.random.random((15,5)) #10个样本,5个特征
y2 = np.random.random((15, 2)) #多任务模型数据,2个标签
dataset_2 = dc.data.NumpyDataset(X=X2, y=y2)
print(dataset_1)
print(dataset_1.get_shape())
print(dataset_2.get_shape())
'''
合并两个NumpyDataset
'''
dataset_3 = dc.data.NumpyDataset.merge([dataset_2, dataset_1])
print(dataset_3.get_shape())
'''
如何创建DiskDataset? 如果您的数据位于NumPy数组中,
则可以调用DiskDataset.from_numpy()将其保存到磁盘。
由于这只是一个教程,我们将其保存到一个临时目录中。
'''
import tempfile
with tempfile.TemporaryDirectory() as data_dir:
disk_dataset = dc.data.DiskDataset.from_numpy(X=X, y=y, data_dir=data_dir)
print(disk_dataset)
'''
Deepchem的数据类型类型
deepchem有四个数据类:
Dataset, NumpyDataset, DiskDataset, ImageDataset
1. Dataset
dc.data.Dataset类是所有数据集的抽象父类。
Dataset类绝对不能直接初始化,而应包含许多有用的方法实现。
Dataset类的目标是最大程度地与机器学习数据集的其他常见表示形式进行互操作。
因此,我们提供了从数据集对象到Pandas数据集,tensorflow数据集和PyTorch数据集的相互转换方法。
2. NumpyDataset
NumpyDataset(X: numpy.ndarray, y: Optional[numpy.ndarray] = None,
w: Optional[numpy.ndarray] = None, ids: Optional[numpy.ndarray] = None,
n_tasks: int = 1)
数据集的此子类将数组X,y,w,ids作为numpy数组存储在内存中。
这使得构造NumpyDataset对象非常容易。
(1) NumpyDataset初始化:
__init__(X: numpy.ndarray, y: Optional[numpy.ndarray] = None,
w: Optional[numpy.ndarray] = None, ids: Optional[numpy.ndarray] = None,
n_tasks: int = 1)
初始化代码:
dataset = NumpyDataset(X=np.random.rand(5, 3),
y=np.random.rand(5,), ids=np.arange(5))
(2) 属性:
X —— 获取X向量矩阵(特征)
y —— 标签矩阵
w —— 样本权重
ids —— ID
(3)方法:
get_shape() —— 获取数据集的形状,返回四个元组,分别为X,y,w和ids数组的形状。
get_task_names() —— 获取数据集相对应的任务名称。
iterbatches(batch_size: Optional[int] = None, epochs: int = 1,
deterministic: bool = False, pad_batches: bool = False) —— 返回可迭代的批次。
itersamples() —— 返回可迭代的对象。
transform(transformer: transformers.Transformer, **args) —— 通过对该数据集中的每
个样本应用转换来构造新数据集。例如:SMILES转化为GraphConv数据类型, 这个很重要。
select(indices: Sequence[int], select_dir: Optional[str] = None) —— 从数据集中
选择样本。
make_pytorch_dataset(epochs: int = 1, deterministic: bool = False,
batch_size: Optional[int] = None) —— 创建一个torch.utils.data.IterableDataset,
以对该数据集中的数据进行迭代。 数据集的迭代器返回的每个值都是(X,y,w,id)的元组,其中包含
一个批次的数据,如果batch_size为None,则包含单个样本的数据。
from_DiskDataset(ds: deepchem.data.datasets.DiskDataset) —— 转化DiskDataset为
NumpyDataset。
to_json(self, fname: str) —— 保存json文件
from_json(fname: str) —— 从json文件中加载NumpyDataset
merge(datasets: Sequence[deepchem.data.datasets.Dataset]) —— 合并多个NumpyDataset
3. DiskDataset
4. ImageDataset
DiskDataset和ImageDataset与NumpyDataset类似,
也可参照:https://deepchem.readthedocs.io/en/latest/api_reference/datasets.html#diskdataset
'''
最后,回归正题:如何将分子输入到神经网络模型中?
首先,你的分子可以是保存在SDF文件,也可以是CSV文件,然后利用Deepchem的DataLoader加载成数据集,可以是DiskdictDataset, NumpyDataset, ImageDataset
为了适应图神经网络,卷积神经网络,要利用DiskdictDataset, NumpyDataset, ImageDataset中的transforms方法转换即可