推荐系统---AUC计算

AUC:计算正样本预测得分大于负样本预测得分的概率。

  1. ROC曲线面积(传统算法)

  2. 公式法(常用)

我们给每一个样本赋一个排序值,第一位 rank1 = n,第二位 rank2 = n-1,以此类推。

其中:

  • :代表正样本序号(概率得分从小到大排,排在位置rank_i)
  • M, N :分别是正/负样本个数
  • :只把正样本的序号相加

解释:

该公式表示从小到大排序后,第一个正样本的位置就是其比负样本得分大的个数;对于第二个正样本,前面有已经1个正样本了,所以负样本个数为位置减去1。对于第M个正样本,匹配的负样本个数为位置序号减去 M-1 。 故而,分子就为所有正样本的位置序号和,再减去 (0+1+2+......+M-1) ,即 sum(i)-M*(M-1)/2 。

代码

1.ROC曲线面积(梯形面积计算)

python 复制代码
def calculate_auc(y_true, y_pred):
    # 将真实值和预测值按预测值排序
    data = sorted(zip(y_true, y_pred), key=lambda x: x[1])
    
    # 计算正例和负例的数量
    pos = sum(y_true)
    neg = len(y_true) - pos
    
    # 初始化变量
    tp = 0
    fp = 0
    prev_fp = 0
    prev_tp = 0
    prev_pred = -float('inf')
    auc = 0.0
    
    for label, pred in data:
        if pred != prev_pred:
            auc += (fp - prev_fp) * (tp + prev_tp) / 2.0
            prev_fp = fp
            prev_tp = tp
            prev_pred = pred
        
        if label == 1:
            tp += 1
        else:
            fp += 1
    
    auc += (fp - prev_fp) * (tp + prev_tp) / 2.0
    auc /= (pos * neg)
    
    return auc
 
# 真实值和预测值
y_true = [0, 0, 1, 1]  # 真实值
y_pred = [0.1, 0.4, 0.35, 0.8]  # 预测值
 
# 计算AUC
auc = calculate_auc(y_true, y_pred)
print("AUC: ", auc)

2.公式法

python 复制代码
def calculate_auc(y_true, y_scores):
    # 将样本按预测分数排序
    sorted_indices = sorted(range(len(y_scores)), key=lambda i: y_scores[i], reverse=True)
    sorted_y_true = [y_true[i] for i in sorted_indices]
 
    # 计算正负样本的数量
    pos_count = sum(sorted_y_true)
    neg_count = len(sorted_y_true) - pos_count
 
    # 计算AUC
    auc = 0.0
    cum_pos = 0
    cum_neg = 0
    for i in range(len(sorted_y_true)):
        if sorted_y_true[i] == 1:
            cum_pos += 1
        else:
            cum_neg += 1
            auc += cum_pos
 
    auc /= (pos_count * neg_count)
    return auc
 
# 示例数据
y_true = [0, 0, 1, 1]
y_scores = [0.1, 0.4, 0.35, 0.8]
 
# 计算AUC
auc = calculate_auc(y_true, y_scores)
print(f"AUC: {auc}")

GAUC

代码

python 复制代码
def calculate_gauc(y_true, y_scores, group_ids):
    # 将样本按组分开
    group_data = {}
    for i in range(len(group_ids)):
        group_id = group_ids[i]
        if group_id not in group_data:
            group_data[group_id] = {'y_true': [], 'y_scores': []}
        group_data[group_id]['y_true'].append(y_true[i])
        group_data[group_id]['y_scores'].append(y_scores[i])
 
    # 计算每个组的AUC和样本数量
    total_auc = 0.0
    total_samples = 0
    for group_id, data in group_data.items():
        group_auc = calculate_auc(data['y_true'], data['y_scores'])
        group_samples = len(data['y_true'])
        total_auc += group_auc * group_samples
        total_samples += group_samples
 
    # 计算GAUC
    gauc = total_auc / total_samples
    return gauc
 
# 示例数据
y_true = [0, 0, 1, 1, 0, 1]
y_scores = [0.1, 0.4, 0.35, 0.8, 0.5, 0.6]
group_ids = [1, 1, 1, 2, 2, 2]
 
# 计算GAUC
gauc = calculate_gauc(y_true, y_scores, group_ids)
print(f"GAUC: {gauc}")
相关推荐
打工仔折腾 AI1 分钟前
鸿蒙端ToDesk远控电脑实测:蓝牙键鼠、双模式鼠标与跨端剪贴板实践
后端·python·性能优化·计算机外设·电脑·harmonyos·ai agent 实战
来包番茄沙司3 分钟前
【网盘资源分享】2026新版尚硅谷AI Agent智能体极速版|全套课程资料+面经
人工智能·学习
kimnoic7 分钟前
Python变量与数据类型全解析(最新整理)
开发语言·python
拉你进_教堂12 分钟前
小龙虾技能之【Contactless Health Risk Screening Tool | 非接触式健康风险检测分析工具】简介
人工智能·目标检测·计算机视觉·多模态大模型·openclaw小龙虾技能
梦想的初衷~15 分钟前
从通量数据到SCI论文——AI-R语言生态系统碳水热通量及其机制分析与论文实战
人工智能·机器学习·r语言·r 语言·fluxnet·涡度·生态系统碳通量
维智佳创winzsoft15 分钟前
维智佳创受邀参加中望软件ZWORLD 2026,共塑CAD二次开发AI新智能
人工智能·科技·ai·业界资讯·cad二次开发·中望cad二次开发·cad-ai设计
Python图像识别18 分钟前
46-【2027毕设】YOLO11田间杂草检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
计算机编程指导师19 分钟前
计算机毕设选题:基于Spark+Django的水质多指标关联分析与可视化系统源码 毕业设计 选题推荐 数据分析 机器学习
大数据·hadoop·python·spark·毕业设计·课程设计·水质
飞猫的边缘AI20 分钟前
马斯克的Starmind与太空边缘计算
人工智能·芯片·英伟达·边缘ai
梦想的颜色22 分钟前
【AI速览】TTS 语音克隆 + 音色稳定 + 长文本断句 + 数字人驱动全解
人工智能·语音识别·indextts2