基于机器学习的化合物活性预测模型

举报
DrugAI 发表于 2021/07/15 03:31:47 2021/07/15
【摘要】 利用化合物的结构与活性数据,基于RDKit和Python3的机器学习活性预测模型小示例。 代码示例: #导入必须的包#!/usr/bin/env python3from rdkit.Chem import Descriptorsfrom rdkit.Chem import AllChem as chfrom rdkit.Chem import Draw as d...

利用化合物的结构与活性数据,基于RDKit和Python3的机器学习活性预测模型小示例。

代码示例:



   
  1. #导入必须的包
  2. #!/usr/bin/env python3
  3. from rdkit.Chem import Descriptors
  4. from rdkit.Chem import AllChem as ch
  5. from rdkit.Chem import Draw as d
  6. from rdkit import DataStructs
  7. import pandas as pd
  8. from rdkit.Chem import rdMolDescriptors as rdescriptors
  9. from matplotlib.mlab import PCA
  10. import matplotlib.pyplot as plt
  11. import csv
  12. from rdkit.SimDivFilters.rdSimDivPickers import MaxMinPicker
  13. import sklearn
  14. from rdkit.Chem import PandasTools, Descriptors, MolFromSmiles
  15. from pandas import DataFrame
  16. from sklearn.model_selection import train_test_split
  17. from sklearn import svm
  18. import numpy as np
  19. from sklearn.metrics import mean_squared_error
  20. import matplotlib.pyplot as plt
  21. from sklearn.ensemble import RandomForestRegressor, AdaBoostRegressor, GradientBoostingRegressor

   
  1. #载入数据
  2. with open ('receptor-bioactivity.txt', 'r') as f:
  3.    content_raw = list((csv.reader(f, delimiter = '\t')))
  4. len(content_raw)

   
  1. #移除重复数据
  2. content=[]
  3. for i in range(0,len(content_raw)):
  4.    if i == 0:
  5.        chembl_id=content_raw[i][0]
  6.        content.append(content_raw[i])
  7.    elif content_raw[i][0]!=chembl_id:
  8.        chembl_id=content_raw[i][0]
  9.        content.append(content_raw[i])

   
  1. #提取有用信息
  2. names = []
  3. smiles = []
  4. activity = []
  5. mols = []
  6. for i in range(1,len(content)):
  7.    names.append(content[i][0])
  8.    smiles.append(content[i][5])
  9.    activity.append(content[i][7])
  10.    mols.append(ch.MolFromSmiles(content[i][5]))

   
  1. #为深入分析创建数据集
  2. def HBA(mol):
  3.    return rdescriptors.CalcNumLipinskiHBA(mol)
  4. def HBD(mol):
  5.    return rdescriptors.CalcNumLipinskiHBD(mol)
  6. def logP(mol):
  7.    return Descriptors.MolLogP(mol)
  8. def TPSA(mol):
  9.    return Descriptors.TPSA(mol)
  10. def num_rotatable_bonds(mol):
  11.    return Descriptors.NumRotatableBonds(mol)
  12. def num_heavy_atoms(mol):
  13.    return mol.GetNumHeavyAtoms()
  14. def MW(mol):
  15.    return Descriptors.MolWt(mol)
  16. data=[]
  17. for i,mol in enumerate(mols):
  18.    data.append([names[i], float(activity[i]), HBA(mol), HBD(mol), float(MW(mol)), logP(mol),float(TPSA(mol)),num_rotatable_bonds(mol),num_heavy_atoms(mol),smiles[i]])
  19. dataframe=pd.DataFrame(data,columns=["CHEMBL_ID", "activity", "HBA", "HBD", "MW", "logP", "TPSA","rb",'smiles'])
  20. dataframe.set_index("CHEMBL_ID",inplace=True)

PCA分析,数据降维也称主成分分析


   
  1. #PCA分析
  2. pca1=PCA(dataframe.drop(['smiles'],axis=1))
  3. plt.rcParams["figure.figsize"] = [15, 15]
  4. plt.style.use('ggplot')
  5. fig = plt.figure()
  6. ax = fig.add_subplot(111)
  7. ax.set_title('Ghrelin Receptor Homo sapiens PCA')
  8. ax.set_xlabel('PC1')
  9. ax.set_ylabel('PC2')
  10. X = [x[0] for x in pca1.Y]
  11. Y = [y[1] for y in pca1.Y]
  12. plt.scatter(X,Y)
  13. plt.show()


   
  1. #运用随机森林模型,并为其选择有用数据
  2. model=dataframe.loc[:,["smiles", "activity"]]
  3. desc_list = Descriptors.descList
  4. model["pic50"] = model.activity.apply(lambda x : -1.0 * np.log10(x / 1.0e9))
  5. for desc_name, function in desc_list:
  6.    values = []
  7.    for smiles in model["smiles"]:
  8.        mol = MolFromSmiles(smiles)
  9.        values.append(function(mol))
  10.    model[desc_name] = values
  11. columns = [x[0] for x in desc_list[:30]]

   
  1. #划分数据集,训练模型
  2. train_data, test_data = train_test_split(model, test_size=0.3)
  3. model2 = RandomForestRegressor(n_estimators=15)
  4. model2.fit(train_data[columns], train_data["pic50"])

   
  1. #测试模型,绘图
  2. plt.rcParams["figure.figsize"] = [15, 15]
  3. span = (1,12)
  4. axes = plt.gca()
  5. axes.set_xlim(span)
  6. axes.set_ylim(span)
  7. plt.plot((span[0],span[1]), (span[0],span[1]), linestyle='--')
  8. plt.scatter(
  9.    test_data["pic50"]
  10.    , model2.predict(test_data[columns])
  11.    , c='blue'
  12.    , s=20
  13. )
  14. plt.show()


文章来源: drugai.blog.csdn.net,作者:DrugAI,版权归原作者所有,如需转载,请联系作者。

原文链接:drugai.blog.csdn.net/article/details/105683679

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。