百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

欺诈检测中的两种基本方法,孰轻孰重

toyiye 2024-06-21 12:07 10 浏览 0 评论

全文共3560字,预计学习时长20分钟或更长


在传统的二分类分类问题中,我们的目的是尽量减少误分类,并用准确率、F度量或AUC-ROC曲线等统计量来衡量模型的性能。然而在某些问题中,为了降低总代价最好容许更多的误分类。如果误分类产生的代价因样本而异,我们应该采取基于实例的代价敏感学习方法。

在本文中,我们将根据信用卡欺诈数据集对各种模型进行训练和测试来解释基于实例的代价敏感机器学习的概念。请注意,我们为此任务选择的模型是为了解释其概念,而不是获得最佳预测结果。本文提供了代码片段,完整的代码可在GitHub上找到。

什么是代价敏感学习?

传统分类模型假定所有的误分类具有相同的代价,而代价敏感模型认为不同分类模型间和不同样本间的代价都不同。

可以看看信用卡交易的案例。未经持卡人授权的交易被视为欺诈性交易(通常在所有交易中占很小的一部分)。信用卡欺诈检测系统应自动识别和阻止此类欺诈交易,与此同时不要阻止合法交易。

每种分类问题的相关代价是多少?让我们假设以下场景:系统没有识别到欺诈交易,钱款丢失,持卡人需要偿还所有交易金额。如果系统检测到欺诈交易,这笔交易就会被阻止。在这种情况下,因为需要联系持卡人更换信用卡(若确实是欺诈交易)或者重新激活信用卡(若实际上是合法交易),所以会产生管理代价。还可以做个简单假设,即管理代价总是一致的。如果系统将一笔交易标记为合法,系统会自动批准这笔交易,不会产生任何代价。下面是每一种预测方案的相关代价:



请注意“正”表示被预测为欺诈的交易,“负”表示被预测为合法的交易。“真”和“假”分别代表预测正确与否。

因为交易代价取决于样本,预测错误的合法交易代价非常低(比如每笔交易代价为0.1美元),而欺诈交易的管理代价会超过赔偿代价,甚至还要高(比如每笔交易代价为10000美元)

代价敏感学习的核心是将这些基于实例的代价考虑在内,再做出预测,尽量降低总代价而不是降低误分类。

代价敏感训练和基于代价分类


来考虑一下以下两种方法。第一种是用损失函数训练模型,降低实际代价(以美元计算)而不是误分类。在这种情况下,需要为损失函数提供四种情形下(假正类、假负类、真正类和真负类)的代价数据,以便模型可以学会相应地做出最佳预测。



第二种是训练一种常规模型,但是在根据最低的预期代价进行预测时,对每个样本进行分类。在这种情况下,训练集不需要付出代价。然而,这一方法只适用于预测概率的模型,这一模型常用于计算预期代价。



接下来参考两种模型——运用代价敏感损失函数的模型和预测时会降低预计代价的模型,即“代价敏感模型”和“代价分类模型”。

实现和评估模型


这个案例分析使用了一个信用卡欺诈数据集(这一数据集可以在Kaggle上找到),共有284000个样本和30个特征。合法交易目标变量为0,欺诈交易目标变量为1。数据极不平衡,只有0.17%的欺诈交易。我们训练评估了下面五种模型。

1. 常规逻辑回归模型(Scikit-learn)

2. 常规人工神经网络模型(Keras)

3. 代价敏感人工神经网络模型(Keras)

4. 代价分类逻辑回归模型

5. 代价分类人工神经网络模型

在实践中,人工神经网络模型可能不是欺诈检测的首选。随机森林和GBM这些基于决策树的模型具有可解释性的优点,常常表现得更好。之所以运用人工神经网络模型解释是因为它相对简单地实现了一个代价敏感的损失函数。此外,如下所示,一个简单的人工神经网络模型能产生相当强大的结果。

为了评估结果,我们采用了两种不同的统计量。第一种是传统的F1-score,强调精确率和召回率,但并不考虑误分类所产生的代价。



为了从代价的角度评估模型的性能,首先根据模型预测出的假正类、假负类、真正类和真负类这四种情况,以及与每种情况相关的代价,计算预测产生的总代价。



然后,计算如果所有结果都为负类(即代价最大时),所产出的总代价是多少,并将成本节约定义为实际预测中降低代价的分数。



为了评估模型,本文用了5倍交叉验证,并将数据分为5种不同的训练集(80%)和测试集(20%)。后续部分呈现出的结果是指五个测试集的平均结果。

逻辑回归模型

基础模型来自Sklearn库中的常规逻辑回归模型。下图是预测概率和交易金额两者的分布图。如果没有代价敏感分类,欺诈概率和交易金额之间就没有明显的关联。



逻辑回归模型下平均测试集表现相当好,F1-score为0.73,成本节约为0.48。





人工神经网络模型

接下来,在Keras构建一个具有三个完全连接层(50、25和15个神经元)和两个dropout层的人工神经网络模型。两个时期的模型用了50个神经元。使用Keras的顺序模型API,其在python中的实现如下所示:

from keras.modelsimport Sequential
from keras.layers import Dense, Dropout
defann(indput_dim, dropout=0.2):
model = Sequential([
Dense(units=50, input_dim=indput_dim,activation='relu'),
Dropout(dropout),
Dense(units=25, activation='relu'),
Dropout(dropout),
Dense(15, activation='relu'),
Dense(1, activation='sigmoid')])
return model
clf =ann(indput_dim=X_train.shape[1], dropout=0.2)
clf.compile(optimizer='adam', loss='binary_crossentropy')
clf.fit(X_train, y_train, batch_size=50, epochs=2, verbose=1)
clf.predict(X_test, verbose=1)


