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

问题描述

我是新手,但我想为活性化合物与诱饵的小数据集绘制 ROC 曲线。我基于此链接ROC curve for binary classification in python 在这种情况下,这个小数据集是虚拟筛选的结果,该筛选对来自实验数据 (IC50) 的已知活性或非活性化合物进行排序和评分。

我不确定图和 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]
pred = [1,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 存储为字典,它们是数组。我认为问题在于您的预测是绝对的真/假,而不是可用于使用 roc_curve 函数生成阈值的概率。我将预测值更改为概率(> 0.5 为真,

test = [1,1,1]
pred = [0.91,0.87,0.9,0.75,0.85,0.97,0.99,0.98,0.66,0.57,0.89,0.62,0.93,0.55,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,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。

Plot from code above