首页 > 编程语言 > 详细

【推荐算法】AUC的计算方法

时间:2021-08-03 10:16:24      阅读:18      评论:0      收藏:0      [点我收藏+]

先发代码,其他的过会儿再补。

面积法

double get_auc(vector<double>& prob, vector<int>& label) {
    int n = label.size(), pos = 0;
    vector<pair<double, int>> pl;
    for (int i = 0; i < n; i++) {
        pos += label[i];
        pl.emplace_back(prob[i], label[i]);
    }
    sort(pl.begin(), pl.end());
    double pos_sum = 0;
    for (int left = 0, right = 0; right < n; left = right) {
        double sum = 0, cnt = 0;
        while (right < n && pl[right].first == pl[left].first) {
            cnt += pl[right++].second;
            sum += right + 1;
        }
        pos_sum += sum * cnt / (right - left);
    }
    return (pos_sum - (pos * (pos + 1) / 2)) / (pos * (n - pos));
}

定义法

double get_auc(vector<double>& prob, vector<int>& label) {
    int n = label.size(), pos = 0;
    vector<pair<double, int>> pl;
    for (int i = 0; i < n; i++) {
        pos += label[i];
        pl.emplace_back(prob[i], label[i]);
    }
    sort(pl.begin(), pl.end(), [&](auto a, auto b){return a.first > b.first;});
    double auc = 0;
    for (int left = 0, right = 0, pre_tp = 0; right < n; left = right) {
        int delta_fp = 0, delta_tp = 0;
        while (right < n && pl[right].first == pl[left].first)
            pl[right++].second ? delta_tp++ : delta_fp++;
        auc += (2 * pre_tp + delta_tp) * delta_fp / 2.;
        pre_tp += delta_tp;
    }
    return auc / (pos * (n - pos));
}

【推荐算法】AUC的计算方法

原文:https://www.cnblogs.com/tmpUser/p/15092467.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!