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

news/2024/12/23 8:35:00/

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 xlogyclass 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.0n_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 weightssample_weight *= np.exp(estimator_weight * ((sample_weight > 0) | (estimator_weight < 0)) * self._beta(y, y_predict))return sample_weight, 1.0, estimator_errordef _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 AdaCostClassfierdef 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、ydef 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的少数类returnif __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.ppmy.cn/news/4933.html

相关文章

【微服务】Nacos 如何做到⼀致性协议下沉的与自研 Distro 协议

目录 一、⼀致性协议下沉 1、⼀致性协议抽象 2、数据存储抽象 二、Nacos 自研 Distro 协议 1、背景 2、设计思想 2.1、数据初始化 2.2、数据校验 2.3、写操作 2.4、读操作 3、小结 一、⼀致性协议下沉 既然 Nacos 已经做到了将 AP、CP 协议下沉到了内核模块&#xff…

CentOS 8:Tomcat服务器

Tomcat 本身是一个 Java程序&#xff0c;必须要有 Java 的运行环境。 1 下载 Tomcat 8.5 apache-tomcat-8.5.54.tar.gz 2 上传到 CentOS, 以 root 身份执行 3 解压缩 tar -zxvf apache-tomcat-8.5.54.tar.gz mv apache-tomcat-8.5.54 /opt/tomcat8.5 4 运行 /opt/tomcat…

用 Java?试试国产框架 Solon v1.11.5(带视频)

一个更现代感的 Java 应用开发框架&#xff1a;更快、更小、更自由。没有 Spring&#xff0c;没有 Servlet&#xff0c;没有 JavaEE&#xff1b;独立的轻量生态。主框架仅 0.1 MB。 Controller public class App {public static void main(String[] args) {Solon.start(App.cl…

2023春招面试题:Java并发相关知识

1.基础知识回顾 1.1 什么是多线程&#xff1f; 在没有线程的年代&#xff0c;在同一个进程中&#xff0c;程序的处理流程都是顺序的&#xff0c;下一个流程的开始必须等待上 一个流程的结束&#xff0c;如果其中某一个流程非常耗时&#xff0c;那么会影响整个流程的处理时间…

1166 Summit

A summit (峰会) is a meeting of heads of state or government. Arranging the rest areas for the summit is not a simple job. The ideal arrangement of one area is to invite those heads so that everyone is a direct friend of everyone. Now given a set of tenta…

Docker镜像

镜像是一种轻量级、可执行的独立软件包&#xff0c;它包含运行某个软件所需的所有内容&#xff0c;我们把应用程序和配置依赖打包好形成一个可交付的运行环境(包括代码、运行时需要的库、环境变量和配置文件等)&#xff0c;这个打包好的运行环境就是image镜像文件。 只有通过这…

基于Android 的大学生理财系统

1.研究现状&#xff1a; 随着时代的发展&#xff0c;智能手机已经成为大学生日常学习生活中必不可少的一部分&#xff0c;在校大学生作为收入有限的消费群体&#xff0c;在当下多元化的日常消费中&#xff0c;大学生经常成为月光族甚至超支&#xff0c;理性消费健康生活显得尤为…

“空天地海”一体化的海上应急通信网络技术综述

【摘 要】随着航运业的不断发展,现有的海上应急通信技术资源分散,已经难以应对复杂的海上紧急情况。基于多通信平台融合,“空天地海”一体化的海上应急通信网络应运而生。介绍了海上应急通信研究背景、意义及发展现状,阐述了天基、空基、岸基、海基通信手段及其在海上应急…