AdaCost

2023-11-09

AdaCost算法

参考:《AdaCost Misclassification Cost-sensitive Boosting》

代价敏感:错分类的损失很大的样例。比如新冠肺炎本来是阳性但是被检测出阴性。

Cost-sensitive思想是一种符合实际应用的算法思想。在实际算法应用中,每种分类结果的错误分类代价是不一样的。同时,也可以延伸出每种分类结果正确分类的收益也是不一样的,所以基于此,需要对样本权重更新做一些额外的处理。

AdaCost对比AdaBoost

1. 目的

AdaBoost :最后结果偏向于容易错分类的样本

AdaCost :The final voted ensemble will also correctly predict more costly instances.(最后结果偏向于正确分类代价高的样例)

2. 权重更新规则

AdaBoost :At each round, AdaBoost increases the weights of wrongly classifified training instances and decreases those of correctly predicted instances(在每一epoch,AdaBoost增加错误分类的训练样本的权重,同时减少正确预测样本的权重)

AdaCost :In AdaCost, the weight updating rule increases the weights of costly wrong classifications more aggressively, but decreases the weights of costly correct classifications more conservatively(在 AdaCost 中,权重更新规则更激进地增加代价高昂的错误分类的权重,但更保守地降低代价高昂的正确分类的权重。通俗的说,对代价高昂的样本的奖励更少,但是惩罚更多)。

3. 权重初始化规则

AdaCost :代价更高的样本权重初始化一个更大的值

AdaBoost:等权重初始化或者标签数据量少的样本权重更大

AdaCost算法流程

在这里插入图片描述

算法流程中符号的含义:

S:样本空间 D:权重空间 beta:cost更新函数 H(x):生成的假设,预测结果

同时作者给出算法中的权重D更新的一种可替代计算方法:

在这里插入图片描述

详解AdaCost中的beta更新函数

本文章beta更新规则:we require β_(ci) to be non-decreasing with respect to ci, β+(ci) to be non-increasing, and both are non-negative.(预测为+1时,beta不增加;预测为-1时,beta不减小。而且beta是非负的值)。文章具体实验应用提到:We normalized each c_i to [0, 1] for all data sets. The cost adjustment function β is chosen as: β−© = 0.5 · c + 0.5 and β+© = −0.5 · c + 0.5.(其实beta函数的定义是根据实际问题来灵活定义的。但是总的思想一样:给代价高的样本更高的错误分类惩罚和更低的正确分类奖励)

其他两种beta更新规则:

Karakoulas and Shawe-Taylor: 如果y = +1 则 beta = 1; 如果y = -1 则 beta = v(v < 1)。

Ting and Zheng : 使用不同的错误损失,但是重复使用诱导模型。

(note:这两种更新规则在文章只是简单介绍。以后需要看原论文深入理解)

详解AdaCost中的alpha更新规则

For weak hypothesis h with range [-1,+1] and cost adjustment function β(i) in the range [0,+1], the choice of α is

在这里插入图片描述

AdaCost的算法实现

# -*- coding: utf-8 -*-
# @Use     : AdaCost 算法实现(快速实现,未调试)
# @Time    : 2022/5/30 22:30
# @FileName: adacost.py
# @Software: PyCharm

import numpy as np
from sklearn.preprocessing import MinMaxScaler


