推荐算法的特征工程之连续值特征处理

转子:https://zhuanlan.zhihu.com/p/571067511
上一篇文章推荐算法的基石-数据提了数据是算法的基石,我们通过埋点,数据的预加工,把野生数据变成了家养数据,打个比喻,如果把好的算法比喻为一道好菜,那么数据的埋点就是去野外打野,需要去做陷阱,对用户下套,等待猎物上钩,数据整合就是猎物已经打到了,需要去宰杀,然后分门别类的储存起来,那么特征处理是啥呢?特征处理就是食材的处理,比如辣椒要切断,木耳要拿水泡胀,鸡胗要切花,因此特征处理,就是将分类好的食材进行合适的处理,然后喂给模型,因为模型就是烹饪的方法,显然,要做萝卜蒸牛肉,正常人是不可能把一整萝卜直接给扔锅里吧,总要萝卜切块,牛肉切块,放郫县豆瓣,放生抽再蒸他个半个小时吧,模型也是这样子的,模型也没有那么强大的胃口去吃生数据,俗话说的好啊,家猪只能吃细糠,野猪才吃生糠,因此模型也要吃细糠,而特征处理就是把生糠变细糠。

通常来说特征分两类,一类是数值型,比如年龄,点击率,面积,长度等连续数值型特征,一类是类别型特征如userid,itemid, 类型,主题,关键字,来源通道等。

数值型特征-标准化
数值型特征的标准化(又称归一化),标准化是将数据按比例缩放,使之落入一个小的特定区间,不过一般来说这种情况只是针对LR或者神经网络这种模型,树模型不太需要此种处理(当然有更好,所以总的来说还是推荐做类似的处理)。这里我们以LR举例说说为什么要做归一化,其实,对于LR或者神经网络这种需要梯度下降的模型而言,即使数值特征不做处理依然可以在经过n次梯度下降,达到收敛状态(也就是最优状态),但是,这个时间坦白说会非常非常非常长,这是因为对于单个特征来说数值间相差特别大,或者说分布并不符合正态分布,那么模型的参数会很难去调整到适当的位置去拟合整体Label的分布。那么为什么一定要符合正态分布呢?这是因为对于LR或者神经网络来说,我们都是提出一个模型假设,比如,对于连续数值Label来说,我们都假设其符合正态分布,对于二分类Label来说,我们假设其符合伯努利分布,对于多分类Label来说,我们假设其符合多项分布。因此,根据我们的假设,我们需要将特征尽可能的转化为假设分布的模样去拟合。在这里特别说一下,在选择模型的过程中,一定要看Label的分布,然后选择不同的模型,因为不同的模型其实符合不同的假设分布,比如,我们要预测房价,我们又选择了LR作为模型,那么我们需要将房价尽可能转化为正态分布(俗称伪正态分布),因为LR就是被假设为正态分布,这就有点像,做烤鸡一定要烤箱,做包子一定要蒸笼,做麻辣香锅一定要大铁锅,因此,我们首先要明白label的分布(如果label不符合假设的分布可以进行对应的转换,如果不转换可能拟合也很困难,理由是Label需要符合模型假设分布),然后,再选择模型。总的来说标准化就是让特征尽量符合模型的假设分布,这样做第一是让数据更好的拟合模型分布提高精度,第二是可以让模型迅速收敛,节省训练时间。下图为模型损失函数登高线图,左边是特征没有归一化的下降路线,右图为特征归一化后的下降路线,可以明显看出,左图的下降路线曲折蜿蜒,右图笔直且直击中心,所以可见标准化的重要性。

