Python中通过定义和ROC方法计算准确率(基尼系数)

问题描述 投票:0回答:1

为什么以下计算准确率的方法会给出不同的结果?

方法 1:累积精度曲线 (CAP) 曲线

准确率的计算公式为:训练模型与随机模型的 CAP 曲线下面积之差除以完美模型与随机模型的 CAP 曲线下面积之差。随机模型。

方法 2:受试者工作特征 (ROC) 曲线。 我们计算 ROC 曲线下的面积,并使用统计量

AR = 基尼 = 2*(ROC 曲线下面积)- 1

有关统计数据的推导,请参阅论文“衡量评级系统的歧视力”(https://www.bundesbank.de/resource/blob/704150/b9fa10a16dfff3c98842581253f6d141/mL/2003-10-01- dkp-01-data.pdf)

有关我正在使用的代码来源和更多示例,请参阅文章“使用 ROC 进行机器学习分类器评估”(https://towardsdatascience.com/machine-learning-classifier-evaluation-using-roc-和-帽曲线-7db60fe6b716

接下来,我们有一个实际测试标签的向量

y_test
,以及从某个预测模型输出的正类(标签=1)的预测概率的向量
test_pred_probs
。我们计算该预测的准确率。

from sklearn.metrics import roc_curve, auc, roc_auc_score
import numpy as np
y_test = [0,1,1,0,1,1,1,0,0,1]
test_pred_probs = [0.2,0.4,0.1,0,0,1,0.9,0.3,0.2,0.8]
total = len(y_test)
one_count = np.sum(y_test)
zero_count = total - one_count
lm = [y for _,y in sorted(zip(test_pred_probs,y_test),reverse=True)]
x = np.arange(0,total+1)
y = np.append([0],np.cumsum(lm))
a = auc([0,total],[0,one_count])
aP = auc([0,one_count,total],[0,one_count,one_count]) - a
aR = auc(x,y) - a
print("Acc ratio:",aR/aP) #returns 0.5
print("Acc ratio from ROC curve:",2*roc_auc_score(y_test,test_pred_probs)-1) #returns 0.458

在某些情况下,这两种方法给出的结果截然不同 - 前者给出的 AR 约为 0.7,后者使用 ROC 方法给出的 AR 为 0.12。

python-3.x machine-learning scikit-learn statistics gini
1个回答
0
投票

我使用了你的代码中的两种不同的方法,但我得到了两个准确率结果没有太大区别

© www.soinside.com 2019 - 2024. All rights reserved.