常用指标和损失总结

损失

回归问题

L1损失

L1 损失是最小化模型参数的绝对值之和。

倾向于使模型参数接近零,导致模型变得更加稀疏。这意味着一些特征的权重可能变为零,从而被模型忽略。

对异常值非常敏感。异常值会导致参数权重绝对值增大,从而影响模型的整体结构。

求解 L1 损失的问题通常比求解 L2 损失的问题更难。L1 损失的优化问题是一个非凸问题,而 L2 损失的优化问题是一个凸问题。这使得 L1 损失的优化算法(如坐标下降法)可能需要更多的迭代来收敛。

当模型的稀疏性非常重要时,例如在文本分析或生物信息学中,L1 损失是一个很好的选择。

L2损失

L2 损失是最小化模型参数的平方和。

倾向于使模型参数的值变小,但不会导致参数变为零。这有助于防止模型过拟合,同时保持参数的非零值。

对异常值的影响较小。虽然异常值会导致参数权重增大,但其平方值会变大,从而在总和中的贡献相对较小。

由于其凸性,L2 损失的优化问题(如最小二乘法)通常更容易解决,并且有多种有效的算法(如梯度下降、牛顿法等)。

当模型的参数需要保留非零值,并且对异常值不太敏感时,L2 损失是一个更常用的选择。

分类问题

交叉熵损失

指标

混淆矩阵

精确度(precision)/查准率:TP/(TP+FP)=TP/P 预测为真中,实际为正样本的概率

召回率(recall)/查全率:TP/(TP+FN) 正样本中,被识别为真的概率

假阳率(False positive rate):FPR = FP/(FP+TN) 负样本中,被识别为真的概率

真阳率(True positive rate):TPR = TP/(TP+FN) 正样本中,能被识别为真的概率

准确率(accuracy):ACC =(TP+TN)/(P+N) 所有样本中,能被正确识别的概率

AUC

ROC曲线面积,纵坐标TPR,横坐标FPR

代码

正负样本数量计算

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}")

梯形面积计算

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)

GAUC

带权重的auc

代码

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}")

常见问题

1.为什么用auc不用acc?

不平衡数据集

忽略错误类型--假阳性假阴性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值