我在这方面是新手,但我想为活性化合物与诱饵的一个小数据集绘制一条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()发布于 2021-03-20 01:24:49
绘制ROC曲线所需的代码非常相似,但比您的代码更简单。没有必要将fpr和tpr存储为字典,它们是数组。我认为问题是您的预测是绝对正确/错误的,而不是一个可以用于使用roc_curve函数生成阈值的概率。我将pred值更改为概率值(> 0.5表示True,< 0.5表示False),曲线现在看起来更接近您的预期。此外,只有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。

https://stackoverflow.com/questions/66671449
复制相似问题