class AdaCost:
    """
    使用代价敏感的思想改进AdaBoost算法---AdaCost。,目前实现的是二分类
    """
    def __init__(self, T):
        """
        @param T: 训练迭代次数
        """
        self.T = T

    def fit(self, x: np.array, y: np.array, costs: np.array, create_model):
        """
        @param: train_x : 训练集
        @param: costs : x的代价
        @param: labels : 标签,目前标签是两类,输出假设是-1和1
        @param: model : 学习器模型
        """

        assert (x.shape[0] == costs.shape[0])
        assert (x.shape[0] == y.shape[0])
        sample_num = x.shape[0]
        T = self.T
        # initialize D(weights)
        weights = []
        betas = []
        cost_sum = np.sum(costs)
        for i in range(sample_num):
            weights.append(costs[i] / cost_sum)
        alpha_ts = []
        model_ts = []
        for t in range(T):
            # build model
            model = create_model()
            # train weak learner
            model.fit(x, y, weights=weights)
            # compute weak hypothesis
            h_t = model.predict_proba(x)[:, -1]
            # 论文要求h_t 是 [-1,1]
            h_t = MinMaxScaler(feature_range=[-1, 1]).fit_transform(h_t)
            model_ts.append(model)
            # update betas
            betas = []
            for i in range(sample_num):
                beta_i = self.update_beta(np.sign(y[i] * h_t[i]), costs[i])
                betas.append(beta_i)

            # alpha_t
            alpha_t = self.update_alpha(weights, y, h_t, betas)
            alpha_ts.append(alpha_t)
            Z_t = np.sum(weights)
            # update weights[]
            for i, weight in range(sample_num):
                weights[i] = weights[i] * np.exp(-alpha_t * y[i] * h_t[i] * betas[i]) / Z_t

        return model_ts, alpha_ts

    def predict(self, x, models, alpha_ts):
        """
        模型预测
        @param: x 测试数据
        @param: models: 模型
        @param: alpha_ts:alpha 数组值
        """
        # final hypothesis
        assert (len(models) == len(alpha_ts))
        T = self.T
        f_sum = 0
        for i in range(T):
            h_t = models[i].predict_proba(x)[:, -1]
            # 论文要求h_t 是 [-1,1]
            h_t = MinMaxScaler(feature_range=[-1, 1]).fit_transform(h_t)
            f_sum += alpha_ts[i] * h_t
        h_final = np.sign(f_sum)
        return h_final

    @staticmethod
    def update_beta(sign_value, cost):
        """
        更新beta
        we require  β_(ci) to be non-decreasing with respect to ci,
         β+(ci) to be non-increasing, and both are non-negative.
        """
        assert (sign_value == 1 or sign_value == -1)
        if sign_value == 1:
            beta = -0.5 * cost + 0.5
            return beta
        elif sign_value == -1:
            beta = 0.5 * cost + 0.5
            return beta

    @staticmethod
    def update_alpha(weights: list, y: np.array, h_t: np.array, betas: list):
        """
        更新alpha值。前提条件是要求:
        For weak hypothesis h with range [-1,+1] and
        cost adjustment function β(i) in the range [0,+1]
        """
        assert (len(weights) == y.shape[0] and
                len(weights) == h_t.shape[0] and
                len(weights) == len(betas))
        data_size = len(weights)
        r = 0
        for i in range(data_size):
            r += weights[i] * y[i] * h_t[i] * betas[i]
        alpha = 0.5 * np.log((1 + r) / (1 - r))
        return alpha

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AdaCost 的相关文章