总的来说,标准化的原因一般是因为LR或者神经网络的假设分布引起的,一般对于LR和神经网络来说,1. 样本的各个特征的取值要符合概率分布,即 [0,1]。2. 样本的度量单位要相同,即把所有度量单位拉到同一水平线。我们并没有办法去比较1米和1公斤的区别,但是,如果我们知道了1米在整个样本中的大小比例,以及1公斤在整个样本中的大小比例,比如一个处于0.2的比例位置,另一个处于0.3的比例位置,就可以说这个样本的1米比1公斤要小。3. 神经网络假设所有的输入输出数据都要符合标准差为1,均值为0,包括权重值的初始化,激活函数的选择,以及优化算法的设计。4. 若果输出层的数量级很大,会引起损失函数的数量级很大,这样做反向传播时的梯度也就很大,这时会给梯度的更新带来数值问题。5. 如果梯度非常大,学习率就必须非常小,因此,学习率(学习率初始值)的选择需要参考输入的范围,不如直接将数据标准化,这样学习率就不必再根据数据范围作调整。而且对w1适合的学习率,可能相对于w2来说会太小,若果使用适合w1的学习率,会导致在w2方向上步进非常慢,从而消耗非常多的时间;而使用适合w2的学习率,对w1来说又太大,搜索不到适合w1的解。因此标准化是很有必要的。

我们再来看看标准化前后数据到底如何变换,下左图是未归一化的数据,右图是归一化后的数据,可以明显看出归一化后的数据被变化到了正态分布,符合模型假设。

接下来我们介绍几个归一化方法。

Min-max归一化
最小-最大规范化也称为离散标准化,是对原始数据的线性变换,将数据值映射到[0, 1]之间。

这种方法有一个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义,而且若数值集中且某个数值很大,则规范化后各值接近于0,并且将会相差不大。

log函数转换
正常的log转换有
,
,
等,还有一种是

一般来说为了避免异常值的出现我们需要对转换做一个威尔逊平滑即
,a为常数,防止转换后的值过大或者过小。

z-score转换
零-均值规范化也称标准差标准化,经过处理的数据的均值为0,标准差为1。

为均值,
为标准差。

z-score标准化方法适用于特征的最大值和最小值未知的情况,或有超出取值范围的离群数据的情况。

一般来说比较常用的标准化就这三种方法,并没有具体的好坏之分,不过一般推荐用z-score方法(但是在条件允许情况下,都可以尝试)。

BoxCox转换
除了 log 变换,还可以使用 Box-Cox 转换来对数据分布纠偏。

是一个超参数,通过调节
可以调节数据的偏度,让数据自适应偏度变化,最终达到伪正态分布。

数值型特征-分箱
尽管归一化已经可以很好的拟合模型的分布,但是,实际上对于神经网络来说连续型数值如果存在异常值,或者数据分布很难转化为正态分布,那么拟合依然很困难,所以,为了解决这个问题,有了第二种处理方式-分箱。

分箱的主要作用就是对连续特征离散化,也就取值的数量变少了,正常来说,每个取值的样本量增多,方差变小,但相应的偏差变大了,离散化之后,数据的信息会一定程度的损失,但是,特征数据会变得异常稳定,鲁棒性会更强,例如,一个特征是房屋面积>100平米是1,否则0。如果特征没有离散化,一个异常数据“房屋面积3000亩”会给模型造成很大的干扰。换一个角度来看,虽然信息有所损失,但是也降低了模型过拟合的风险,而且可以将一些缺失值作为独立的一类带入模型。并且,离散化以后模型可以能够处理与目标变量的非线性关系,从而便于分析,让分析结果或者模型预测更加稳健。此外,离散特征的增加和减少都很容易,易于模型的快速迭代。稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展。而且,逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;即使对于神经网络来说,离散化数据后每一个数据都被安排进一个预先安排的数据箱中,那么每一个箱在神经网络中都会被id化,然后安排一个embedding去代表这个特征id。正如前文所说,神经网络或者LR这种以梯度下降为主要优化目标的模型参数是符合正态分布假设的,所以,特征embedding的初始化一般都符合正态分布,更加有利于网络的拟合。最后,是一点经验之谈,一般来说,对于连续特征占多数的数据集,建议选择树模型去拟合,因为树模型是按点划分,而id类特征占多数的特征,建议选择神经网络,因为对于LR模型来说在id特征onthot之后其w的表征将得到巨大加强,对于dnn来说,id特征的embedding可以更好的去表征,因此,如果要选择神经网络作为拟合模型,建议将连续数值进行分箱。下面介绍一下几种常见的分箱方法。

