【机器学习实战】基于代价敏感学习的AdaCost方法用于信用卡欺诈检测

news2024/11/23 3:48:07

1. 数据集

  1. 数据集地址:Credit Card Fraud Detection
  2. 数据集整体浏览:
    在这里插入图片描述
  • 284807个样本,30个特征,1个分类标签Class
    在这里插入图片描述
  • Class为0的是多数类,一共有284315个样本。
    在这里插入图片描述
  • Class为1的是少数类,一共有492个样本,可见数据集是不平衡的。

2. 对Adaboost的代码进行修改,构造代价调整函数,并对数据集进行分类

  1. 代码结构:
    在这里插入图片描述
  2. adacost.py
import numpy as np
from sklearn.ensemble import  AdaBoostClassifier
from scipy.special import xlogy

class AdaCostClassfier(AdaBoostClassifier):
    def _boost_real(self, iboost, X, y, sample_weight, random_state):
        '''
        权重更新的公式在这里
        '''
        estimator = self._make_estimator(random_state=random_state)
        estimator.fit(X, y, sample_weight=sample_weight)

        y_predict_proba = estimator.predict_proba(X)

        if iboost == 0:
            self.classes_ = getattr(estimator, 'classes_', None) # 获取estimator的classes_属性值
            self.n_classes_ = len(self.classes_)

        y_predict = self.classes_.take(np.argmax(y_predict_proba, axis=1), axis=0)

        # 分类不正确的实例
        incorrect = y_predict != y

        # 误差分数
        estimator_error = np.mean(np.average(incorrect, weights=sample_weight, axis=0))

        # 如果分类器完美,那么就停止
        if estimator_error <= 0:
            return sample_weight, 1.0, 0.0

        n_classes = self.n_classes_
        classes = self.classes_
        y_codes = np.array([-1.0 / (n_classes - 1), 1.0])
        y_coding = y_codes.take(classes == y[:, np.newaxis])

        proba = y_predict_proba  # 别名
        np.clip(proba, np.finfo(proba.dtype).eps, None, out=proba)

        estimator_weight = (
            -1.0
            * self.learning_rate
            * ((n_classes - 1.0) / n_classes)
            * xlogy(y_coding, y_predict_proba).sum(axis=1)
        )

        # 在此处更新,增加代价敏感系数
        if not iboost == self.n_estimators - 1:
            # Only boost positive weights
            sample_weight *= np.exp(
                estimator_weight * ((sample_weight > 0) | (estimator_weight < 0)) * self._beta(y, y_predict)
            )

        return sample_weight, 1.0, estimator_error

    def _beta(self, y, y_hat):
        '''
        代价调整函数
        '''
        res = []
        for i in zip(y, y_hat):
            if i[0] == i[1]:
                res.append(1) # 正确分类,系数保持不变
            elif i[0] == 1 and i[1] == -1:
                res.append(1.25) # 将正类(好人)判断为负类(坏人)代价更大,系数增大
            elif i[0] == -1 and i[1] == 1:
                res.append(1) # 将负类(坏人)判断为正类(好人)代价不变,系数保持不变
            else:
                print(i[0], i[1])

        return np.array(res)


  1. AdaCost用于信用卡欺诈分类预测(与Adaboost对比).py
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import recall_score, precision_score, f1_score
from sklearn.ensemble import AdaBoostClassifier
from adacost import AdaCostClassfier

def load_creditcard_data():
    '''
    读取数据集,并讲正例标记为1,讲负例标记为-1
    '''
    df = pd.read_csv('C:\\work-file\\pythonProject\\Demo练习\\Datasets\\creditcard.csv')
    df.loc[df.Class == 1, 'Class'] = -1 # 少数类
    df.loc[df.Class == 0, 'Class'] = 1 # 多数类
    print(df.shape) # 总样本数
    print(df.Class.value_counts()) # 正例、负例的数量
    return df.drop('Class', axis=1), df['Class'] # 返回X、y

def clf_compare(clfs):
    '''
    比较不同分类器的结果
    '''
    for clf in clfs:
        y_pred = clf.predict(X_test)
        print(pd.Series(y_pred).value_counts())
        print(recall_score(y_test, y_pred, pos_label=-1),
              precision_score(y_test, y_pred, pos_label=-1),
              f1_score(y_test, y_pred, pos_label=-1), '\n') # 更关注-1的少数类
    return

