二分类器代码中True Negative Rate(TNR)计算方法及变量含义解析
理解二分类器变量含义与TNR计算方法
首先,先帮你拆解代码里每个变量的含义(结合二分类场景,这里0代表良性样本(阴性类),1代表广告/恶意样本(阳性类)):
benign_guesses:分类器预测为**良性(类别0)**的样本总数量。每遍历到一个预测值为0的样本,这个变量就加1。benign_rate:分类器正确预测为良性的样本数,也就是统计学里的真阴性(TN, True Negative)——真实标签是0,且预测结果也为0的样本数。ad_guesses:分类器预测为**广告/恶意(类别1)**的样本总数量。每遍历到一个预测值为1的样本,这个变量就加1。ad_rate:分类器正确预测为广告/恶意的样本数,也就是统计学里的真阳性(TP, True Positive)——真实标签是1,且预测结果也为1的样本数。
关于TNR(真阴性率)的正确计算
你猜测的公式TNR = 2*benign_rate/len(y_hat)是错误的,这个结果只是在你的测试样本数刚好为2时的巧合,不具备通用性。
TNR的定义
真阴性率是真实为阴性(良性)的样本中,被分类器正确识别为阴性的比例,公式为:
TNR = 真阴性数(TN) / 真实阴性样本总数
其中真实阴性样本总数是sum(y_test == 0)(即所有真实标签为0的样本数量)。
结合你的代码计算TNR
用代码里的变量代入的话,正确的计算方式是:
# 先计算真实阴性样本总数 total_benign = sum(y_test == 0) # 计算TNR,注意处理total_benign为0的情况(避免除以0) TNR = benign_rate / total_benign if total_benign != 0 else 0.0
原代码里的错误点补充
你提供的代码里还有几个明显的计算错误:
TP = 2*ad_rate/len(y_hat):TP就是ad_rate本身(真阳性的数量),不需要乘以2再除以样本数,这是把TP和TPR(真阳性率)混淆了。TPR = 2 * ad_rate / len(y_hat):TPR(真阳性率/召回率)的正确公式是TP / 真实阳性样本总数,也就是ad_rate / sum(y_test == 1),原代码的计算方式完全错误。recall = round(100*TPR, 2):这里还出现了变量顺序错误——先调用了TPR,但代码里是在这之后才定义TPR的,会导致运行报错。
内容的提问来源于stack exchange,提问作者j35t3r
相关产品推荐
相关产品推荐

