AUC计算公式推导AUC 计算公式推导基本公式推算基本排名的公式推算 2 详解如何计算 AUC 计算 AUC 时 推荐 2 个方法 方法一 在有 M 个正样本 N 个负样本的数据集里 一共有 MN 对样本 一对样本即 一个正样本与一个负样本 统计这 MN 对样本里 正样本的预测概率大于负样本的预测概率的个数 其中 这样说可能有点抽象 我举一个例子便能够明白 IDlabelproA0 1B00 4C10 35D10 8 假设有 4 条样本 2 个正样本 2 个负样本 那么
AUC计算公式推导
基本公式推算

基本排名的公式推算
2.详解如何计算AUC?
| ID |
label |
pro |
| A |
0 |
0.1 |
| B |
0 |
0.4 |
| C |
1 |
0.35 |
| D |
1 |
0.8 |
| ID |
label |
pro |
| A |
0 |
0.1 |
| B |
0 |
0.4 |
| C |
1 |
0.4 |
| D |
1 |
0.8 |
| ID |
label |
pro |
| A |
0 |
0.1 |
| B |
0 |
0.4 |
| C |
1 |
0.35 |
| D |
1 |
0.8 |
| ID |
label |
pro |
rank |
| A |
0 |
0.1 |
1 |
| C |
1 |
0.35 |
2 |
| B |
0 |
0.4 |
3 |
| D |
1 |
0.8 |
4 |
| ID |
label |
pro |
| A |
1 |
0.8 |
| B |
1 |
0.7 |
| C |
0 |
0.5 |
| D |
0 |
0.5 |
| E |
1 |
0.5 |
| F |
1 |
0.5 |
| G |
0 |
0.3 |
| ID |
label |
pro |
rank |
| G |
0 |
0.3 |
1 |
| F |
1 |
0.5 |
2 |
| E |
1 |
0.5 |
3 |
| D |
0 |
0.5 |
4 |
| C |
0 |
0.5 |
5 |
| B |
1 |
0.7 |
6 |
| A |
1 |
0.8 |
7 |
3.最后的最后,如何用程序验证?
import numpy as np from sklearn.metrics import roc_auc_score y_true = np.array([1, 1, 0, 0, 1, 1, 0]) y_scores = np.array([0.8, 0.7, 0.5, 0.5, 0.5, 0.5, 0.3]) print("y_true is ", y_true) print("y_scores is ", y_scores) print("AUC is", roc_auc_score(y_true, y_scores)) y_true = np.array([0, 0, 1, 1]) y_scores = np.array([0.1, 0.4, 0.35, 0.8]) print("y_true is ", y_true) print("y_scores is ", y_scores) print("AUC is ", roc_auc_score(y_true, y_scores))
模拟实际应用场景:
import pandas as pd import numpy as np def auc(df, label='label', predict='predict', prob=False): """ 功能:根据样本实际标签和预测概率(分数)快速计算auc值。 参数: df: pd.DataFrame,至少包含标签号预测结果列; label: 样本实际标签(0, 1); predict: 预测结果(分数或概率均可); prob: predict是否为概率,根据实际情况设置,默认False; 输出:auc值。 """ if prob: df.sort_values(by=predict, ascending=False, inplace=True) else: df.sort_values(by=predict, ascending=True, inplace=True) rank = list(reversed(range(1, df.shape[0] + 1))) df['rank'] = rank mean = df.groupby([predict])['rank'].mean().reset_index() mean.columns = [predict, 'rank_mean'] df = pd.merge(df, mean, on=predict) df[label].value_counts() N, M = df[label].value_counts().sort_index().values formula1 = df[df[label]==1]['rank'].sum() formula2 = M * (M + 1) / 2 return np.round((formula1 - formula2) / (M * N), 4) if __name__ == '__main__': np.random.seed(1234) score = np.round(np.random.normal(600, 100, ).reshape(-1, 1)) temp = np.random.uniform(0, 1, ).reshape(-1, 1) label = score * temp threshold = np.percentile(label, 10) label = np.array([1 if x < threshold else 0 for x in label]).reshape(-1, 1) data = np.concatenate((label, score), axis=1) df = pd.DataFrame(data=data, columns=['label', 'predict']) auc = auc(df=df, label='label', predict='predict') print('测试数据的auc:{}'.format(auc))
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/175781.html原文链接:https://javaforall.net