if __name__ == '__main__':
    X, y = load_creditcard_data()
    # 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
    print(pd.Series(y_test).value_counts()) # 测试集中正例、负例的个数统计

    ada_clf = AdaBoostClassifier(n_estimators=100)
    ada_clf.fit(X_train, y_train)

    adacost_clf = AdaCostClassfier(n_estimators=100)
    adacost_clf.fit(X_train, y_train)

    clf_compare([ada_clf, adacost_clf])

3. 结果分析

3.1 评价指标

  1. 查全率 R 又称之为召回率,是少数类样本被模型成功预测到的几率,体现了
    机器学习模型对少数类的预测能力。查全率的取值区间为[0, 1],查全率越大,说
    明模型越能有效地识别出少数类的存在。
  2. 查准率 P 又称之为精确率,定义为被模型预测为少数类样本之中真实的少
    数类样本所占的比例,反映了模型预测出的少数类样本的可信程度。精确率的取
    值区间为[0, 1],精确率越大,说明被模型预测为少数类样本的可信度越高。
  3. F1 值被定义为查准率和查全率的调和均值,综合考虑两个指标的作用。
    在这里插入图片描述

3.2 结果

β=1.25的结果
在这里插入图片描述
在这里插入图片描述

4. 参考

  1. 减少信用卡欺诈识别误杀:实现基于代价敏感的AdaCost算法
  2. machine-learning - f1_score 中的 pos_label 到底是什么意思?
  3. 代价敏感学习

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/101680.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

写给Python社群的第11课:Python线程,进程,协程,3个毫无关系的兄弟

文章目录⛳️ 线程、进程与协程&#x1f525; 进程与线程简介⛳️ Python 多线程模块&#x1f525; threading 模块&#x1f525; threading 模块实践⛳️ Python 并发进程模块&#x1f525; Process 创建多进程⛳️ 线程、进程与协程 线程、进程、协程 这三个名称相似的概念&…

大话设计模型 Task03:工厂、制造、观察

目录一、建造者模式问题描述问题分析模式定义代码实现二、观察者模式问题描述问题分析模式定义代码实现一、建造者模式 问题描述 我的要求是你用程序画一个小人&#xff0c;这在游戏程序里非常常见&#xff0c;现在简单一点&#xff0c;要求是小人要有头、身体、两手、两脚就可…

左偏树原理详解

一 点睛 左偏树&#xff08;leftist tree 或 leftist heap&#xff09;也叫作左偏堆、左倾堆、左式堆&#xff0c;是计算机科学中的一种树&#xff0c;也是一种优先队列实现方式&#xff0c;属于可并堆&#xff0c;在信息学中十分常见&#xff0c;在统计、最值、模拟、贪心等类…

Win11安装WSL2和Nvidia驱动(2022-12-19)

文章目录前言系统环境WSL 1和WSL 2功能对比安装WSL2更新和升级包配置VSCode配置GPU加速安装Nvidia驱动安装Cuda Toolkit通过PyTorch安装CUDA Toolkit测试Nvcc参考链接前言 以前捣鼓过wsl&#xff0c;即Windows下的Linux子系统&#xff0c;但兼容性依然比不过原生的Linux系统&a…

【Linux】进程间通信之管道

目录&#x1f308;前言&#x1f338;1、IPC介绍&#x1f362;1.1、进程间通信的目的&#x1f361;1.2、背景和发展&#x1f360;1.3、进程间通信的分类&#x1f337;2、管道&#x1f361;2.1、概念&#x1f362;2.2、管道的原理&#x1f363;2.3、匿名管道&#x1f364;2.4、管…

DOM算法系列004-判断给定节点是否为body元素

UID: 20221218221939 aliases: tags: source: cssclass: created: 2022-12-18 如果我们要判定给定的一个节点是不是页面body与元素节点&#xff0c;该如何判断呢&#xff1f; 一般来说&#xff0c; 一个HTML页面内只有一个body元素 但是&#xff0c;如果我们非要在页面内写超过…

Spring boot 整合 redis

Spring boot 整合 redis一、Spring boot 整合redis1.1 启动redis1.2 redis desktop manager1.3 常用命令二、操作2.1 依赖包2.2 配置2.3 简单测试2.4 StringRedisTemplate一、Spring boot 整合redis 1.1 启动redis 命令行启动 redis-server redis-cli1.2 redis desktop mana…

基于electronbot作品bootLoader设计

文章目录 前言 一、芯片程序区规划和流程 1、flash区规划 2、两区运行流程 3、bootLoader代码体现 4、electronbot代码体现&#xff1a; 二、bootLoader代码设计 1.下载程序步骤 2.通讯协议格式 三、libusb开发及需要注意的事情 1、bootLoader复合设备 2、electronbot复合设备…

