代价敏感学习

摘要:
机器学习领域的检测和分类算法只关注如何获得最高精度(acc)。该行表示分类算法的预测类别。无论所使用的损失函数的形式如何,算法的预测误差由FP和FN表示。损失函数的推导优化对FP和FN没有偏差。分类算法涉及如何使FP+FN的值尽可能小。当分类算法进行FN判断和FP判断时,影响实际结果的因素是相同的。算法的分类结果应确保分类结果对银行造成的损失较小;

代价敏感学习是指为不同类别的样本提供不同的权重,从而让机器学习模型进行学习的一种方法。 在通常的学习任务中,所有样本的权重一般都是相等的,但是在某些特定的任务中也可以为样本设置不同的权重。比如风控或者入侵检测,这两类任务都具有严重的数据不平衡问题,例如风控模型,将一个坏用户分类为好用户所造成的损失远远大于将一个好用户分类来坏用户的损失,因此在这种情况下要尽量避免将坏用户分类为好用户,可以在算法学习的时候,为坏用户样本设置更高的学习权重,从而让算法更加专注于坏用户的分类情况,提高对坏用户样本分类的查全率,但是也会将很多好用户分类为坏用户,降低坏用户分类的查准率。

   

  1. 什么是代价敏感学习:

代价敏感学习是在原始标准代价损失函数的基础上,增加了一些约束和权重条件,使得最终代价的数值计算朝向一个特定的方向偏置(bias),而这个偏置就是具体业务场景更关注的部分

   

1.1 原始标准代价损失函数:

一般来说,机器学习领域的检测分类算法所关注的仅仅是如何得到最高的正确率(acc),以2-class分类为例,我们可以使用一个二维矩阵来描述分类算法的预测结果,如下图所示:

   

代价敏感学习第1张

   

表中的列表示实际数据所属类别,行表示分类算法的预测类别

   

不管使用了损失函数是何种形式,形式上,算法的预测错误的即是 FP 和 FN 两部分所表示,即:Loss = Loss(FP)+ Loss(FN)

   

从损失函数的通用数学公式角度来看,损失函数的求导优化对 FP 和 FN 是没有任何偏置的。分类算法所关心的是如何使得 FP+FN 的值尽可能的小,从而获得较高的分类准确率。对于 FP、FN 两部分各自在错误实例中所占的比重,传统损失函数并没有加以任何的考虑和限制。

   

换句话说,传统损失函数实际上是建立在下述假设的基础之上的:

   

在所有情况下,分类算法做出 FN 判断和做出 FP 判断对于实际结果的影响因子是完全相同的。所以我们可以不对两种误判所占的比例加以约束。

   

1.2 代价敏感损失函数

然而在现实世界中,这一假设往往是并不成立的,在实际的业务场景中,FN 和 FN 所带来的实际损失往往是不同的。一个被广为接受的上述假设的反例就是银行借贷问题。

   

  • 从机器学习算法的角度考虑,算法的分类结果应该使得错误分类率降到最低;

   

  • 而在实际应用中,算法的分类结果应该保证分类结果给银行造成的损失较小;

   

在实际情况中,银行做出 FP 判断(即没有将贷款贷给符合条件的申请人),所造成的损失要远小于其做出 FN 判断(即将贷款贷给不符合条件的申请人所造成的损失的)

   

如果我们用下图来描述银行做出不同决定所造成的不同的代价的的cost matrix:

代价敏感学习第2张

   

分类算法导致的实际损失等于:

   

Loss-real = FP * C01 + FN * C10

   

假设现在有两个分类已训练好的算法 A 和 B,对于 10 个贷款申请人进行分类。

   

我们令:

   

loss(FN)c10 = 10;

loss(FP)c01 = 1;

若 A/B 算法的分类结果为下图

代价敏感学习第3张

从数值计算的角度,A 算法的分类正确性要优于 B 算法:Acc(A)= 80% > Acc(B)= 60%

   

但是从实际业务场景角度,银行实际损失,A 算法的性能却不如 B 算法:Loss(A)= 20 > Loss(B)= 4

   

这就是 cost-sensitive 分类算法所关注和研究的问题。

   

1.3 代价敏感学习公式

利用 cost matrix,我们可以将 cost-sensitive 分类问题转化一个最优化问题,对于二分类分类算法来说只有2种判断结果,所以优化目标为让下式 L(x, i)达到最小值:

代价敏感学习第4张

  • 其中 x 是一个实例;
  • (x, i)表示将其分为 i 类;
  • P(j | x) 表示在算法 A 中获得的 x 属于类别 j 的后验概率,这个概率越小,反之 P(i | x) 就越大,这就是求对偶问题的反面;
  • c(i,j) 表示算法 A 将类别 i 的样本错判为类别 j 的实际损失(real-cost)