下面是人工神经网络模型下预测的欺诈概率分布图。与逻辑回归模型相似,欺诈概率与交易金额之间没有明显的关系。




在F1-score和成本节约方面,人工神经网络模型优于逻辑回归模型。





代价敏感人工神经网络模型

情况变得有趣起来了。代价敏感人工神经网络模型与常规人工神经网络模型相似,在代价敏感损失函数方面略有不同。之前的两个模型都使用对数损失(“二元交叉熵”)作为损失函数:




这个损失函数同样惩罚假负类和假正类。现在让我们来看看代价敏感损失函数。所有四种可能的结果(假正类、假负类、真正类和真负类)都纳入了考虑范围,每个结果都有一个特定的代价。代价敏感损失函数如下:




请记住,通过第一部分得知,真正类和假正类所产生的代价都很昂贵(阻止一笔交易所产生的固定管理代价)。真负类没有产生代价(无交易行为),假负类的代价是交易金额(假定我们必须偿还所有金额)。请注意,这四种结果所产生的代价,只有假负类的代价是基于实例的。这样的话,交易金额越高,未识别出的欺诈交易的惩罚越高,正预测产生的管理代价也随之增加。因此,损失函数应该训练一种模型,提高其在交易金额偏高时阻拦可疑交易的可能性。交易金额从0美元到25691美元不等,平均为88美元,假设固定管理代价为3美元。

我们在Python中分别预测了假正类、假负类、真正类和真负类的代价。由于假负类的代价取决于实际情况,因此它们用与样本数相同的长度向量表示。

cost_FP = 3
cost_FN = data['Amount']
cost_TP = 3
cost_TN = 0


在Keras中实现一个基于实例的损失函数是很困难的,因为Keras不允许将除了y_true和y_pred以外的参数传递给损失函数。通过将损失函数包装到另一个函数中,可以将常变量传递给损失函数。然而,假负类的代价取决于实例。因此,本文使用的技巧是,将假负类的代价作为数字添加到y_true的逗号后,并在自定义损失函数中提取它们,同时将y_true四舍五入为原始整数值。在Keras中,转换y_true的函数和自定义损失函数的实现如下所示:

importkeras.backend as K
defcreate_y_input(y_train, c_FN):
y_str =pd.Series(y_train).reset_index(drop=True).\
apply(lambda x: str(int(x)))
c_FN_str = pd.Series(c_FN).reset_index(drop=True).\
apply(lambda x:'0'*(5-len(str(int(x)))) + str(int(x))
return y_str + '.' + c_FN_str
defcustom_loss(c_FP, c_TP, c_TN):
def loss_function(y_input, y_pred):
y_true = K.round(y_input)
c_FN = (y_input - y_true) * 1e5
cost = y_true * K.log(y_pred) *c_FN +
y_true * K.log(1 - y_pred)* c_TP) +
(1 - y_true) * K.log(1 -y_pred) * c_FP +
(1 - y_true) *K.log(y_pred) * c_TN)
return - K.mean(cost, axis=-1)
return loss_function


然后用定义函数来创建y_input向量,训练代价敏感的人工神经网络模型并进行预测:

y_input =create_y_input(y_train, cost_FN_train).apply(float)
clf = ann(indput_dim=X_train.shape[1], dropout=0.2)
clf.compile(optimizer='adam', loss=custom_loss(cost_FP, cost_TP,
cost_TN))
clf.fit(X_train, y_input, batch_size=50, epochs=2, verbose=1)
clf.predict(X_test, verbose=1)


通过下面的分布图,可以看到代价敏感学习的效果。随着交易金额的增加,预测结果总体向右扩展(欺诈概率更高)。请注意,在这种情况下,由于问题的性质和损失函数的定义,“预测欺诈概率”是指“我们要把这笔交易认定为欺诈交易吗?”而不是“这笔交易是欺诈交易吗?”




评估结果显示了代价敏感学习的预期效果。成本节约增加了5%,F1-score也降低了类似的幅度。代价敏感分类的结果是误分类的数量越多,误分类的总成本越低。







代价分类模型

与具有自定义损失函数的代价敏感模型不同,代价分类模型根据预测概率计算预期成本。预测合法和欺诈交易的预期代价计算如下:




然后分类器会选择产生最低预期代价的预测结果。

因此,本文使用了常规逻辑回归模型和人工神经网络模型来得到概率预测结果,并根据预期成本对预测进行了重新分类。下图显示了逻辑回归模型下代价相关分类的效果。预测概率的分布没有因为常规逻辑回归模型的分布而改变。然而,对于代价相关的分类,随着交易金额的增加,该模型倾向于将欺诈概率较小的交易识别为欺诈性交易。在图的右侧,我们看到,即使欺诈概率接近1,金额非常小的交易也会被预测为合法交易。因为根据假定,真正类产生的管理代价为3美元。




根据预期成本对预测进行分类,可在成本节约方面获得更好的结果(而根据F1-score进行分类,结果明显较差)。在人工神经网络模型下实现代价敏感损失函数的同时,代价分类人工神经网络模型能够将成本降低10%。






结论


本文阐述了两种基于信用卡欺诈预测的代价敏感分类的基本方法。

代价敏感训练模型需要自定义损失函数,而代价分类模型只需要每一类的概率和每一结果产生的代价来对交易进行分类。在样例中,代价分类模型以大量误分类为代价,实现了较好的成本节约。此外,代价分类模型更容易实现,因为它不需要训练自定义损失函数。但是代价分类方法只适用于预测概率的模型,正好逻辑回归模型和人工神经网络模型很适合预测概率。然而,欺诈检测中广泛采用基于决策树的模型,通常将预测结果直接分为不同类,使得代价分类方法行不通。基于决策树模型的代价敏感方法在概念上与本文中介绍的方法相似,其实现更为复杂。

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码