基础算法系列--[基本数据结构KMP]

文章目录前言链表单链表双链表栈和队列栈队列单调KMP前言 今天要搞的是基本的一些数据结构&#xff0c;当然咱们这个不是那么“正经”。当然今天也没啥代码&#xff0c;因为太简单了&#xff08;其实我也想水一下~&#xff09; 链表 单链表 单链表这个东西&#xff0c;应该…

Prometheus+Grafana

K8S prometheusK8S1.Prometheus&#xff08;普罗米修斯&#xff09;2.Prometheus可以做什么3.Prometheus的特点4.prometheus 相关组件二、prometheus与zabbix的区别zabbix架构区别三、prometheus架构分析1.TSDB2.时间序列数据库的特点3.prometheus 相关组件1.prometheus 核心组…

【计算机网络】实验五 网络层与链路层协议分析(PacketTracer)

一、实验目的 通过本实验&#xff0c;进一步熟悉PacketTracer的使用&#xff0c;学习路由器与交换机的基本配置&#xff0c;加深对网络层与链路层协议的理解。 二、实验内容&#xff1a; 4.1 路由器交换机的基本配置 打开下面的实验文件&#xff0c;按提示完成实验。 4.2…

直流微电网中潮流(Matlab代码实现)

目录 1 概述 1.1 直流电网中的潮流 1.2 创新点和相关工作 1.3 本文结构 2 数学/网络模型 2.1 主-从操作 2.2 孤岛运行 3 牛顿法 4 案例及Matlab代码实现 1 概述 潮流是一个非线性问题&#xff0c;需要用牛顿法求解具有恒定功率端子的直流微电网。本文提出了牛顿法在…

曙光来临!Nature终于发现了新冠特效药?或将彻底终结新冠时代!

百趣代谢组学文献分享&#xff1a;2022年即将过去&#xff0c;随着疫苗的全面接种和三年以来“动态清零”的坚持&#xff0c;我们在应对新冠病毒如潮水般的攻击中取得了阶段性成果。虽然大家陆陆续续投入到正常的工作生活中&#xff0c;但是我们都知道新冠并未被“打败”&#…

MySQL中这14个有用的小知识,快学起来吧

前言 我最近用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

如何在产品开发中讨论概念设计?

每当你看到一辆在路上行驶的汽车、书桌上的笔记本电脑、工业包装生产线、医院设备、家用仪器和其他形式的概念设计创意产品会感到难以置信&#xff0c;这就是我们在产品开发中讨论概念设计的原因。 概念设计是一个尚未解决或到目前为止尚未令人满意的问题。这是一个深思熟虑的解…

研究区域制图 | 在 ArcGIS Pro中创建地图布局

研究区域制图 | 在 ArcGIS Pro中创建地图布局 数据准备 首先需要两个图层&#xff0c;一个是市区图层&#xff0c;一个是省行政区划图层&#xff0c;我这里以吉林省以及吉林省长春市为例 新建布局 选择横向A5即可 添加参考线 不知道你们知不知道这个功能&#xff0c;反正小…

kotlin协程笔记:Dispatchers

Kotlin 的 launch 会调用 startCoroutineCancellable()&#xff0c;接着又会调用 createCoroutineUnintercepted()&#xff0c;最终会调用编译器帮我们生成 SuspendLambda 实现类当中的 create() 方法。 public fun CoroutineScope.launch(context: CoroutineContext EmptyC…

【JVM】本地方法栈与堆与方法区

文章目录1. 本地方法栈2. 堆3. 方法区1. 本地方法栈 本地方法栈和虚拟机栈有点类似&#xff0c;均具有线程隔离的特点以及都能抛出StackOverflowError和OutOfMemoryError异常。 但是不同之处在于本地方法栈服务的对象是JVM执行的native方法&#xff0c;而虚拟机栈服务的是JVM…

[附源码]Nodejs计算机毕业设计教师职称评定系统Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

免费提供POSMV的GNSS数据解算服务,验潮仪丢失的一种补救

前两天有个网友问干活的区域附近是否有长期验潮站&#xff0c;因为他的临时验潮仪丢失了&#xff0c;随后问了一下搞水文的同事&#xff0c;他推了一个网址&#xff1a; http://publictide.nmdis.org.cn/tide?SiteGroup3&TideType0&#xff0c;中文名叫&#xff1a;潮汐潮…