上述公式中,因为损失权重偏置因子c(i,j)的加入,使得我们的目标使得模型不再单纯关注如何获得 P(j|x)的最大值,而是要综合考虑预测结果P(j | x)以及不同预测结果造成的损失c(i,j)。这两个因子互相牵制。

   

1. Cost-sensitivecost的定义与表示

通常情况下,我们使用 cost matrix 描述待分类数据集上的 cost 信息。Cost matrix C 是一个N × N的矩阵,其中 N 代表待分类数据集中的类别的数量。

C 中的条目 c(i, j)表示分类算法将实际属于 j 类得到实例分为 i 类所造成的 cost。当 i = j 时代表分类算法正确预测了实例的类别,而i ≠ j的条目对应于不正确的分类结果。

在对 c(i, j)进行赋值的过程中,一般会遵循合理性原则:

  • 即错误分类的造成的 cost 肯定要大于正确分类造成的 cost
  • cost matrix 中的 c(i, j) = 0 , when i = j,而对于其他错误的分类结果对应的条目 c(i, j)我们赋其值为正数,用于表示其代价;
  • 而具体FNFP如何赋值,取决于具体业务场景。例如如果我们认为误报的损失大于漏报的损失,则赋值:cFN > cFP

   

2. Cost-sensitive损失权重因子对损失函数的影响

从宏观角度来看,代价损失权重因子c(i, j)可以理解为一种先验知识。加入损失权重因子c(i, j)后,目标函数L(xi)从最大似然估计转变为了最大后验估计。

笔者认为,cost sensitive的本质是"对不同的后验预测结果,的条件概率 P(y|x) 赋予不同的惩罚因子"

2-class 分类中,cost-sensitive 分类算法将实例 x 分为 1 类的条件是当且仅当将 x 分为 1 类所造成的预期 cost,不大于将 x 分为 0 类的损失。即

代价敏感学习第5张

当式子取等号时,这就是所谓的分类器最优决策面auc曲线本身)。可以看到,cost matrix的不同取值,影响了这个分类器最优决策面的位置,具体如何分析这种影响,我们文章的后面会继续深入讨论。

代价敏感损失的泛化讨论

笔者希望和大家一起更深入思考一下,代价敏感损失的本质是什么。

虽然大量的paper上都提出了cost-sensitive是对不同的predict result给予不同的损失因子,这是离散的范畴。但是笔者认为这个概念可以继续延展到连续无限的范畴,即对对数几率回归损失sigmoid)这种损失函数也同样起作用,sigmoid本质上也体现了cost sensitive的思想。

一个标准的sigmoid函数如下:

代价敏感学习第6张

sigmoid函数的输出代表了对发生几率的预测,目标y {10},即发生于不发生,而sigmoid的输出介于【01】之间。

从函数曲线上可以很容易看出:

  • 对于靠近【01】两侧的预测值,预测值和实际值的差值是比位于中间概率的差值要小的,因此这个区域中的1阶导数相对就较低,这进而导致了例如GD算法的最终损失较低;
  • 而位于【01】中间位置的地方,1阶导数相对较高,进而导致最终损失较高;

    通过这种函数特性,sigmoid函数会"驱使"模型将预测结果向靠近 0 或者靠近 1 的方向前进,或者说sigmoid函数不喜欢模糊地带,而偏置(bias)确定性的结果。

Cost-Sensitive的几何意义

如果我们画出ROC曲线,横轴和纵轴分别是 acc recall,可以现象,曲线是一个形如下图的曲线:

代价敏感学习第7张

损失函数的极值点就是最终的决策分界面ROC曲线"切线点"(图中的绿点)。

