之前在这抄了一份python画DCA的代码,但是因为网页缩进问题自己摸索了好久。而且代码中有一些细节的地方原作者没有予以标识。这里对这些可能引起错误的地方做出一些说明。
1.输入的格式,pred_ans可以是预测结果(如二分类结果0或1),也可以是预测概率(如二分类结果中,该样本分到阳性的概率0.xxx),Y输入则是测试集的标签。如图所示
2.代码中的
jiduan.append((78-(103-78)*pt/(1-pt))/103)
78改为自己测试集标签的阳性数量,103改为自己测试集的总数(也可以小公式搞定但是我懒)
3.代码中ylim改为标签阳性率。
这里写自定义目录标题
def dca(pred_ans, Y):
pt_arr = []
net_bnf_arr = []
jiduan = []
pred_ans = pred_ans.ravel()
for i in range(0,100,1):
pt = i /100
#compiute TP FP
pred_ans_clip = np.zeros(pred_ans.shape[0])
for j in range(pred_ans.shape[0]):
if pred_ans[j] >= pt:
pred_ans_clip[j] = 1
else:
pred_ans_clip[j] = 0
TP = np.sum((Y) * np.round(pred_ans_clip))
FP = np.sum((1 - Y) * np.round(pred_ans_clip))
net_bnf = ( TP-(FP * pt/(1-pt)) )/Y.shape[0]
print(‘pt {}, TP {}, FP {}, net_bf {}’.format(pt,TP,FP,net_bnf))
pt_arr.append(pt)
net_bnf_arr.append(net_bnf)
jiduan.append((78-(103-78)*pt/(1-pt))/103)
plt.plot(pt_arr, net_bnf_arr, color=‘red’, lw=2, linestyle=‘–’,label=‘R H B P ^{HBP} HBP’)
plt.plot(pt_arr, np.zeros(len(pt_arr)), color=‘k’, lw=2, linestyle=‘–’,label=‘None’)
# data_test = data_test.ravel()
pt_np = np.array(pt_arr)
# jiduan = (np.sum(data_test)-(len(data_test)-np.sum(data_test)*pt_np)/(1-pt_np))/len(data_test)
plt.plot(pt_arr, jiduan , color=‘b’, lw=2, linestyle=‘dotted’,label=‘All’)
plt.xlim([0.0, 1.0])
plt.ylim([-0.05, 0.75])
plt.xlabel(‘Risk Threshold’, font1)
plt.ylabel(‘Net Benefit’, font1)
plt.title(‘Validation Dataset’, font1)
plt.legend(loc=“right”)
plt.grid()
# plt.savefig(“DCA.png”)
plt.show()
这里放出截图供大家对着缩进