本分析基于GBDT系的算法和个人信用模型
1. 样本不均衡(标签不均衡)
1.1 问题描述
假设x∈Rn,y∈{0,1}。所谓样本,就是在特征空间Rn中分布着一堆0和1。所谓样本不均衡,就是整体上来说0或1其中一类占了绝大多数,比如98%。
假设特征有效,正负样本在特征空间里的分布是有差别的,比如有的空间区域正负样本比例是1:10,而有的区域正负样本比例是1:1000000,即特征对于样本预测仍然有效,而模型尝试学习的就是这个映射关系。
样本不均衡没有特别直接的问题,但一般会导致1. 模型预测值集中在其中一端(如大部分样本是负样本,则模型预测值总集中在0附近)2. 树类模型进行空间划分的时候,更容易触达超参限定条件
1.2 解决方案及分析
解决方案一:带权损失函数。正样本太少,则相应的把正样本的带来的损失加倍,使模型学习过程中更加重视正样本,从而达到把预测值拉开的目的。
解决方案二:平衡采样。把样本喂入模型进行学习时,不按原始的正负样本比例,而是按设定比例如1:1采集batch。
两种方案本质上都已经扭曲了真实分布。人为调整了正负样本的真实比例,是一种整体性的“标签入模”。具体来说,人为提高模型学习过程中的正样本比例,会导致学到的模型做预测时,整体往1靠拢。
这种扭曲导致的结果是,模型预测值已经无法回归到真实的概率值,因此训完模型时需要进一步做odds映射。
但这种扭曲不会影响模型的排序功能。举例来说:在正负样本1:10的特征空间区域,真实概率值是约0.1,由于人为拉高了正样本占比,模型的预测值可能是0.9。而在正负样本1:10000的区域,真实概率值是0.0001,而模型预测值可能是0.2。0.9已经偏离了0.1,0.2也已经偏离了0.0001,但0.9仍然是大于0.2的。这就是所谓的排序功能不受影响。
因此,假设我们对模型的期望是做有效排序,平衡采样没什么问题。
2. 特征不均衡
2.1 特征不均衡
举例:蚂蚁借呗、微粒贷等产品,希望获知用户面对不同的利率的转化程度。针对一个用户,我们有他的一系列信息(用户个人特征),我们希望有一个模型,能够预测这个用户在5%~25%的利率下来借款的概率分别是多少,把这个概率称为“用户转化概率”。
目前平台已经有很多历史用户,这些用户面临着平台给他提供的各种各样的利率(平台提供的权益类特征),他们最终也选择了借款或者不借款(标签)。这就构成了整个样本集。
但由于之前的产品比较固定等原因,90%以上的样本的利率特征都是15,而只有10%的样本利率特征是5、10、20、25等。
从样本分布的角度看,在特征空间里,样本大面积集中到利率值为15的区域,其他区域则非常少。即:在特征空间里,样本浓度非常不均衡。
2.2 带来的问题
在特征不均衡(特征空间内样本浓度不均衡)的原始样本集下进行学习,会导致以下两个问题:
1. 削弱了该特征的作用:继续上个栗子,利率对于用户转化率的影响非常大,从模型角度看即利率特征是进行转化率预测的强特征。但模型在学习该映射关系时,每次取到的batch,利率特征值集中在15上面。模型基于该特征进行节点划分时,会由于样本数过少而过早终止,从而带来较大的偏差。若强行使用减少正则等方式,又会大概率导致其它特征的过拟合。
2. 无法有效学习特征组合:由于浓度不均衡,模型学习会集中在利率15的特征空间区域。其它区域样本过少导致batch里没有或缺少其它利率值与其余特征的组合。因此模型无法对这类组合进行有效学习。
以上两个问题导致模型结果变差。
2.3 解决方案 - 人为调整浓度
当标签不均衡时,人为提高正样本采样比例,本质上属于在整个特征空间,按照原始分布规律,增加正样本数量,其导致模型丧失回归能力,但不影响排序功能。
当特征不均衡(样本浓度不均衡)时,一个类似的想法:我们直接人为去除浓度过高的区域里的一部分样本就可以了。继续上栗:既然有90%的样本利率特征为15,我们直接随机干掉其中的80%,只用剩下的20%的样本进行训练。
有什么影响吗?由于该剔除是随机的,那么该区域内的正负样本比例分布不会发生变化,则整个特征空间里的正负样本比值的分布不会发生变化(绝对分布已被改动),而我们要模型学习的预测概率与这个正负样本比值本身也是一一对应的。因此,貌似没什么影响,理论上连回归能力都不受影响。美滋滋~
真是这样吗?
2.4 进一步分析
模型学习的过程就是对特征进行一系列的节点划分(类似于分箱),假设模型把利率特征的10和15分到了一个节点。本来两个取值下样本数比例是1:10,由于我们人为调整了样本浓度,样本数比例变成了1:1。假设利率=10的区域正负样本比例是0.9,利率=15的区域正负样本比例是0.6,在调整浓度之前,由于大部分样本属于利率=15的区域,会把该节点的正负样本比例拉到0.6附近,也就是把该节点的预测值回归到0.6附近,比如0.65什么的。但调整浓度时两个区域的样本数比例为1:1后,节点的预测值就会回归到0.6和0.9的均值附近,也就是0.75。基于以上分析,调整浓度后似乎会导致模型学到了完全不同的东西。
以上分析有什么问题吗?有:在模型进行了有效学习的前提下,前面加粗的这两个假设不可能同时成立。如果两个区域的正负样本比例相差很大,模型不可能把这两个区域划到同一个节点。而如果划到了同一个节点,意味着两个区域的正负样本比例一样或者至少非常接近,这时候调整任何一个区域的样本浓度,都不会影响该节点的最终回归值。
基于以上分析,调整样本浓度是可行且科学的,有利于提高模型效果。
3. 样本缺失
3.1 问题描述
基于基本的业务知识,对于任何一个人,有以下两点描述
① 我们为他提供的利率越低(特征之一),他来借钱的概率(转化率)越高。因此一个有效的模型对一个人做转化率预测时,这个转化率一定是和利率值负相关的。
② 这个人信用越好(信用类特征在特征空间内特定区域),则同一个利率下转化率越低。因为会有多个平台为他提供同样甚至更低的利率。
我们的特征空间若干个个人特征(如信用特征)维度,还有一个利率特征维度。但我们有这些特征各种组合下的样本吗?并没有。因为在过往的业务中,低利率(以10为例)不会开放给所有的人,而是只开放给了信用好的人(通过另一个信用评估模型或策略筛选出来的)。因此我们缺少“信用特征较差而利率较低”这样的样本。
这既不是在全特征空间内样本标签不均衡的问题,也不是在特定特征下样本浓度不均衡的问题,而是在特定特征下,另一个(些)特征分布不均衡的问题。
3.1.1 一个具体的业务场景问题
我们希望转化率模型对于一个具体的人做预测时,预测值能与利率负相关。
对于对于任何一个人来说,其信用越好则转化率越低,利率越低则转化率越高。那么我们已有的这部分信用好且利率低的样本,其整体上的转化比例是怎样的呢?难以确定,这取决于信用策略滤掉了多大比例的信用偏差的用户。
若15、20、25等较高利率开放给了大部分用户(好坏都有),则这些利率下,模型会有效学习到个人信用特征与转化率的映射关系。
若利率为10只开放给了信用在顶端的极少数用户,则样本集中利率为10的子集里,其转化比例很低。会导致:① 该利率和较差信用特征对应的特征空间区域内没有(足够)样本,因此模型学习不到该利率下不同的信用特征与转化率的映射关系;② 模型会直接学到“利率很低时,转化率也很低”这种错误知识。
因为模型对利率为10这个区域学到的知识是完全错误的,也就无法保证进行预测时,其预测的转化率与提供的利率特征是负相关的。
最终问题可以描述为:如何避免由于样本缺失导致的错误学习,进而保证转化率-利率的单调负相关关系呢?
3.2 解决方法讨论
利率为10只开放给了信用极好的少量用户,导致这个区域内正负样本比例(转化比例)很低,那么我们能不能人为复制一批这个区域内的正样本,强行拉高其正负样本比例呢?
如果这样操作,模型会学习到利率为10时转化率很高。但问题是,这个转化率已经完全是我们人为设定的了(取决于前面的正负样本比例)。
我们可以在整个特征空间内调整正负样本比例供模型学习,保证模型的排序能力;也可以基于某个特征在特定的空间区域随机去除或复制部分样本以调整浓度(对正负样本等概率操作)。但不能在特定的特征空间区域,有偏的添加或删除某一类样本(正或负)。因为这已经改变了样本集本身所携带的真实规律,属于人为设定一个规律再让模型去学习,偏离了数据挖掘的本质。
回到最初的问题:如何保证转化率-利率的负相关关系呢?一个可能的解决方案是:直接把利率为10的这部分样本剔除。模型拥有不同信用特征下不同利率(15,20,25,30)的样本。在相同的信用特征下,模型会学习到转化率与利率的映射关系。基于外延拟合,在进行样本预测时,若喂入利率特征为10,模型会给出更高的转化率预测。(GBDT本身对特征空间的划分是离散的,因此大概率会给出的结果与15是一样的,但没什么更好的办法了)