我们可以做一个直观的想象:cost() 函数起到的作用是"拉伸"原始的ROC曲线,使其向acc或者recall的方向拉伸,拉伸的结果会导致超分界面"提早" acc 或者 recall 方面相切。

  • 对误报的惩罚加大cost()FN的因子比例增大,则使roc曲线朝上图中 true positive rate 方向拉伸,即向上,则相切点会更靠下,最终的效果是获得更低的 true positive rate
  • 对漏报的惩罚加大cost()FP的因子比例增大,则使roc曲线朝上图中 false positive rate 方向拉伸,即向左,则相切点会更靠右,最终的效果是获得更低的 false positive rate

    以上的函数几何视角,启发我们一点:

    cost-sensitive Loss Function 的作用本质上是通过"拉伸"损失函数的函数形式,进而影响模型的最优决策面。对 acc recall 的不同权重因子,最终影响了 roc 曲线中向 acc recall 方向的偏离程度

    当然,cost-sensitive只是影响了模型最优决策面的位置,最优决策面并不是最终的决策函数。

    如果将auc函数看成是【xy】坐标系的话,不同的xy取值代表了最终决策不同的偏向,例如我们取x=0.1,即追求低误报,则相对的,y值肯定也低,即召回也低了。如果我们稍微放低一些对低误报的追求,则召回也能对应提高。在实际的tensorflow开发中,这通过对最终模型预测的pthreshold来实现。

    cost-sensitive在这里又扮演了什么角色呢?

    简单来说可以这么理解,在相同的threshold前提下,误报敏感损失函数会使得模型获得更低的误报,漏报敏感损失函数会使得模型会的更低的漏报。

    但是要始终牢记的是:最终的模型效果是两部分组成的,AUC函数的形式+认为设定的threshold决策策略

   

实现cost sensitive思想的不同方式

解决 cost-sensitive 分类问题的核心在于解决

代价敏感学习第8张

的优化问题,即如何使得分类算法的结果能够获得有倾向性的L值。 

目前,在如何获得有倾向性的分类算法这一问题上,目前有几种比较主流的方法:

1. Train set sample rescaling

通过有意调整,将训练数据集的正负例呈现不同数量比,以提高分类算法对于某些分类结果的敏感性。

例如如果想获得更高的acc,更低的误报,我们在训练集中,调整反例的数量是正例的数倍。相关的讨论,可以参阅另一篇blog

2. Class membership probability - cost matrix reweighted

通过修改不同分类在算法中的class membership probability,以获得具有一定数据倾向性的分类算法。这种算法被称为reweighted。这种方法也是本文主要讨论的。

代价敏感函数在不同机器学习算法中的应用

目前,分类决策树、神经网络、支持向量机(SVM)boosting等常用学习算法都有其对应的代价敏感扩展算法。

各个方法在具体形式上各不相同,但其核心思想是一致的,这里以AdaCost为例举例说明。

AdaCost 算法由 AdaBoost 分类算法改进而来,也是一种通过 reweighted 方式获取 cost-sensitive 分类算法的方法。

AdaCost 的基本思想是使用若干个较弱的分类器以投票方式集成出一个分类器,各个分类器的权值由评价函数调整确定。在 AdaBoost 算法中,评价函数仅和算法的分类准确性相关。W.Fan 等人在 AdaBoost 的评价函数中引入了 cost 的元素,使得分类算法能够有效降低分类结果的 cost 值。

具体来说 AdaCost 算法添加了一个评价分类结果的 cost 性能的函数βy × X × c → +,使得训练出来的弱分类器的权值集合能够符合 cost-sensitive 的要求。下面给出其伪码:

代价敏感学习第9张

Relevant Link:   

http://202.119.32.195/cache/4/03/lamda.nju.edu.cn/d2623fb33f624a2a05033bb5d0e23d45/qiny.pdf
http://lamda.nju.edu.cn/huangsj/dm11/files/qiny.pdf
https://homes.cs.washington.edu/~pedrod/papers/kdd99.pdf
https://cling.csd.uwo.ca/papers/cost_sensitive.pdf

   

2. 在贝叶斯Bayes最优决策理论下,代价敏感损失函数设计准则

上个章节中,我们谈到了一个词,"分类器最优决策面",这个东西是什么呢?这个章节我们来详细讨论。

贝叶斯最优决策理论

1. 贝叶斯最优分类(Bayes optimal classification)

对于二分类问题, 定义2级代价矩阵(cost matrix)

代价敏感学习第10张

,其中

代价敏感学习第11张

是将b类样本预测为a类样本的分类代价。

Bayes决策理论,最优决策的目标是最小化期望分类代价(最大后验概率估计),即给定样本x,若下式成立,则预测其类别为正;否则,预测其类别为负。

代价敏感学习第12张

,其中 p(x)为后验概率,p(x) = P(y = +1|x)1 − p(x) = P(y = −1|x)

上式的意思是:当,Loss(正例判对+负例误报为正例)<= Loss(正例漏报,负例判对)时,模型预测最终结果为正。

预测为正的代价预测为负的代价,预测结果为证。

将上式移项后可重写为:

代价敏感学习第13张

其中:

代价敏感学习第14张

表示正样本的分类代价;

代价敏感学习第15张

表示负样本的分类代价;

因此贝叶斯最优分类器输出的分类器函数为(这里不考虑人为设定的threshold决策函数):

代价敏感学习第16张

