在传统的二分类分类问题中,我们的目的是尽量减少误分类,并用准确率、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垂类自媒体 “读芯术”