本文是《智能风控、算法和工程实践》第五章学习笔记。
幸存者偏差
由于风控模型的拒绝属性,会导致幸存者偏差和样本不均衡两个问题。 幸存者偏差是指,每次模型迭代时,使用的样本都是被前一个模型筛选过的,只有高于前一版模型分数阈值的样本,才可以进入当前模型训练,于是样本空间就会不完备。进入模型的样本就是幸存者,它们不携带或者很少携带被拒绝的样本的信息,导致样本逐渐偏离真实分布。
于是随着模型迭代,区分能力强的特征被弱化,甚至对模型起到完全相反的作用。想要修正有偏差的信息,就需要用无偏差的数据重新训练模型。因此核心问题就是如何获取无偏差的数据。
传统的解决方法就是使用拒绝推断为拒绝样本添加伪标记和权重。拒绝推断的方法见: 拒绝推断
书中介绍的方法是一些其他的机器学习方法,具体有:
- 增量学习
- 生成对抗网络——GAN模型
- 高斯混合模型——GMM算法
这里就不再深入学习以上的算法了,因为实际工作中用不用得到拒绝推断还是个问号。
样本不均衡
在风控场景下,负样本的占比要远远小于正样本的占比。当不同类别的样本量有较大差异时,在梯度下降的过程中就会很难收敛到最优解。因为在每一次梯度下降的过程中,负样本所贡献的信息有限,导致模型无法很好地学习负样本。通俗说就是,负样本越多,模型的区分效果通常会越好,KS值会越大。
代价敏感加权方案
下探是解决不均衡问题最直接的方法。就是在拒绝域中随机接收一些样本,以此来积累负样本。但这样风险较高,会牺牲一部分收益,而且较难量化每次下探的量。
对少数类样本进行加权处理,使模型进行均衡训练,即代价敏感加权方案,又叫作展开法。在逻辑回归中,可以通过参数class_weight="balanced"调整正负样本的权重,大多数情况下样本加权可以增强模型的表现。
类权重的计算方法如下:
w e i g h t = n _ s a m p l e s n _ c l a s s e s ∗ n p . b i n c o u n t ( y ) weight=\frac{n\_samples}{n\_classes*np.bincount(y)} weight=n_classes∗np.bincount(y)n_samples
其中,n_samples为样本数,n_classes为类别数量,np.bincount(y)会输出每个类别的样本数。
插值过采样方案
插值过采样方案又叫作SMOTE算法,是机器学习中常用的采样方法。基本思想就是在现有少数类样本之间进行插值,人工合成新样本。SMOTE算法的原理如下图:
为了解决SMOTE算法的过拟合问题,Adaptive Synthetic Sampling方法被提出,主要包括:Borderline-SMOTE和Adaptive Synthetic Sampling(ADA-SYN)算法。
- Borderline-SMOTE
对靠近边界的minority样本创造新数据。其与SMOTE的不同是:SMOTE是对每一个少数类样本产生综合新样本,而Borderline-SMOTE仅对靠近边界的少数样本创造新数据。
Borderline-SMOTE算法只对近邻中多数类样本大于少数类样本的点进行合成新样本。但是如果一个样本的近邻都是多数类样本, 则会被认为是噪声,不合成新样本。
-
ADA-SYN
根据多数类和少数类的密度分布,动态改变权重,决定要生成多少少数类的新数据。
-
基于聚类的随机采样(CBO)
可以用来解决类内不平衡问题,主要利用的聚类的方法。具体的过程如下:
随机选择K个样本作为K个簇,并且计算K类样本在特征空间的平均值,作为聚类中心;
对于剩下的每一个样本,计算它和K个聚类中心的欧氏距离,根据欧式聚类将其分配到最近的类簇中;
更新每个簇的聚类中心,直到所有的样本都用完;
CBO会使用过采样的方法填充多数类和少数类的类簇,所以每个类的样本数相同。少数类的样本个数为多数类样本除以少数类的类别数。即上图中60/2=30。
过采样算法实战
由于SMOTE算法是基于样本空间进行插值,会放大数据集中的噪声和异常,因此要对训练样本进行清洗。这里使用lightgbm对数据进行拟合,将预测结果较差的样本权重降低,并且不参与SMOTE算法的插值过程。列出核心代码:
def lgb_test(train_x,train_y,test_x,test_y):
clf =lgb.LGBMClassifier(boosting_type = 'gbdt',
objective = 'binary',
metric =