因此,Bayes分类器也可写作:

代价敏感学习第17张

sign,二值函数。当正负类别分类代价相等时,c+ = c−Bayes分类器退化为普通的无偏损失函数

代价敏感学习第18张

;而当c+c-存在不对称偏置时,Bayes分类器也成为有偏损失函数。

2. 贝叶斯决策错误理论上界

cost matrix本质上是改变了Bayes分类器的损失理论上界。

代价敏感损失设计准则(Design criterions of cost-sensitive loss)

1. 准则一

代价敏感损失函数

代价敏感学习第19张

需满足Bayes一致性,即单调性

新设计的代价敏感损失函数

代价敏感学习第20张

满足下述特性:

代价敏感学习第21张

2. 准则二

代价敏感学习第22张

对应的条件代价敏感风险

代价敏感学习第23张

代价敏感学习第24张

Bayes分类边界(分类器最优决策面)

代价敏感学习第25张

处取得最大值。

Bayes分类器的期望分类代价为:

代价敏感学习第26张

在分类边界

代价敏感学习第27张

处,将样本x判为正、负类别的分类代价相等并达到最大值

代价敏感学习第28张

,此时最难预测样本类别。 

Relevant Link:   

https://www.cnblogs.com/Determined22/p/6347778.html
http://jcta.cnjournals.com/cta_cn/ch/reader/view_abstract.aspx?doi=10.7641/CTA.2015.40519
https://www.bilibili.com/read/cv112928/
https://www.zhihu.com/question/27670909
《统计决策论及贝叶斯分析》- J.O.伯杰

   

3. 代价敏感损失函数的函数特性分析

这个章节,我们来真正进入代价敏感函数的内部原理,探究一下cost matrix是如何影响原始损失函数的形态,进而影响原始损失函数的性质的。

0x1:原始无偏损失函数函数性质

我们前面说过,当正负类别分类代价相等时,即c+ = c−Bayes分类器退化为普通的无偏损失函数

代价敏感学习第29张

;而当c+c-存在不对称偏置时,Bayes分类器也成为有偏损失函数。

所以这里先来看下我们熟悉的原始无偏损失函数的函数性质。

具体探讨以下损失函数:平方损失、指数损失、对数损失、SVM损失。这几种损失函数均可表示为间隔yF(x)的函数,

代价敏感学习第30张

,如下图所示:

代价敏感学习第31张

下标给出了各个损失函数对应最优决策函数

代价敏感学习第32张

及其条件风险

代价敏感学习第33张

代价敏感学习第34张

下图给出了各个损失函数的最优解和最优解处的条件风险:

代价敏感学习第35张

可以看到,在无偏损失情况下,

代价敏感学习第36张

与贝叶斯分类器

代价敏感学习第37张

等价,最优解处的条件风险与最小分类误差一致,即在p(x) = 1/2 处取得最大值。

这和我们的认识是一致的,怎么理解呢?简单来说可以这么理解。

如果我们使用逻辑斯蒂回归训练一个二分类器,那么我们可以设定预测的阈值p0.5,当>=0.5时,预测结果为正例,当<0.5时预测结果为负例。这是最优的阈值,任何偏离0.5的阈值p都会增加损失:

  • 决策阈值向0.5左偏:整体损失的增加主要来自误报增加。
  • 决策阈值向0.5右偏:整体损失的增加主要来自漏报增加,当然在某些情况下,漏报可能是我们可以接受的,因为这换取了一定的误报降低。

讨论完了原始的无偏损失函数,接下来我们要开始讨论有偏的代价损失函数,现有算法有以下两类常用分类代价引入策略:

1) 分类代价在损失函数外:cyL(yF(x))
2) 分类代价在损 函数内:L(ycyF(x))

   

分类代价在损失函数外(Classification cost outside of loss function)

这种类型的代价敏感损失将分类代价与原始损失相乘。

下表给出了各个代价敏感损失此时的最优决策

代价敏感学习第38张

和最优决策处的条件代价敏感风险

代价敏感学习第39张

代价敏感学习第40张

我们取c+ = 1.5c− = 0.5这种偏置组合,此时,Bayes分类器为

代价敏感学习第41张

绘制各个损失函数的最优解和最优解处的条件风险:

代价敏感学习第42张

可以看出,4种代价敏感损失均满足准则1,即最优分类器

代价敏感学习第43张

Bayes分类器。

另一方面,除代价敏感SVM损失外,其余损失均不满足准则2, 最优解处的条件代价敏感风险没有在Bayes分类边界

代价敏感学习第44张

处取得最大值,而是有不同程度的偏移。

分类代价在损失函数内(Classification cost inside of loss function)