无监督分箱-等频分箱
将数据的值由大到小排列后,将数据分成N等份,保证每份中数据的个数是一样的。下面就是一个简单的例子,将1-9数值,等频分到4个桶中。

import pandas as pd
x = [1,2,3,4,5,6,7,8,9]
bins = pd.qcut(x,4)
无监督分箱-等宽分箱
等宽分箱也叫等距分箱,它将数据从最小值到最大值之间,平均分为 N 等份。比如前面说的年龄数据,最大值为75,最小值为3,如果试图将数据分为4份,这时候每个区间的长度就是:(75-3)/4 = 18。切分后的边界就是:21,39,47,75。

import pandas as pd
x = [1,2,3,4,5,6,7,8,9]
bins = pd.cut(x,4)
关于等宽和等频分箱需要注意的几个细节,1. 排除异常值的干扰,比如nan值,或者极多值,比如如果数据分布为[0,0,0,0,0,0,0,0,1,2,3,4,5,6],那么其实应该考虑把0单独设为一类,然后1-6再进行分箱。2. 控制分箱的数值,根据数据的分布起伏去控制箱的数量,一般来说,如果数据分布起伏明显,可以根据聚集点的个数设置分箱数,如果并不是很明显,就需要先设置一个常用值,然后,带入模型,观察auc或则gauc的升降,这是一个体力活,也是调参的一部分,这里一般推荐使用等频分箱-20个bin,然后采用二分法验证bin的数量的好坏。

通常来说无监督分箱的优点是迅速简单,可以快速验证,而且经过实验证明,效果并不有监督差,特别是在训练数据足够多的情况下,其效果基本和有监督分箱无差,缺点就是需要选择合适的分箱方法和分箱的数量,这一点是需要一些调参的时间。

有监督分箱-IV值调整分箱
IV和WOE通常应用于二分类任务中,用来描述特征和目标值的关系强弱。提到IV(information value)就必然会提到WOE(weight of evidence),两者的区别在于WOE描述了二元目标值和一个预测变量的关系,而IV值表示了这种关系的强弱。在实际的应用中,IV值的置信范围一般如下,

因此我们可以通过IV值去判断出特征是否和目标强相关,特别对于非线性关系的强弱判断。那么其和分箱又有什么关系呢?例如对于某个连续值特征,我们可以先对其进行等频4分箱,然后,通过WOE和IV值判断特征是否和目标值强相关,如果发现IV值偏低,调整分箱结构,直到IV值达到最大,此时也就达到了最优分箱状态。

根据以上公式,我们来讲解一下,IV值分箱的具体流程:

对于连续型变量,进行分箱(binning),可以选择等频、等距,或者自定义间隔;
统计每个分箱里的正样本(
)和负样本(
)个数,然后用每个分箱的正负样本个数除以总的正负样本个数得到每个分箱正负样本占总体正负样本的比例即


计算每个分箱的
检查每个分箱(除null分箱外)里woe值是否满足单调性(这里的单调性指的是woe值和负样本比例成正比关系),若不满足,返回step1。注意:null分箱由于有明确的业务解释,因此不需要考虑满足单调性。
计算每个分箱里的IV,最终求和,即得到最终的IV。
这里我们来详细解析一下整个公式的流程,首先是WOE其主要用来描述每个分箱中负样本分布相对于正样本分布的差异性,可以注意到如果将WOE公式再次拆解,
,其中
就是用来描述这个差异性的核心,在英文中也被称为odds,其公式为
,P为预测为正样本的概率,odds越大代表预测为正样本的概率越高。

那为什么WOE要满足单调性呢?

这就要追溯到了IV分箱的对应模型逻辑回归身上,逻辑回归的基本公式为
,如果对特征进行WOE变化,此公式可以简化为
,我们可以观察到WOE公式与LR左边部分是如此相似,因此WOE的公式设计其实就是为了适配LR模型。这样子我们就可以通过以下推导去证明为何WOE需要满足单调性,首先我们把相邻的两个分箱odds相减

在上述等式中,权重w可以认为是常数,因此我们会发现:

分子和分母的变化趋势一致,当WOE单调递增时,分子中ln(odds)也是单调变化。
当分母变化越大时,分子也会变化越大,宏观表现就是WOE曲线越陡。此时,正负样本的区分将会越明显
这里让WOE的值单调是为了让woe(x)与y之间具备线性的关系,更有助于人们的理解,而不是最开始x和y之间的非线性。
注:若非单调,即转换为WOE后,x与y之间还是非线性关系,则可重新分箱(等频有益于分箱),或手动调整。

写到这里,其实我们发现了一个WOE另外一个功能,就是其将本身非线形的关系,通过分箱强行转化为了线形关系,增强了特征的拟合能力。

但是WOE真的需要完全具备单调性吗?其实并不是如此,要知道WOE的目的是为了将非线形关系转化为线性,那么为什么要线性关系呢?因为线性关系能够比较好的拟合业务关系,所以,如果你分箱以后发现,其分布符合业务数据分布那么即使没有单调性也是合理。但是通常来说,如果不单调的特征不进行WOE编码直接进入LR模型,一般都是很难求解的,因为很难找到一个线性公式来描述关系。

上文说了那么多WOE的事情,那么为什么最后又选择IV值作为最后的评判呢?主要有两点原因,

  1. 评价特征的好坏的指标应是非负数,比如WOE如果为-0.5,其实我们如果单纯叠加WOE作为评价指标,-0.5其实并不能作为差的指标去单纯的加减,因此,引入了
    也就是(pi-pn)去让评价指标永远保持为正数。

2.乘以(pi-pn)后,体现出了变量当前分组中个体的数量占整体个体数量的比例对特征预测能力的影响,比列的影响是很重要的,如果A的WOE值很大,但是其实A的正样本比例其实仅仅占总数的1%,那么A的WOE肯定不能单纯的直接加和而应该乘以对应的比例。

综合以上原因我们选择IV值作为分箱后特征优劣的评价指标,但是,IV值还是有一个地方需要注意的地方:变量的任何分组中,不应该出现正样本=0或负样本=0的情况。这是因为当正样本或者负样本为0时,根据公式
,可以看出IV值将趋近于负无穷或者正无穷,因此如果出现这种情况我们需要采取一些方式去规避这个问题,这里提出几个常用的解决方式:

尽可能的将这种没有正样本或者负样本的分桶单独成桶,不参与IV值的计算。
重新对特征进行分箱使每个分桶不会出现一边倒的情况,尤其当某些桶的样本数太少的情况。
最后给出一个IV值计算案例:

可以看出WOE值是和正负比成单调性,且IV值为正值,且区分性也被很好的区分了(肉眼可见,0-30的区间的正样本多于负样本,所以IV值明显大于其他分桶)。

有监督分箱-卡方分箱
介绍卡方分箱首先要介绍卡方分布和卡方检验,首先我们看一下卡方分布是什么?


相互独立, 都服从标准正态分布N(0,1), 则称随机变量χ2(卡方)=
所服从的分布为自由度为 n 的χ2(卡方)分布。所包含的独立变量的个数即为自由度 (eg:χ2=X1²+X2² 自由度为2)。

卡方分布图
卡方分布的期望为E(χ2)=n,方差D(χ2)=2n。 从上图可以看出n越大,曲线越平缓,n越小曲线越陡峭。

此外,卡方分布是具有可加性的:若χ12χ2(n),χ22χ2(m),且二者相互独立,则χ12+χ22~χ2(n+m)。

那么卡方分布到底有什么用呢? 这里就要谈到卡方检验了,卡方检验是主要用于分类变量之间的独立性检验。其基本思想是根据样本数据推断总体的分布与期望分布是否有显著性差异,或者推断两个分类变量是否相关或者独立。一般可以设原假设为 :观察频数与期望频数没有差异,或者两个变量相互独立不相关。实际应用中,我们先假设原假设成立,计算出卡方的值,卡方表示观察值与理论值间的偏离程度。卡方值用于衡量实际值与理论值的差异程度,这也是卡方检验的核心思想。对于类别特征来说卡方分布可以变为以下公式

m为变量特征的类别数,k为目标(label)的类别数,
为变量特征分桶i观察下目标类别j的个数,
为假设下
的期望。当样本总量比较大时,χ2统计量近似服从(m-1)(k-1)个自由度的卡方分布。

