在日常建立风控模型过程中,例如信用违约、客户流失、价值分层等模型场景,我们在数据预处理环节往往会对样本的异常值进行检测,并根据识别结果采用合适的方法对其处理,这样可以有效避免异常数据对模型拟合的影响。因此,针对风控建模数据宽表的样本异常值检测,尤其是面向对异常值比较敏感的算法模型(逻辑回归、线性回归等),已经是建模流程默认的一项“标配”环节,往往在特征缺失值处理前后进行应用。同时,异常值数据检测分析,也是我们从事数据分析或数据建模岗位必须掌握的重点内容之一。
1、异常值检测背景
对于样本特征的异常值检测,常见的方法类型主要包括统计、聚类、分类等维度。其中,统计方法例如箱线图、标准差等,聚类方法例如Kmeans、DBSCAN等,分类方法例如OneClassSVM等。但是,统计类的异常检测方法需要假设建模样本的数据分布是服从特定概率分布的,而这个假设往往很难满足数据的真实情况,使得异常检测结果存在较大偏差;聚类或分类方法的明显缺点,是最终对异常值判断的输出结果仅仅是0/1(或-1/1)的标识,不支持对各样本数据点的异常程度进行量化评估。
此外,我们比较熟悉的孤立森林(Isolation Forests)算法,则可以有效解决以上问题,在数据异常值检测中应用较为广泛,在输出样本判断结果(-1异常、1正常)的同时,也支持生成各样本数据的异常程度分数。这种适用度较好的异常值检测方法除了孤立森林以外,还有一种算法在实际应用场景中表现较好,那就是LOF方法(局部离群因子),这也是本文要介绍的重点内容。LOF算法不仅无需对建模样本的数据分布有假设要求,而且还可以支持对每个样本数据点进行客观的量化评价,即输出样本的具体异常分数。
2、LOF算法原理思想
LOF(Local Outlier Factor):局部离群因子,是一种基于密度且无监督的异常值检测方法。通过计算出给定数据点相对其邻近点的局部密度偏差,得到每个样本数据的异常分数称为局部异常因子,而这个系数取决于样本相对于周围邻域的隔离程度。从原理思想来分析,局部性是由K近邻给出,并采用距离大小估计局部密度,通过将样本点的局部密度与其邻近点的局部密度进行比较,可以识别出密度明显低于其邻近的样本,而这些样本数据则识别为特征异常值。
为了更直观的理解LOF算法检测异常值的原理思路及其实现方法,本文通过相关的实例数据来展开分析,首先我们来构建一份测试样本。
实例数据中df共包含100条样本,其中放入80条正常样本与20条异常样本,异常值数据比例为20%,特征字段维度为2,样本特征的具体取值通过randn()等函数随机生成,正常数据与异常数据的部分样例如图2所示。
图2 测试数据样例
围绕以上样本数据,现采用LOF算法来检测特征的异常值,LOF模型可以通过调用sklearn.neighbors库的LocalOutlierFactor()函数来实现,模型训练及其预测的实现过程详见知识星球代码详情,输出的部分数据结果如图4所示。其中,LOF模型的参数n_neighbors表示近邻点数量,contamination表示异常值比例。
图4 LOF异常检测结果
在图3的代码实现过程中,针对样本数据的预测分数结果pred_score,我们通过调用scipy.stats库的scoreatpercentile()函数,将异常值的判断阈值threshold进行输出,可以指定异常比例abnormal_pct得到相应取值。结合本文样例的异常阈值输出结果-1.515361,代表小于此值的异常分数pred_score,对应样本数据则为异常值数据。
为了更客观且形象的描述实例样本正常值与异常值的分布情况,以上分析的实现过程详见知识星球代码详情,来绘制本文数据样例的异常值检测分布结果,最终输出的可视化图表具体如图6所示。
图6 异常检测可视化结果
对于上图LOF模型异常检测的可视化分布结果,粉色部分(palevioletred)为LOF模型的决策域;红色(red)虚线为模型的异常判断边界(decision function);白色(white)圆点代表正常值(normal sample);黑色(black)圆点代表异常值(abnormal sample)。根据可视化图表展示的信息,可以很直观的了解到,当前LOF模型可以较好的将样本正常值与异常值进行区分,这也证明了LOF算法模型在样本异常值检测中的有效性,在实际业务场景中我们可以尝试应用。
3、LOF异常检测应用
通过上文对LOF算法原理与实现过程的介绍,我们已熟悉了LOF在异常值检测的价值。为了更进一步熟悉理解LOF算法的实践应用,接下来我们围绕一份实际建模的样本数据来展开分析。
现根据一批样本用户的日常行为数据,来构建用户高价值识别的分类模型,建模样本包含3000条样本与8个字段,部分数据样例如图7所示。其中,字段consum_index(消费指数)、credit_index(信用指数)、travel_index(出行指数)、stable_index(稳定指数)、life_index(生活指数)、work_index(工作指数)为特征变量池,代表用户多维度的信息指数;flag为目标变量,取值1/0代表是否高价值用户。
图7 建模数据样例
通过以上样本特征数据训练模型之前,为了保证模型的拟合效果,我们有必要对样本的异常值进行检测分析,这里采用LOF方法来实现,以上分析的实现过程详见知识星球代码详情。由于样本异常值比例(contamination)可以自由设定,且通常情况下取值不宜设置太高,这里将其定义为0.1,也就是当前样本数据最终识别为异常值的比例为10%。此外,LOF模型参数n_neighbors(邻近样本点数量)定义为30,具体可以综合样本数据量情况决定。
通过以上过程可以输出样本数据的异常值识别结果,包括预测标签label与异常分数score,其中label取值1或-1(-1代表异常值),score为float型数值(取值越小异常可能性越大),具体样例如图9所示。通过异常值判断阈值threshold的输出结果-1.1835,可知score小于-1.1835的样本均识别为异常数据点。
图9 LOF异常值分布结果
为了更直观的理解建模样本数据的异常值分布情况,我们将样本异常分数score通过可视化形式进行展现,具体结果如图10所示,可见异常样本数据(label=-1)的分数情况明显要低于正常样本数据(label=1),明显参差不齐的线条对应的样本点均为异常数据,这些样本的异常程度分数score均小于阈值-1.1835。以上分析流程便有效实现了对本例建模样本数据的异常检测,但这里需要注意的是,数据异常是针对当前整条样本,并非仅对某个特征字段,若需要分析每个特征的异常程度,则在LOF模型拟合预测过程中,函数fit_predict()的数据应只定义单个特征。
图10 LOF异常分布可视化
综合以上内容,我们通过具体样本数据,详细介绍了LOF算法模型在样本异常值检测的原理思想与实现过程,并围绕风控建模的实例进行了描述分析,多角度验证了LOF算法在异常值检测的效果,值得我们在日常数据分析任务中实践应用。为了便于大家对LOF异常值检测的进一步理解与熟悉,本文额外附带了与以上内容同步的python代码与样本数据,供大家参考学习,详情请移至知识星球查看相关内容。
…
~原创文章