这种类型的代价敏感损失将分类代价引入损失函数内部,将其与判决函数F相乘。

下表列出了各个代价敏感损失此时的最优决策

代价敏感学习第45张

和最优决策处的条件代价敏感风险

代价敏感学习第46张

   

代价敏感学习第47张

我们取c+ = 1.5c− = 0.5这种偏置组合,绘制各个损失函数的最优解和最优解处的条件风险:

代价敏感学习第48张

可看出,4种代价敏感损失均满足准则1和准则2,即最优分类器

代价敏感学习第49张

Bayes分类器,最优解处的条件代价敏感风险在Bayes分类边界

代价敏感学习第50张

处取得最大值。

这种损失偏置条件下,模型的漏报会倾向于低漏报。 

综上,虽然这4种损失函数代价敏感化之后并未都严格满足准则1/2,但是总体上,cost sensitive实际上扭曲了原始损失函数的函数曲线,使其发生了偏置。

Relevant Link:    

http://jcta.cnjournals.com/cta_cn/ch/reader/create_pdf.aspx?file_no=CCTA140519&flag=1&journal_id=cta_cn&year_id=2015

   

   

4. Keras中开发适合业务场景的代价敏感函数 

在具体工程项目中,因为TensorFlow/Keras并没提供原生的代价敏感函数,我们可以通过继承和重写原有的损失函数的方式,对原始的经典损失函数进行改造(函数内/函数外)

# 方式一
def vae_loss(x, x_decoded_mean):
xent_loss = objectives.binary_crossentropy(x, x_decoded_mean)
kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1)
return xent_loss + kl_loss

vae.compile(optimizer='rmsprop', loss=vae_loss)

Relevant Link:    

https://stackoverflow.com/questions/45961428/make-a-custom-loss-function-in-keras
https://blog.csdn.net/A_a_ron/article/details/79050204
https://blog.csdn.net/xiaojiajia007/article/details/73274669

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

   

免责声明:文章转载自《代价敏感学习》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇联想小新重装系统Linux磁盘设备文件(sda,sdb,sdc…)变化问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Java定时任务

");}}解释:task1是每隔5s执行一次,{秒}{分}{时}{日期}{月}{星期}task2是延迟1s,每隔1S执行一次2、配置文件修改简单版任务池版解释假如只有一个定时任务,可以用简单版;如果有多个定时任务,则要用任务池,不然它会顺序执行。两个任务的时间间隔为:执行时间+设定的定时间隔例子:@Scheduledpublicvoidtask2(){log...

PLSQL常用配置之窗口/版面保存、SQL格式化/美化、SQL注释去掉注释等快捷键配置、登陆历史修改配置

//Blog.csdn.net/eyeidolon/article/details/8251791 PLSQL常用配置的快捷键配置,如窗口/布局保存、SQL格式化/美化和SQL注释删除,以及登录历史修改1的配置。PL/SQLDeveloper记住登录密码当使用PL/SQLDeveloper时,默认情况下PL/SQLDeveloper会执行此窗口中的所有SQL...

xcode模拟器不显示键盘解决方案

当我们使用Xcode进行开发时,我们并不总是需要在iPhone上运行代码。有时模拟器可以解决这些问题。但当你使用模拟器时,你会发现,如果你使用模拟器上的键盘在TextFiled中输入信息,这是可以的,但如果你使用键盘输入信息,那么你会发现模拟器上的屏幕将不再显示。这是因为默认情况下,xcode使用计算机键盘作为外部键盘,不会弹出虚拟键盘。...

ESXi挂载NFS共享存储

使用万兆交换机,ESXi使用NFS协议连接存储。本文介绍的是通过NFS协议挂载共享存储上的VS01卷,共享存储上已经赋予ESXi主机访问该卷的权限。...

微信分享之分享图片/分享图标不能显示

微信分享的分享图标/图片无法显示,主要是由于以下几个问题:1.确保分享界面调用成功,分享路径正确。2.确保共享图片的路径不使用中文或全半角字符。3.确保副本不包含敏感字符,如红包和收据。当共享接口未能成功加载时,将发生错误。在页面的前面使用隐藏的div来放置要制作缩略图的图片。记住,不能直接隐藏图片。style=“display:noen”,如果没有,则使用...

硬中断与软中断的区别!

在多核系统上,一个中断通常只能中断一个CPU(也有一种特殊情况,即主机上有一个硬件通道。它可以在没有主CPU支持的情况下同时处理多个中断。软中断:1。软中断与硬中断非常相似。生成软中断的进程必须是当前正在运行的进程,因此它们不会中断CPU。...