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

2024-10-06 13:50:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新手,但我想画一个活性化合物与诱饵的小数据集的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()

Tags: 数据testpltdict活性roccurvepred
1条回答
网友
1楼 · 发布于 2024-10-06 13:50:38

绘制ROC曲线所需的代码非常相似,但比您的代码更简单。不需要将fpr和tpr存储为字典,它们是数组。我认为问题在于你的预测是绝对正确/错误的,而不是使用roc_曲线函数生成阈值的概率。我将pred值更改为概率(>;0.5为真,<;0.5为假),现在曲线看起来更接近您可能期望的值。 此外,只有66%的预测是正确的,这使得曲线相对接近“无差别”线(概率为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

Plot from code above

相关问题 更多 >