python 中活性化合物与诱饵的 ROC 曲线 - 是否正确生成?

ROC curve in python for active compounds vs. decoys - is it being generated correctly?

我是这方面的新手,但我想为活性化合物与诱饵的小型数据集绘制 ROC 曲线。我基于这个 link: 在这种情况下,这个小数据集是虚拟筛选的结果,该虚拟筛选对实验数据 (IC50) 中已知 activity 或 activity 的化合物进行排名和评分。

我不确定剧情和AUC是否正确。我注意到即使测试(真实)预测值之间只有一个值差异,AUC 也只有 0.5。对于我在下面插入的代码中的真实值和预测值,它仅为 0.49 左右。也许该模型没有正确识别化合物。然而,我注意到对于排名中的前十个化合物,它识别正确,除了一些在其他位置。也许它比阴性化合物更好地识别活性化合物,或者可能是因为有更多的活性化合物需要考虑。另外,除了二进制分类之外,对测试值和预测值使用另一个分类系统会更好吗?例如,将 IC50 值从最佳到最差排列并与虚拟筛选等级进行比较,为真实结果和预测结果创建分数,考虑每个化合物等级之间的相似性(对于 IC50 和虚拟筛选)?

考虑到活性化合物和诱饵数量之间的数据不平衡,我还想过做一条精确召回曲线。

import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc, roc_auc_score
test = [1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,0,1,1,1]
pred = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0]
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(2):
    fpr[i], tpr[i], _ = roc_curve(test, pred)
    roc_auc[i] = auc(fpr[i], tpr[i])

print(roc_auc_score(test, pred))
plt.figure()
plt.plot(fpr[1], tpr[1])
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.show()

绘制 ROC 曲线所需的代码与您的非常相似,但比您的更简单。没必要把fpr和tpr存储成字典,它们是数组。我认为问题在于您的预测是绝对的 True/False,而不是可用于使用 roc_curve 函数生成阈值的概率。我将 pred 值更改为概率(> 0.5 为真,< 0.5 为假),现在曲线看起来更接近您的预期。 此外,只有 66% 的预测是正确的,这使得曲线相对接近 'no-discrimination' 线(概率为 50% 的随机事件)。

test = [1,1,1,1,1,1,1,1,1,1,0,1,1,0,1,0,1,1,0,1,0,1,1,1]
pred = [0.91,0.87,0.9,0.75,0.85,0.97,0.99,0.98,0.66,0.97,0.98,0.57,0.89,0.62,0.93,0.97,0.55,0.99,0.11,0.84,0.45,0.35,0.3,0.39]

fpr, tpr, _ = roc_curve(test, pred)
roc_auc = auc(fpr, tpr)

print(roc_auc_score(test, pred))
plt.figure()
plt.plot(fpr, tpr)
plt.plot([0.0, 1.0], [0.0, 1.0], ls='--', lw=0.3, c='k')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic')
plt.show()

现在 AUC 值为 0.5842105263157894。