🌞欢迎来到AI+医学的世界
🌈博客主页:卿云阁💌欢迎关注🎉点赞👍收藏⭐️留言📝
🌟本文由卿云阁原创!
📆首发时间:🌹2024年3月17日🌹
✉️希望可以和大家一起完成进阶之路!
🙏作者水平很有限,如果发现错误,请留言轰炸哦!万分感谢!
目录
论文地址:
CYPs功能和抑制剂
细胞色素P450(cytochromeP450或CYP450,简称CYP450)属于单氧酶的一类,。它参与内源性物质和包括药物、环境化合物在内的外源性物质的代谢。
根据氨基酸序列的同源程度,其成员又依次分为家族、亚家族和酶个体三级。细胞色素P450酶系统可缩写为CYP,其中家族以阿拉伯数字表示,亚家族以大写英文字母表示,酶个体以阿拉伯数字表示,如CYP2D6、CYP2C19、CYP3A4等。人类肝细胞色素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 数据存储在关系 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交叉验证对每种模型进行了验证。使用不同的采样方法对数据进行分割,并保持所有折叠中活性和非活性物质的比例不变。
代码实现
数据集来源
下载初试文件
整理文件
删除无关信息,只保留这三行
只保留有活性和无活性
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)
【bioinformation 10】ADMET-CYPs抑制剂预测实战
于 2024-03-18 17:00:10 首次发布