【bioinformation 10】ADMET-CYPs抑制剂预测实战

🌞欢迎来到AI+医学的世界 
🌈博客主页:卿云阁

💌欢迎关注🎉点赞👍收藏⭐️留言📝

🌟本文由卿云阁原创!

📆首发时间:🌹2024年3月17日🌹

✉️希望可以和大家一起完成进阶之路!

🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!


目录

CYPs功能和抑制剂

常见的机器学习算法举例

KNN实现鸢尾花分类

回归问题

随机森林

论文翻译

代码实现

数据集来源

下载初试文件

整理文件


论文地址:

gkaa166.pdf (silverchair.com)

CYPs功能和抑制剂

        细胞色素P450(cytochromeP450或CYP450,简称CYP450)属于单氧酶的一类,。它参与内源性物质和包括药物、环境化合物在内的外源性物质的代谢。

       根据氨基酸序列的同源程度,其成员又依次分为家族、亚家族和酶个体三级。细胞色素P450酶系统可缩写为CYP,其中家族以阿拉伯数字表示,亚家族以大写英文字母表示,酶个体以阿拉伯数字表示,如CYP2D6CYP2C19CYP3A4等。人类肝细胞色素P450酶系中至少有9种P450与药物代谢相关。

      细胞色素P450主要分布在内质网线粒体内膜上,研究表明细胞色素P450是药物代谢过程中的关键酶,而且对细胞因子和体温调节都有重要影响。


常见的机器学习算法举例

KNN实现鸢尾花分类
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris = datasets.load_iris()
iris_X = iris.data #导入数据
iris_y = iris.target #导入标签
X_train,X_test,y_train,y_test = train_test_split(iris_X,iris_y,train_size=0.3,random_state=20)
model = KNeighborsClassifier()
model.fit(X_train, y_train) # 训练
y_pred = model.predict(X_test)
accuracy_score(y_pred, y_test) # 评估
回归问题
    这里使用的数据是美国波士顿的房价数据集。这个数据集有 13 个特征变量,目标变量是 5.0 50.0 的数值。简单起见,这里介绍一元回归的评估方法,所以我们只使用 13 个特征变量中的“住宅平均房间数”(列名为 RM )。
from sklearn import datasets 
data = datasets.load_boston()
X = data.data[:, [5,]]
y = data.target
from sklearn.linear_model import LinearRegression
model_lir = LinearRegression()
model_lir.fit(X, y)
y_pred = model_lir.predict(X)
print(model_lir.coef_)
print(model_lir.intercept_)
%matplotlib inline
import matplotlib.pyplot as plt
fig, ax = plt.subplots()
ax.scatter(X, y, color='pink', marker='s', label='data set')
ax.plot(X, y_pred, color='blue', label='LinearRegression')
ax.legend()
plt.show()

随机森林
from sklearn.datasets import load_wine
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 读取数据
data = load_wine()
X_train, X_test, y_train, y_test = train_test_split(
 data.data, data.target, test_size=0.3)
model = RandomForestClassifier()
model.fit(X_train, y_train) # 训练
y_pred = model.predict(X_test)
accuracy_score(y_pred, y_test) # 评估
Sklearn Model的属性和功能
from sklearn import datasets
from sklearn.linear_model import LinearRegression#引入线性回归模型

###引入数据###
load_data=datasets.load_boston()
data_X=load_data.data
data_y=load_data.target
print(data_X.shape)
#(506, 13)data_X共13个特征变量

###训练数据###
model=LinearRegression()
model.fit(data_X,data_y)
model.predict(data_X[:4,:])#预测前4个数据

###属性和功能###
print(model.coef_)
'''
[ -1.07170557e-01   4.63952195e-02   2.08602395e-02   2.68856140e+00
  -1.77957587e+01   3.80475246e+00   7.51061703e-04  -1.47575880e+00
   3.05655038e-01  -1.23293463e-02  -9.53463555e-01   9.39251272e-03
  -5.25466633e-01]
'''
print(model.intercept_)
#36.4911032804
print(model.get_params())#得到模型的参数
#{'copy_X': True, 'normalize': False, 'n_jobs': 1, 'fit_intercept': True}
print(model.score(data_X,data_y))#对训练情况进行打分
#0.740607742865
Sklearn数据预处理
from sklearn import preprocessing
import numpy as np
a=np.array([[10,2.7,3.6],
            [-100,5,-2],
            [120,20,40]],dtype=np.float64)
