Я новичок в этом, но я хотел бы построить кривую ROC для небольшого набора данных активных соединений по сравнению с приманками. Я основывался на этой ссылке: кривая ROC для двоичной классификации в 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()