AUC:计算正样本预测得分大于负样本预测得分的概率。
-
ROC曲线面积(传统算法)
-
公式法(常用)
我们给每一个样本赋一个排序值,第一位 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}")