根据卡方分布,卡方统计量以及自由度,可以确定在原假设成立的情况下获得当前统计量以及更极端情况的概率p。如果p很小,说明观察值与理论值的偏离程度大,应该拒绝原假设。否则不能拒绝原假设。

以上是官方回答, 通俗点说就是卡方假设检验可以检查两组独立变量是否存在相关性,放在推荐中来说,可以用来检验特征的重要性,比如用检查性别特征是否和成交相关,也可以用来检测预测分数和成交的相关性(一般来说如果预测分数和成交的p值太低,证明此模型不适合该业务场景)。

下面也给出一个例子,某医院对某种病症的患者使用了A,B两种不同的疗法,问两种疗法有无差别?

对于整体来说,有效率为
,如果A和B无差别,意味着A组与B组的有效率是同等的,都是32.25%,则:

A组有效的期望值为320*32.25% ≈ 104,无效的期望=320-104=216

B组有效的期望值为300*32.25% ≈ 97 ,无效的期望=300-97=203

由于有随机因素的存在,即使“A和B无差别”的假设成立,观察到A组与B组的实际有效人群也不会精确地等于104和97。卡方检验的思想就是衡量预测值与观察值的差究竟有多大的概率是随机因素引起的。如果这个概率很小,“A和B无差别”的假设是不成成立的,因此A组和B组的治疗效果是不同的。此处概率需要以卡方值对应的概率来描述:

由于治疗的的组别与是否有效各有2种类别,卡方检验的自由度为(2-1)=1,χ^2=8.05 对应的p值=0.005(查卡方表可得,具体表格百度),p < 0.05,说明原假设在0.05的显著性水平下是可以拒绝的。也就是说,原假设不成立, 因此A和B对于治疗有显著差别。如果A和B无太多相关,A组治疗有效人数更趋近于104,B组治疗有效人数趋近于97,本案例事实上并不是。

那么对于卡方分箱而言具体的实现设计到一个名为chimerge的合并分箱法。ChiMerge法采取自底向上不断合并的方法完成分箱操作。在每一步的合并过程中,依靠最小对的卡方值来寻找最优的合并项。其核心思想是,如果某两个区间可以被合并,那么这两个区间的坏样本需要有最接近的分布,进而意味着两个区间的卡方值是最小的。

其主要包括两个阶段

(1).初始化阶段:

a.首先按照属性值的大小进行排序(对于非连续特征,需要先做数值转换,比如转为坏人率,然后排序),然后每个属性值单独作为一组。

(2).合并阶段:

a. 对每一对相邻的组,计算卡方值。

b. 根据计算的卡方值,对其中最小的一对邻组合并为一组。

c. 不断重复a,b直到计算出的卡方值都不低于事先设定的阈值,或者分组数达到一定的条件(如最小分组数5,最大分组数8或者某次合并后,最小的卡方值的p值超过0.9(或0.95,0.99等)[卡方值越大,P值越小,相关性越强,对Y的解释性越好])。事实上有的实现方法在合并阶段,计算的并非相邻组的卡方值(只考虑在此两组内的样本,并计算期望频数),因为他们用整体样本来计算此相邻两组的期望频数。

总的来说,卡方分箱依赖卡方分布和卡方假设检验的理论,开始假设变量特征的分箱与label无关,然后,开始把特征的箱子数进行一个适当的分箱(通常分成很多个箱,以便后面merge),再通过计算每个相邻箱的卡方值和p值,进行合并操作,直到达到目标箱数或者某种停止条件,其中有一点要注意,因为我们的假设是分箱和label是无相关性的,所以计算过程中卡方值越大,P值越小,相关性越强,对Y的解释性越好,当前分箱就越合理。

有监督分箱-ks分箱
KS(Kolmogorov-Smirnov)用于模型风险区分能力进行评估,指标衡量的是正负样本累计部分之间的差距 。KS值越大,表示该变量越能将正负样本进行区分。通常来说,KS>0.2即表示特征有较好的准确率。强调一下,这里的KS值是变量的KS值,而不是模型的KS值。

