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

推荐系统评价指标

精确率:
分类正确的正样本数 / 分类器判定为正样本数
召回率:
分类正确的正样本数 / 真正的正样本数
在排序问题中,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))

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
一些常见的算法评价指标包括: 1. 准确率(Accuracy):分类正确的样本占总样本的比例。 2. 精确率(Precision):分类为正样本中真正为正样本的比例。 3. 召回率(Recall):正样本中被分类为正样本的比例。 4. F1分数(F1-score):精确率和召回率的加权调和平均数。 5. ROC曲线和AUC值(ROC curve and AUC value):ROC曲线反映了分类器在不同阈值下的性能表现,AUC值表示ROC曲线下的面积。 6. 混淆矩阵(Confusion matrix):展示分类器性能表现的矩阵。 7. 平均准确率(Average Precision):用于评价在不同召回率下的分类器表现。 以下是 Python 代码实现这些指标: ```python from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_curve, auc, confusion_matrix, average_precision_score # 计算准确率 accuracy = accuracy_score(y_true, y_pred) # 计算精确率 precision = precision_score(y_true, y_pred, average='binary') # 计算召回率 recall = recall_score(y_true, y_pred, average='binary') # 计算F1分数 f1 = f1_score(y_true, y_pred, average='binary') # 计算ROC曲线和AUC值 fpr, tpr, thresholds = roc_curve(y_true, y_pred) roc_auc = auc(fpr, tpr) # 计算混淆矩阵 conf_matrix = confusion_matrix(y_true, y_pred) # 计算平均准确率 ap = average_precision_score(y_true, y_pred) ``` 其中,`y_true`为真实标签,`y_pred`为预测标签。在计算精确率、召回率、F1分数时,`average='binary'`表示只考虑二分类问题。如果是多分类问题,可以设置`average='macro'`或`average='weighted'`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值