print(a)
print(preprocessing.scale(a))#将值的相差度减小
'''
[[  10.     2.7    3.6]
 [-100.     5.    -2. ]
 [ 120.    20.    40
[[ 0.         -0.85170713 -0.55138018]
 [-1.22474487 -0.55187146 -0.852133  ]
 [ 1.22474487  1.40357859  1.40351318]]

超参数优化(交叉验证)

所有估计器都有可以调整的参数(在文献中通常称为超参数)。估计器的泛化能力通常主要取决于几个参数。Scikit-learn提供自动查找最佳参数组合的工具(通过交叉验证)。在下面的示例中,我们使用 RandomizedSearchCV 对象随机搜索随机森林的参数空间。搜索结束后,RandomizedSearchCV 将表现为已拟合了最佳参数集的 RandomForestRegressor。

from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split
from scipy.stats import randint
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 定义超参数搜索空间
param_distributions = {'n_estimators': range(1, 6),
                       'max_depth': range(5, 11)}
 #现在创建一个 searchCV 对象来拟合数据
search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5, param_distributions=param_distributions, random_state=0)
search.fit(X_train, y_train)
search.best_params_
{'max_depth': 9, 'n_estimators': 4}
search.score(X_test, y_test)
0.73...

论文翻译

摘要:细胞色素P450酶(CYPs)影响药物代谢,CYPs抑制分类的预测模型基于成熟的机器学习方法。该模型在交叉验证和外部验证集上都得到了验证,并取得了良好的性能。

SuperCYPsPred

材料与方法

软件实现

      SuperCYPsPred 数据存储在关系 MySQL 中数据库。RDKit 包 (http://www.rdkit.org/) 用于处理数据库中的化学信息。ChemDoodle Web 组件 (https://web.chemdoodle.com/),服务器中使用了用于化学接口的开源 JavaScript 库。网站后端是使用 PHP 和 Python 构建;Web 访问是通过Apache HTTP 服务器。Redis 用于排队和评估 API 请求 。服务器已经过测试在最新版本的 Mozilla Firefox、Google Chrome 上和 Apple Safari。

输入和输出

      SuperCYPsPred 的用户界面易于使用自我信息。Web 服务器为用户提供四种方式
提交小分子。用户可以上传标准分子文件,分子名称,绘制分子或输入化合物的 SMILES(简化分子输入线输入系统)字符串。或者,用户可以选择不同的模型或所有模型进行预测,包括不同的分子指纹。结果显示在浏览器中的表格格式和雷达图,包括具有理化性质的分子结构以及训练集中最相似的三个分子这为该决定做出了最重要的贡献的CYP预测模型。用户可以在结果部分访问结果,以防预测结果无法立即显示。这些预测结果也是显示为比较平均置信度的雷达图每个训练集中活性化合物的分数模型,到输入化合物的模型。通过Web 服务器上可用的 DDI 检查器用户可以在给定组合时了解 DDI 的可能性的药物以及获取有关替代药物的信息可以用于相同的治疗效果。

     图 1.用作应用案例的示例化合物(舍曲林)的图示。舍曲林是起始化合物;用户可以选择
MACCS 或 Morgan 指纹或两者兼而有之。在这种情况下,两者都被选中。显示的结果显示了细胞色素抑制曲线对于五种主要亚型。结果页面还包括有关类似化合物的信息,以及文献和整体雷达中报告的已知CYP情节。DDI 基质显示舍曲林的细胞色素-药物相互作用,当与药物(如西沙必利或布洛芬)联合使用时可以导致与副作用的主要交互(有关详细信息,请查看服务器上的 DDI 示例)。

数据集

     模型的训练集是从文献和两个不同的数据库中收集的。使用针对五种主要cyp亚型的体外生物发光试验进行定量高通量筛选的总共17143种受试物质来自PubChem Bioas- say数据库,.有关细胞色素P450酶的许多信息是使用我们的内部数据挖掘平台从文献中提取的,并存储在SuperCYP数据库中.该数据库目前包含1170种药物的信息,已知有3800多种相互作用。从最终数据集中移除了无机化合物、盐和混合物以及分类为非决定性的条目。对于五种色谱图中的每一种,将化合物分为训练集和外部验证集,保持活性物质(抑制剂)和非活性物质(非抑制剂)的比例恒定(参见S1补充数据)。

对超原型模型的评估

      使用10倍CLUSTER交叉验证对每种模型进行了验证。使用不同的采样方法对数据进行分割,并保持所有折叠中活性和非活性物质的比例不变。


代码实现

数据集来源

PubChem (nih.gov)

下载初试文件

整理文件

删除无关信息,只保留这三行

只保留有活性和无活性

Inactive变成0,active变成1,根据5中不同类型分成5个表格

现在我们只研究p450-cyp3a4,修改名称,方便操作(SMILES,LABEL)

读取文件

import pandas as pd
df = pd.read_csv('1.csv')

数据预处理

#删除空值
df=df.dropna()

standardiser标准化分子

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple standardiser

for i in df.index:
    try:
        smi = df.loc[i,'SMILES']
        mol = Chem.MolFromSmiles(smi)
        mol = Chem.AddHs(mol)
        parent = standardise.run(mol)  # 使用standatdise清洗分子
        mol_ok_smi = Chem.MolToSmiles(parent)
        df.loc[i,'SMILES'] = mol_ok_smi
        print(i,'done')
    except standardise.StandardiseException as e:
              logging.warning(e.message)

去重

df.drop_duplicates(keep='first',inplace=True)

计算分子量和logp

# 计算分子量
molweight = []
for smi in df['SMILES'].values:
    molweight.append(Descriptors.MolWt(Chem.MolFromSmiles(smi)))
df['molecular_weight'] = molweight
# 计算LogP
logp = []
for smi in df['SMILES'].values:
    logp.append(Descriptors.MolLogP(Chem.MolFromSmiles(smi)))
df['logp'] = logp

删除MW大于1000的分子保存清洗后的数据

df = df[df['molecular_weight'] <=1000]
df.shape
df.to_csv('data.csv',index=None)

   从SMILES列中的每个SMILES字符串中提取Morgan指纹,并将其添加到名为fingerprint的新列中。建立模型完成预测。

KNN算法

# 导入所需的库
import pandas as pd
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import Descriptors
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report

# 读取包含SMILES和标签的CSV文件
df = pd.read_csv('data.csv')

# 提取分子指纹(化学特征)
fingerprints = []
for smi in df['SMILES']:
    mol = Chem.MolFromSmiles(smi)
    if mol is not None:
        fingerprint = AllChem.GetMorganFingerprintAsBitVect(mol, 2)  # 使用Morgan指纹
        fingerprints.append(fingerprint)
    else:
        fingerprints.append(None)

# 将分子指纹添加到数据框中
df['Fingerprints'] = fingerprints


# 准备数据
X = list(df['Fingerprints'])
y = list(df['LABEL'])

# 将数据拆分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 建立随机森林分类器模型
model = RandomForestClassifier(n_estimators=100, random_state=42)

# 训练模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

# 输出分类报告
print(classification_report(y_test, y_pred))

随机森林算法

import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem import AllChem
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import roc_auc_score, confusion_matrix
import math

# 加载数据集
df = pd.read_csv('data.csv')

# 删除空值和异常值
df.dropna(subset=['SMILES'], inplace=True)
df = df[df['SMILES'].apply(lambda x: Chem.MolFromSmiles(x) is not None)]

# 生成分子对应的指纹
X = np.array([AllChem.GetMorganFingerprintAsBitVect(Chem.MolFromSmiles(smi), 2, nBits=1024) for smi in df['SMILES']])

y = df['LABEL'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 构建模型
knn = KNeighborsClassifier()

# 定义超参数优化词典
param = {"n_neighbors": [3, 5, 10]}

# 超参数优化
gc_knn = GridSearchCV(knn, param_grid=param, cv=2, scoring='roc_auc')
gc_knn.fit(X_train, y_train)

# 得到最优参数
print("Best parameters:", gc_knn.best_params_)

# 在测试集上评估
y_pred = gc_knn.predict_proba(X_test)[:, 1]

# 计算评估指标
auc_roc_score = roc_auc_score(y_test, y_pred)
y_pred_print = [round(y, 0) for y in y_pred]
tn, fp, fn, tp = confusion_matrix(y_test, y_pred_print).ravel()
se = tp / (tp + fn)
sp = tn / (tn + fp)  # 也是R
q = (tp + tn) / (tp + fn + tn + fp)
mcc = (tp * tn - fn * fp) / math.sqrt((tp + fn) * (tp + fp) * (tn + fn) * (tn + fp))
P = tp / (tp + fp)
F1 = (P * se * 2) / (P + se)
BA = (se + sp) / 2
print("Evaluation metrics:")
print("TP:", tp)
print("TN:", tn)
print("FN:", fn)
print("FP:", fp)
print("Sensitivity (SE):", se)
print("Specificity (SP):", sp)
print("Matthews Correlation Coefficient (MCC):", mcc)
print("Q value:", q)
print("AUC-ROC Score:", auc_roc_score)
print("F1 Score:", F1)
print("Balanced Accuracy (BA):", BA)

数据清洗完整代码:

import pandas as pd
import rdkit
from rdkit import Chem
from standardiser import standardise
import logging
from rdkit.Chem import Descriptors


df = pd.read_csv('CYP1A2_to_wash.csv')

# 删除空值
df = df.dropna()

# 分子标准化
for i in df.index:
    try:
        smi = df.loc[i, 'SMILES']
        print(smi)
        mol = Chem.MolFromSmiles(smi)
        mol = Chem.AddHs(mol)
        parent = standardise.runm(mol)
        mol_ok_smi = Chem.MolToSiles(parent)
        df.loc[i, 'SMILES'] = mol_ok_smi
        print(i, 'done')
    except standardise.StandardiseException as e:
        logging.warning(e.message)


# 删除重复值
df.drop_duplicates(keep='first', inplace=True)

# 计算分子MW
molweight = []
for smi in list(df['SMILES']):
    molweight.append(Descriptors.MolWt(Chem.MolFromSmiles(smi)))
print(molweight)
df['molecular_weight'] = molweight

# 删除分子量大于1000的
df = df[df['molecular_weight']<=1000]

# 计算分子logP
logP = []
for smi in list(df['SMILES']):
    logP.append(Descriptors.MolLogP(Chem.MolFromSmiles(smi)))
print(logP)
df['logP'] = logP

# 保存清洗后的数据
df.to_csv('data1.csv', index=None)

建模完整代码:

import numpy as np
import pandas as pd
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit.Chem import MACCSkeys
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import roc_auc_score, confusion_matrix
import math

# 加载数据集
df = pd.read_csv('C:/Users/Xsc/Desktop/test.csv')

# 生成分子对应的指纹
X = np.array(
    [AllChem.GetMorganFingerprintAsBitVect(Chem.MolFromSmiles(smi), 2, nBits=1024) for smi in list(df.iloc[:, 1])])

y = df['Label'].values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

# 构建模型
knn = KNeighborsClassifier()

# 定义超参数优化词典
param = {"n_neighbors": [3, 5, 10]}

# 超参数优化
gc_knn = GridSearchCV(knn, param_grid=param, cv=2, scoring='roc_auc')
gc_knn.fit(X_train, y_train)

# 得到最优参数
print(gc_knn.best_params_)

# 在测试集上评估
y_pred = gc_knn.predict_proba(X_test)[:, 1]

# 计算评估指标
auc_roc_score = roc_auc_score(y_test, y_pred)
y_pred_print = [round(y, 0) for y in y_pred]
tn, fp, fn, tp = confusion_matrix(y_test, y_pred_print).ravel()
se = tp / (tp + fn)
sp = tn / (tn + fp)  # 也是R
q = (tp + tn) / (tp + fn + tn + fp)
mcc = (tp * tn - fn * fp) / math.sqrt((tp + fn) * (tp + fp) * (tn + fn) * (tn + fp))
P = tp / (tp + fp)
F1 = (P * se * 2) / (P + se)
BA = (se + sp) / 2
print(tp, tn, fn, fp, se, sp, mcc, q, auc_roc_score, F1, BA)


#
# # MACCS
# X = np.array([MACCSkeys.GenMACCSKeys(Chem.MolFromSmiles(smi)) for smi in list(df.iloc[:, 1])])
# y = df['Label'].values
# X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
#
# # 构建模型
# svc = SVC(probability=True)
#
# # 定义超参数优化词典
# param = {"gamma": ['scale', 'auto', 0.1], 'C': [1, 10, 100]}
#
# # 超参数优化
# gc_svc = GridSearchCV(svc, param_grid=param, cv=2, scoring='roc_auc')
# gc_svc.fit(X, y)
#
# # 得到最优参数
# print(gc_svc.best_params_)
#
# # 在测试集上评估
# y_pred = gc_svc.predict_proba(X_test)[:, 1]
#
# # 计算评估指标
# auc_roc_score = roc_auc_score(y_test, y_pred)
# y_pred_print = [round(y, 0) for y in y_pred]
# tn, fp, fn, tp = confusion_matrix(y_test, y_pred_print).ravel()
# se = tp / (tp + fn)
# sp = tn / (tn + fp)  # 也是R
# q = (tp + tn) / (tp + fn + tn + fp)
# mcc = (tp * tn - fn * fp) / math.sqrt((tp + fn) * (tp + fp) * (tn + fn) * (tn + fp))
# P = tp / (tp + fp)
# F1 = (P * se * 2) / (P + se)
# BA = (se + sp) / 2
# print(tp, tn, fn, fp, se, sp, mcc, q, auc_roc_score, F1, BA)

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卿云阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值