KS的计算方式:

计算每个分桶的正负样本数,


计算各每个分桶间的累计正样本数占总正样本数比率(good%)
和累计负样本数占总负样本数比率(bad%)

计算每个分桶区间累计负样本数比与累计正样本占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值得到KS值-

Best-KS分箱的算法执行过程与卡方分箱相反是一个逐步拆分的过程:

将特征值进行从小到大的排序。
计算出KS最大的那个值,即为切点,记为D。然后把数据切分成两部分。
重复步骤2,进行递归,D左右的数据进一步切割。直到KS的箱体数达到我们的预设阈值即可。
其实KS是对模型排序能力的一个刻画,对于连续型变量而言分箱后的KS值<=分箱前的KS值,分箱过程中,决定分箱后的KS值是某一个切点,而不是多个切点的共同作用。这个切点的位置是原始KS值最大的位置。

但是KS仍然不是完美的,首先,其对样本量敏感,通常来说,正样本在1000以上(or 1500以上)你计算的ks才可以稳定,否则你会发现波动很大,其次,对于KS的可比性来说,KS这种比率类指标,其实它的可比性有个前提,就是针对同分布数据,否则他的大小没啥参考价值。最后,KS受数据整体分布和入模特征相关性影响大,KS受到数据分布影响很大,不单单是正样本率,很多人说正样本率高,那么KS就高,可能不太对,很多时候正样本率很低,KS也会变高,关键是正样本分布的集中度,如果都集中在高分数段,自然高,KS的本质是对模型排序能力的一个刻画(其实他还不如auc)。此外就是如果你选用了一些强相关强有效的特征,KS也会很高,因为共现性太高。

有监督分箱-最优分箱
最优分箱主要是根据树模型的分裂节点去进行分箱,其主要是以label为最终目标,auc或者gauc为监督指标,信息熵,信息增益或者gini指数为分裂点,有监督的去决定分裂节点,具体的分箱方法后文会详细介绍。

总结
本文主要介绍了在特征工程过程中对连续值特征的处理方式,主要分为两种第一种是特征标准化,第二种是分箱。标准化的主要目的是让特征分布符合模型的假设分布,提高模型的鲁棒性和加快收敛速度。分箱主要分为无监督分箱和有监督分箱,有监督分箱主要是根据箱内的正负样本差异和整体正负样本差异的特点,让特征和label具有类线性关系,从而符合模型的假设分布。有监督分箱的优点是鲁棒性强,效果好,可解释性强,模型收敛速度快,但是,也有明显的缺陷,就是一旦线上数据分布发生巨大变化,模型效果会打折扣,其次是分箱的时间复杂度远高于无监督分箱。无监督分箱的优点是速度快,不会因为线上数据分布发生变化而有效果损失,而且在训练数据足够的情况下效果和有监督分箱基本无差,但是缺点也很明显,可解释性差,而且,寻找合适的分箱数和分箱方法,需要很强的数据理解。此外,在进行数据转化还有点要注意就是一定要检查转换后的数据分布,看是否存在异常值,如果,出现异常值,一定要做防御措施-如威尔逊平滑或者舍弃该数据用默认值填充,防止数据脱离分布,降低效果。

参考文献:

风控模型—WOE与IV指标的深入理解应用
986 赞同 · 137 评论文章

数据挖掘:银行评分卡制作–数据分箱、WOE、IV的意义_AvenueCyy的博客-CSDN博客_woe的意义
​blog.csdn.net/AvenueCyy/article/details/105162470

风控ML[5] | WOE前的分箱一定要单调吗
12 赞同 · 0 评论文章

python评分卡2_woe与IV分箱方法_雪龙无敌的博客-CSDN博客_woe分箱
​blog.csdn.net/u012338969/article/details/124651732

重要抽样分布:卡方分布(χ2分布)、t分布和F分布
​www.jianshu.com/p/e9ab4519856b
特征工程之分箱–Best-KS分箱
​www.wjhsh.net/wqbin-p-10549683.html
风控模型评价指标的思考——KS(一)
45 赞同 · 18 评论文章

你可能感兴趣的:(推荐算法,机器学习,python)