【问题标题】:ROC curve in python for active compounds vs. decoys - is it being generated correctly?python中活性化合物与诱饵的ROC曲线-生成是否正确?
【发布时间】:2021-06-14 16:39:58
【问题描述】:

我是这方面的新手,但我想为一小部分活性化合物与诱饵数据集绘制 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,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曲线,或者是否有更好的编码方式。
  • 那么请编辑您的问题以反映这一点。目前,它看起来更像是对您的数据的咆哮,而不是一个问题。
  • 我在标题中添加了主要问题——我在第二段开头提到的问题。也许不清楚,因为我没有包括问号,就像同一段中的其他两个问题一样。这可能看起来像是咆哮,因为我想在包含更多关于问题/担忧的情况的详细信息(观察/想法)中。

标签: python matplotlib roc docking chemistry


【解决方案1】:

绘制 ROC 曲线所需的代码非常相似,但比您的更简单。不需要将 fpr 和 tpr 存储为字典,它们是数组。我认为问题在于您的预测是绝对真/假,而不是可用于使用 roc_curve 函数生成阈值的概率。我将 pred 值更改为概率(> 0.5 为真,

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-10
    • 2019-12-26
    • 2018-01-04
    • 2016-06-11
    • 1970-01-01
    • 2012-04-14
    • 2020-04-18
    • 2015-08-28
    相关资源
    最近更新 更多