随机推荐

  • mongodb显示:‘mongo‘不是内部或外部命令,也不是可运行的程序或批处理文件

    我们在安装完mongodb之后都需要去校验一下是否安装成功 一般都用 mongo 去查看我们的mongodb安装是否成功 正常情况是这样的 但是如果是出现 mongo 不是内部或外部命令 也不是可运行的程序或批处理文件 我们有两个方法去排查
  • 2023前端面试题及答案整理(Vue)

    watch 和 computed 区别 watch 是监听动作 computed 是计算属性 watch 没缓存 只要数据变化就执行 computed 有缓存 只在属性变化的时候才去计算 watch 可以执行异步操作 而 computed
  • 枚举子集复杂度 O(n^3) 证明

    困扰多年的问题 居然在学习离散数学后的一分钟内得到解决 形式化问题为 求满足 A B S A sube B sube S A B S 的有序对
  • 解读三大财务报表

    三张报表是一体化的报表 但在不同的报表里 概念之间有些差异 大家应该适应此情况 这是全球性的问题 三张报表实际上是站在两个不同的角度 实际上 两个体系 维度 描述了同样的经济活动 但它们各自描述经济活动的方式是不一样的
  • java 枚举数据字典_枚举值当数据字典使用

    public interface EnumType enum E TRANCALL AFTER SUBTRAN PROCESS AFTER SUBTRAN PROCESS afterSubtranProcess 子交易处理模板后 Commo
  • 磁盘使用率大于90% 磁盘inode使用率大于90%

    线上机器一直再报 磁盘使用率大于90 发现 var log 下边有个mail文件 很大就直接清理掉 gt mail 但是这个问题反复出现 感觉一个没有什么业务的机器怎么磁盘使用率那么大 就查了下mail日志文件的形成 ps 发现有好多sen
  • Tigase开发笔记6:packet流转机制 -> 一条消息(packet)的请求和响应过程解析

    初看Tigase的packet内部流转机制一开始不是太明白 里面用到了较多的线程 代码不太看得懂 慢慢的通过一条消息的请求和响应的代码跟踪分析 搞清楚了消息流转的过程 前言 本文使用Tigase Server version 7 0 2 进
  • [考研数学]概率论难点总结:样本标准差,样本均值,均值的期望和方差,与t分布、卡方分布和F分布的关系及推导

    首先需要清楚一件事情 样本均值为X拔 上面有个棍 样本的均值是讲从总体中抽样 这些样本的均值 而均值是指所有样本的真实均值 后面部分很好推导 将括号展开后 由三部分组成 中间的部分为2倍的样本和样本均值的乘积 将样本的和变成n倍的样本均值即
  • MVC ——RouteTable.Routes的使用

    public class RouteTable Fields private static RouteCollection instance new RouteCollection Properties public static Rout
  • ubuntu64位安装交叉编译器出现一些问题

    安装交叉编译工具时 因为交叉编译工具为32位的 而我的ubuntu51 10是64位的 使用交叉编译工具时会出错 一般是安装 apt get install lib32ncurses5 再有出错就去安装对应的库吧 如libstdc so 6
  • 50行代码,实现AI文章生成器,牛逼!

    本文共1502字 预计阅读时间 3分钟 据说 AI 已经可以自动写文章 类似的报道屡见不鲜 但是 AI 写出来的文章到底是什么样的 我想没几个人见识过 无意中看到了 Gayhub 上的这个项目 全称就是 狗屁不通文章生成器 英文名字是 Bu
  • mongovue 导入mysql_【mongo】用户添加、导入数据库、连接VUE

    添加用户 1 安装mongo时最好用apt get install 因为这样可以省去很多麻烦 比如一些环境变量 还有一些文档路径等等的问题 2 确认一下自己的mongodb和mongodb clients的版本 要版本一致才可以 查看mon
  • Linux 中power supply软件架构和相关API

    一 概述 电源管理整体上可以分为两个部分 一个是电池监控 fuel gauge 另外一个是充放电管理 这两部分在内核中也是分为两个驱动来管理 fuelgauge驱动的功能主要是负责向上层Android系统提供当前电池的电量和健康信息等等 同
  • React + MobX - 完全上手指南

    React MobX 完全上手指南 前言 正文 MobX 準備工作 MobX 基本使用 Store Action 組件中 MobX 生效 MobX Decorators MobX Decorators 準備工作 使用 MobX Decora
  • 超详细JDK1.8安装教程

    1 下载并安装 jdk 8u241 windows x64 JDK 8下载地址 https pan baidu com s 1 DN 5RL0mlURsN8dzYjqgw 提取码 rg5n 可自定义目录 之后配置环境变量会用到 一直下一步即
  • QThread使用方法

    QThread使用方法 昨天不小心看到Qt开发人员 Bradley T Hughes Blog中的一片文章 you are doing it wrong 结果看得头昏脑胀 好歹也自学了近1年的Qt 也一直很小心 很认真地阅读Qt和manua
  • Verilog中Case语句

    转自 https blog csdn net CLL caicai article details 104395480 实际问题中常常需要用到多分支选择 使用if语句导致内容繁琐 更明智的做法是使用case语句 case语句是一种多分支选择
  • 七牛云入门使用步骤(图片服务器使用)

    登入七牛云官网得到3个比较重要的参数 如图 1 sk 2 ak 3 测试域名 第一步导入七牛云sdk
  • 数据结构-查找(顺序查找与二分查找的讲解与代码实现)

    顺序查找概念 从表的另一端开始 一次将记录的关键字和给定值进行比较 若某个记录的关键字和给定的值相等 则查找成功 反之则查找失败 ASL 平均查找长度 pi查找概率 ci查找次数 eg 序列1 2 3 查找1的次数为1概率为1 3 2为两次
  • AdaCost

    AdaCost算法 参考 AdaCost Misclassification Cost sensitive Boosting 代价敏感 错分类的损失很大的样例 比如新冠肺炎本来是阳性但是被检测出阴性 Cost sensitive思想是一种符