ROC曲线和AUC,推荐系统中常用AUC作为排序模型的评估指标

1、ROC曲线

  • 在不同的应用任务中,我们可根据任务需求来采用不同的截断点。如果我们更重视“查准率”,则可选择排序中靠前的位置进行截断;如果更重视“查全率”,则可选择靠后的位置进行截断。 ROC 曲线就是从这个角度出发来研究学习器泛化性能的有力工具。
  • 计算TPR和FPR:
    在这里插入图片描述
  • ROC 曲线的横轴是假正例率 FPR,纵轴是真正例率 TPR

事实上,机器学习模型的一个特点是:在模型性能固定的前提下,如果模型将更多的正例预测为正例,那么也必然会将更多的反例预测为正例。即 TPR越大,则 FPR 也会越大。

  • ROC曲线的绘制流程:

(1)给定 m+个正例和m-个反例,通过分类器得到每个样本的预测概率,对其从高到低进行排序
(2)将分类阈值设为最大,即把所有样例均预测为反例。此时真正例率和假正例率均为0,则 ROC 曲线的起点为 (0,0)
(3)将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。通过该阈值计算(FPR,TPR)坐标,并使用线段连接这些坐标。
(4)将分类阈值设为最小,即把所有样例均预测为正例。此时真正例率和假正例率均为1,则 ROC 曲线的终点为 (1,1)

  • 若一个学习器的 ROC 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者; 若两个学习器的 ROC 曲线发生交叉,则难以一般性地断言两者孰优孰劣此时如果一定要进行比较,则较为合理的判据是比较 ROC 曲线下的面积即 AUC (Area Under ROC Curve)

2、AUC计算及代码

  • AUC的意义可以理解为:

解释1:随机采样一对样本(一个正样本,一个负样本),模型将正样本预测为正例的概率大于将负样本预测为正例的概率,即将正样本排在负样本之前的概率。
解释2:模型给一堆样本(正负类别标签已知)预测打分,然后将他们从大到小排序,正样本能够正确排在负样本前面的概率就是AUC,例如下图所示的AUC为 7 9 \frac{7}{9} 97
在这里插入图片描述
(上图来自《互联网大厂推荐算法实战》)

  • 可以把AUC理解为区分正类和负类的能力,当AUC越大,表示区分正负类的能力越强。当模型对正负样本没有区分能力时,模型会将一个样本随机预测为正类或负类,此时AUC=0.5,因此 AUC 的有效范围是(0.5,1]。
  • 根据AUC的意义,可得出如下计算公式:
    在这里插入图片描述
    在这里插入图片描述
  • 根据计算公式,有如下代码:
import numpy as np
from sklearn.metrics import roc_auc_score


# 使用 sklearn 计算 auc
def get_auc_func1(label, pred):
    return roc_auc_score(label, pred)


# 使用物理意义计算 AUC
def get_auc_func2(label, pred):
	# 查找正负样本索引
    pos_sample_ids = [i for i in range(len(label)) if label[i] == 1]
    neg_sample_ids = [i for i in range(len(label)) if label[i] == 0]
	# 计算指示函数值
    sum_indicator_value = 0
    for i in pos_sample_ids:
        for j in neg_sample_ids:
            if pred[i] > pred[j]:
                sum_indicator_value += 1
            elif pred[i] == pred[j]:
                sum_indicator_value += 0.5
    auc = sum_indicator_value / (len(pos_sample_ids) * len(neg_sample_ids))
    return auc


if __name__ == '__main__':
    label = np.array([1, 0, 0, 0, 1, 0])
    pred = np.array([0.9, 0.4, 0.3, 0.1, 0.3, 0.6])
    print(f"auc = {get_auc_func1(label, pred):6f}")  # auc = 0.687500
    print(f"auc = {get_auc_func2(label, pred):6f}")  # auc = 0.687500

  • AUC的优缺点:

优点:
1)AUC 是根据所有分类阈值得到的,不依赖于分类阈值的选取。AUC体现的是对样本的排序能力,与具体的分值无关。因此 AUC 和推荐系统中的大多数业务场景更贴合,因为大多数业务场景关心 item 之间的相对顺序而不关心 item 的预测分。
2)根据 AUC 的物理意义可知,它是对正负样本随机采样计算得到的,因此 AUC 对正负样本分布不敏感

缺点:
1)AUC 是全局性指标,对于某个用户的 AUC 值不准确。
2)AUC 会忽略模型对正负样本的拟合能力:例如当模型对正样本预测概率均为0.55,对负样本预测概率均为0.45时,此时AUC=1,从 AUC 角度来看是一个完美的模型,但模型对正负样本的拟合能力差。
3)AUC通常用于二分类问题,对于多类别分类问题,需要进行适当的处理,如将其拆分成多个二分类任务

决策树算法进行心脏病预测时,可以使用ROC曲线AUC评估模型的性能。以下是评估步骤: 1. 准备数据集,将数据集分成训练集和测试集。 2. 使用训练集训练决策树模型,并使用测试集进行预测。 3. 计算模型的真阳性率(TPR)和假阳性率(FPR)。 4. 绘制ROC曲线,并计算曲线下面积(AUC)。 在Python,可以使用scikit-learn库来实现ROC曲线AUC的计算和绘制。以下是一个简单的示例代码: ```python from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import roc_curve, auc import matplotlib.pyplot as plt # 准备数据集 X_train, X_test, y_train, y_test = ... # 训练决策树模型 model = DecisionTreeClassifier() model.fit(X_train, y_train) # 使用测试集进行预测 y_pred = model.predict(X_test) # 计算真阳性率和假阳性率 fpr, tpr, thresholds = roc_curve(y_test, y_pred) # 计算AUC roc_auc = auc(fpr, tpr) # 绘制ROC曲线 plt.plot(fpr, tpr, lw=1, label='ROC (area = %0.2f)' % roc_auc) plt.plot([0, 1], [0, 1], '--', color='gray', label='Random') plt.xlim([-0.05, 1.05]) plt.ylim([-0.05, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('Receiver operating characteristic') plt.legend(loc="lower right") plt.show() ``` 在这个示例代码,我们首先准备了数据集,然后训练了一个决策树模型,并使用测试集进行预测。接着,我们计算了真阳性率和假阳性率,并使用它们绘制了ROC曲线。最后,我们计算了曲线下面积(AUC),并将其显示在图表上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值