推荐系统评价指标/ROC/AUC(附代码)

2023-05-16

推荐系统评价指标

精确率:
分类正确的正样本数 / 分类器判定为正样本数
召回率:
分类正确的正样本数 / 真正的正样本数
在排序问题中,Top N就是模型判定的正样本,然后计算前N个位置上的准确率Precision@N和前N个位置上的召回率Recall@N。
P-R曲线
横轴是召回率,纵轴是精确率。P-R曲线上一个点代表着,某一阈值下,模型将大于该阈值的结果判为正样本,小于该阈值的为负样本,此时返回结果对应的召回率和精确率。整条曲线是通过将阈值从高到低移动而生成的。
怎么样通过P-R曲线判断分类器性能?
曲线A完全包住曲线B,那么A好。或平衡点(P=R)的取值较大,说明分类器性能好。
F1 score
精准率和召回率的调和平均值:F1=2precisionrecall / (precision+recall)

!!!重要的——ROC曲线
横坐标假阳性率FPR=FP / N,纵坐标真阳性率TPR=TP / P
混淆矩阵核心:TP、TN、FP、FN(记忆小trick:预测的是后面的字母
在这里插入图片描述
N是真实负样本数,FP是N个负样本中被分类器预测为正样本的个数;P是真实正样本数,TP是P个正样本中被分类器预测为正样本的个数。
如何绘制ROC曲线?
”截断点“由高到低,每个截断点都会对应一个FPR和TPR。在二值分类问题当中,”截断点“指的就是区分正负预测结果的阈值。依次调整截断点,直到画出全部的关键点。
另一种直观绘图方法:
横轴间隔1/N,纵轴间隔1/P;根据模型输出的预测概率对样本进行排序(从高到低);依次遍历样本,遇到一个正样本就沿纵轴绘制一个间隔的曲线,遇到一个负样本就沿横轴绘制。直到遍历完全部样本,曲线最终停留在(1,1)。
ROC曲线相比P-R曲线有什么特点?
当正负样本分布发生变化时,ROC曲线的形状能基本保持不变。这个特点让ROC曲线能够尽量降低不同测试集带来的干扰,更加客观地衡量模型本身的性能。当想要看到的是模型在特定数据集上的表现,P-R曲线能更直观地反映性能。

如何计算AUC?
AUC是ROC曲线下的面积大小,一般在x=y的上面,取值范围0.5~1。AUC越大,说明模型越可能把真正的正样本排在前面,分类性能越好。AUC对正负样本比例不敏感,说明:ROC曲线横轴FPR只关注负样本,与正样本无关;纵轴TPR只关注正样本,与负样本无关。横纵轴都不受正负样本比例影响,积分当然也不受其影响。

重要!!!手撕AUC
参考的是这位大佬:
https://www.jianshu.com/p/f9f8e29abbe0
从计算概率的角度理解AUC,随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率的概率。
在这里插入图片描述
在有M个正样本,N个负样本的数据集里:
一共有MxN对样本(一对样本即,一个正样本与一个负样本),先统计这MxN对样本里,正样本的预测概率大于负样本的预测概率的个数。
举例如下
在这里插入图片描述
假设有4条样本。2个正样本,2个负样本,那么MxN=4。
即总共有4个样本对。分别是:
(C,A), (C,B), (D,A), (D,B)

在(C,B)样本对中,正样本C预测的概率小于负样本B预测的概率(也就是C的得分比B低),记为0
在(D,B)样本对中,正样本D预测的概率大于负样本B预测的概率(也就是D的得分比B高),记为1
所以最后的AUC结果即为:
(C,A), (C,B), (D,A), (D,B) =1+0+1+1
总样本对为MxN=4
所以结果为:(1+0+1+1)/4=0.75
如果样本对中正负样本的得分一样,I值取0.5

import numpy as np
from sklearn.metrics import roc_auc_score

def calcAUC(labels, probs):
    N = 0
    P = 0
    neg_prob = []
    pos_prob = []
    for _, i in enumerate(labels):
        if i == 1:
            P += 1
            pos_prob.append(probs[_])
        else:
            N += 1
            neg_prob.append(probs[_])
    number = 0
    for pos in pos_prob:
        for neg in neg_prob:
            if pos > neg:
                number += 1
            elif pos == neg:
                number += 0.5
    return number / (N * P)


y = np.array([1, 0, 0, 0, 1, 0, 1, 0])
pred = np.array([0.9, 0.8, 0.3, 0.1, 0.4, 0.9, 0.66, 0.7])
print('auc=', calcAUC(y, pred))
print('roc_auc=', roc_auc_score(y, pred))

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

推荐系统评价指标/ROC/AUC(附代码) 的相关文章

  • stata绘制roc曲线_绘制ROC曲线、找截断值,教你两种软件操作方法!

    我们在前面学习过用SPSS SPSS操作 多项测量指标的ROC曲线分析 和Stata Stata教程 ROC曲线下面积的比较 绘制ROC曲线 但是 最佳临界点 截断值 cut off point 该怎么选取呢 今天我们来讲一下如何用SPSS
  • ROC曲线绘制与计算

    假设现在有一个二分类问题 xff0c 先引入两个概念 xff1a 真正例率 xff08 TPR xff09 xff1a 正例中预测为正例的比例假正例率 xff08 FPR xff09 xff1a 反例中预测为正例的比例 再假设样本数为6 x
  • 推荐系统之AUC指标的一些理解

    以下是在一些整理的和自己的关于AUC的理解 1 AUC和GAUC的区别 auc反映的是整体样本间的一个排序能力 在计算广告领域 实际要衡量的是不同用户对不同广告之间的排序能力 因此实际应该更关注的是同一个用户对不同广告间的排序能力 GAUC
  • 推荐系统评价指标/ROC/AUC(附代码)

    推荐系统评价指标 精确率 xff1a 分类正确的正样本数 分类器判定为正样本数 召回率 xff1a 分类正确的正样本数 真正的正样本数 在排序问题中 xff0c Top N就是模型判定的正样本 xff0c 然后计算前N个位置上的准确率Pre
  • 二分类确定画出roc曲线,以及基于roc曲线获得最佳划分阈值

    问题 在做二分类问题时候 xff0c 有正样本和负样本 构建的算法 xff0c 针对每个样本会输出一个分数值 假设该分数大小为 0 1 区间内的值 有时候单纯地以分数0 5位阈值划分样本为预测为1或者预测为0 xff0c 效果有时候并不好
  • 如何获得逻辑回归中 ROC 的最佳截止点作为数字

    我想将逻辑回归中 ROC 的最佳截止点作为数字而不是两条交叉曲线 使用下面的代码 我可以获得显示最佳点的图 但在某些情况下 我只需要该点作为可用于其他计算的数字 以下是代码行 library Epi ROC form IsVIP var1
  • 如何修复 ValueError:不支持多类格式[重复]

    这个问题在这里已经有答案了 这是我的代码 我尝试计算 ROC 分数 但我遇到 ValueError 问题 不支持多类格式 我已经在寻找 sci kit learn 但它没有帮助 最后 我仍然有 ValueError 不支持多类格式 这是我的
  • 使用 ROCR 和 pROC (R) 计算平均 AUC 的差异

    我正在使用来自 SVM RFE 模型的交叉验证数据 10 倍重复 5 次 caret包裹 我知道caret包适用于pROC计算指标时包 但我需要使用ROCR包以获得平均 ROC 然而 我注意到使用每个包时的平均 AUC 值并不相同 所以我不
  • sklearn 中留一交叉验证的 ROC 曲线

    我想绘制一个ROC曲线的分类器使用留一法交叉验证 好像有人问过类似的问题here但没有任何答复 在另一个问题中here据称 为了使用 LeaveOneOut 获得有意义的 ROC AUC 您需要 计算每次折叠的概率估计 每个折叠只包含 一个
  • 在单个 ROC 图上绘制线性判别分析、分类树和朴素贝叶斯曲线

    数据显示在页面的最底部 称为 LDA scores 这是一个分类任务 我在数据集上执行了三种监督机器学习分类技术 提供所有编码以显示这些 ROC 曲线是如何生成的 我很抱歉提出了一个有问题的问题 但近两周来我一直在尝试使用不同的代码组合来解
  • 用于随机森林分类的​​ ROC 曲线

    我在用randomForestR平台中用于分类任务的包 rf object lt randomForest data matrix label factor cutoff c k 1 k 其中 k 的范围为 0 1 到 0 9 pred l
  • 从 ROC 曲线获取阈值

    我有一些模型 使用ROCR将预测类百分比向量封装起来 我有一个性能对象 使用规格 tpr fpr 绘制性能对象可以得到一条 ROC 曲线 我正在比较特定误报率阈值 x 的模型 我希望从性能对象中获取真阳性率 y 的值 更重要的是 我想获得用
  • StatsModels的predict函数如何与scikit-learn的roc_auc_score交互?

    我正在尝试理解predictPython statsmodels 中用于 Logit 模型的函数 它的文档是here https www statsmodels org stable generated statsmodels discre
  • ROC 函数错误“预测变量必须是数字或有序的。”

    我无法让 ROC 函数正常工作 收到错误 预测器必须是数字或有序的 我浏览了其他帖子 但没有解决我的问题 非常感谢任何帮助 Get data flying dget https www math ntnu no emner TMA4268
  • 错误:“y_true 中的类数不等于 'y_score' 中的列数”

    我有一个不平衡的多类数据集 当我尝试计算 roc auc score 时 我收到此错误 ValueError y true 中的类数不等于 y score 中的列数 这是代码 model svm SVC kernel linear prob
  • 如何用Python绘制ROC曲线

    我正在尝试绘制 ROC 曲线来评估我使用逻辑回归包在 Python 中开发的预测模型的准确性 我计算了真阳性率和假阳性率 但是 我无法弄清楚如何使用正确绘制这些matplotlib并计算AUC值 我怎么能这么做呢 您可以尝试以下两种方法 假
  • MATLAB - 从分类器生成混淆矩阵

    我有一些测试数据和标签 testZ 0 25 0 29 0 62 0 27 0 82 1 18 0 93 0 54 0 78 0 31 1 11 1 08 1 02 testY 1 1 1 1 1 2 2 2 2 2 2 2 2 然后我对它
  • 如何生成阳性预测值 (PPV) 与各种分类截止点的关系图?

    我生成了一些分数来帮助预测某些内容是 是 1 还是 否 0 假设数据包括 scores c 10 20 response c 0 0 1 0 1 0 1 1 0 1 1 mydata data frame scores response 我
  • 绘制多个类别的 ROC 曲线

    我正在按照此链接绘制多个类别的 ROC 曲线的文档 http scikit learn org stable auto examples model selection plot roc html http scikit learn org
  • 使用seaborn绘制简单线图

    我正在尝试使用seaborn python 绘制ROC曲线 对于 matplotlib 我只需使用该函数plot plt plot one minus specificity sensitivity bs where one minus s

随机推荐