'''
by wufeil
Deepchem教程101
'''
'''
Deepchem聚焦化学领域的机器学习库
包含:
数据的数据集、预处理、转换、分割、学习模块
可以使用scikit-learn,tensorflow, XGboost等框架,也开始实验使用pytorch, JAX。
下面的例子将会说明这一点
'''
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) #从内存中存储数据到dc里面
print(dataset.X.shape)
print(dataset.y.shape)
'''
“ Featurizer”是一段代码,它将原始输入数据转换为适合机器学习的处理形式。
使用了环形指纹并将SMILES转换为ECFP。
ECFP是一种指纹,它是由化学结构信息制成的位向量(稀疏向量),我们可以将其用作各种模型的输入。
'''
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) #将smiles转换为fingerprint,长度为1024的转化器CircularFingerprint
ecfp = featurizer.featurize(smiles) #转化
print(ecfp.shape)
dataset = dc.data.NumpyDataset(X=ecfp, y=np.array(properties)) #组合成为dataset
print(len(dataset))
''''
CSV格式
先将上述的smiles和properties保存成csv文件,然后读取csv文件内的内容
'''
import pandas as pd
df = pd.DataFrame(list(zip(smiles, properties)), columns=['SMILES', 'property'])
import tempfile
df.to_csv('test.csv')
featurizer = dc.feat.CircularFingerprint(size=1024) #特征转换器
loader = dc.data.CSVLoader(['property'], feature_field='SMILES', featurizer=featurizer) #CSV加载器
dataset = loader.create_dataset('test.csv')
print(len(dataset))
'''
数据分割
'''
splitter = dc.splits.RandomSplitter()
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)
print(len(train_dataset))
print(len(test_dataset))
print(len(valid_dataset))
print(valid_dataset, valid_dataset.X, valid_dataset.y)
'''
模型的训练与评估, 与sklearn很像
deepchem封装了一些sklearn及其他的一些机器学习的模块,以便更容易的调用
这里使用随机森林
'''
from sklearn.ensemble import RandomForestRegressor
rf = RandomForestRegressor()
model = dc.models.SklearnModel(model=rf) #当然,也可以换成二叉树、逻辑回归、神经网络等模型
model.fit(train_dataset)
valid_preds = model.predict(valid_dataset)
print(valid_dataset, valid_preds)
test_preds = model.predict(test_dataset)
print(test_dataset, test_preds)
'''
模型评估
'''
metric = dc.metrics.Metric(dc.metrics.mae_score) #除了mae,也可以添加其他损失
train_score = model.evaluate(train_dataset, [metric])
valid_score = model.evaluate(valid_dataset, [metric])
test_score = model.evaluate(test_dataset, [metric])
print('{},{},{}'.format(train_score, test_score, valid_score))
总的来说,Deepchem与sklearn等还是很像的,在sklearn的基础上可以很好的使用Deepchem也可以做成更多的调整。
重要的是,Deepchem里面提供了化学结构数据转为机器学习等需要的数据(主要是矩阵数据)。
更为重要的是,Deepchem提供了较多的化学数据,可以作为我们模型测试的基础
更多内容可以:https://deepchem.readthedocs.io/en/latest/get_started/tutorials.html
看原文档才是最好的学习方式