风控用户识别方法

风控用户识别方法

 

update:
18.1.1 :Frcwp已如期上线,满足本文中的所有方法,欢迎拍砖

前言

因为工作方向相关,之前我也尝试着在Google、arXiv、wikipedia等等地方搜一些风控识别的资料或者思路,但是事与愿违的是,绝大多数的与风控算法都毫无关系,基本上都是推销自己家的产品的,所以,我之前也尝试着写了一些方法的梳理,如:

但是在我前几天再回过头去看自己写的这些东西的时候,作为一个老司机来说,我都不想去看一篇又一篇动则上千字的文章,理论交错,文笔粗陋,正巧现在公司内部也有一个风控的项目,所以,我准备做一个开源的项目Frcwp,核心在于:

  • 简单操作,几乎不用多少调参,自动识别异常点
  • 理论清晰,支持的方法多,兼容性好
  • 集成数据预处理的过程,减轻前置工作量

“纠结”了几个朋友的情况下,一期已经完工,主要是搭建了最简单的框架,我相信,这只是一个开始,欢迎大家试用,也欢迎每一个人来批评,更希望有想法的同学一起来做这个事情。


接下来,让我们来讲讲,一期我们做了什么?

核心我们一期做的异常点识别中,核心是利用的14年周志华教授提出的isolation forest算法进行识别,详细的理论部分请参见:Isolation Forest,重复说一个事情的意义也不大。这边需要解释几点:

  • 具体是怎么得到当前的算法流程的呢?
  • 为什么用当前的算法进行识别而不用其他的识别算法?
  • 当前的设计下存在哪些问题?
  • 未来的方向会在哪边?

让我们来一一来回答这些问题。

为了用Isolation Forest而不用其他的识别算法?

在设计这套算法之前,我们其实是遇到了一个实际的业务问题,黑产撞库。相信大家毫不陌生这个词,无论是阿里、京东、滴滴还是腾讯,被撞库是一件普通了不能再普通的事情,“黑产”的人从第三方渠道,获取到你历史上的手机号和一些你曾经用的密码,重复的登陆,暴力的尝试,如果你的密码设置的比较简单,比如:“123456”,“qwerty”…非常容易被破解,然后再根据你历史下单的情况,进行假冒“客服”退款,进行诈骗,百度一搜就有一堆这样的新闻:

所以,我们需要阻止“黑产”人员进行这样的暴力破解,获取用户的资料,由此而引发了我们对这个问题的思考。我们在对这个问题分析的时候,巧妙的发现了如下的一些信息:

因为涉及公司机密,这边隐去了具体坐标和值,很容易发现以下问题:

  • 正常扇面内数据分布密集,未知扇面内数据分布松散,异常扇面内数据分布稀疏
  • 正常扇面内的数据量占全量数据的绝大多数
  • 不存在明显的分割线,正常扇面和异常扇面存在过度地带

这个给了我们一些启发,我们做了如下的分析:

  • 我们观察了异常扇面内的用户黑白比,如我们预计的黑白比为20:3,也就是说分布远离大量数据点的用户绝大多数存在问题
  • 为止区域的用户黑白比为1:2,这说明在黑白用户之间不存在明显的界限,有交错地带
  • 正常区域内也存在黑名单用户,比例在504:1,也就是说,我们划分有一定识别能力,但是还是不能做到全量识别

综合上述这些预先的处理,我们要用算法完成三件事情:
1.切分全量用户,做到识别出正常,未知,异常用户
2.识别出异常用户和正常用户之间的差异约束切割
3.在异常用户+未知用户里面,找出利用差异约束切割出黑名单

为什么用当前的算法进行识别而不用其他的识别算法?

切分数据的时候,我们这边采用的是切比雪夫切割。非理工科的同学可能比较疑惑什么是切比雪夫切割,这边如果数据是正态下,箱式图的Q3+3/2xQI作为上top点进行切割,大家就应该很熟悉了,其实利用的就是数据出现的概率。
来源于百度百科
上面这张图很好的解释了,在数据服从正态分布的情况下,出现数据值比均值+3x标准差要大的概率不足0.1%,所以,我们可以认为这些数据是异常点了。那现在出现了一个问题,日常数据分布都不一定是正态的,所以引出来了类似的切比雪夫理论,它用的是马氏距离距离中心点的程度,详细的马氏距离理论见马氏距离分布

切分完成数据之后,我们要做寻找差异约束切割逻辑。从最上面的扇面图,我们很容易发现,正常数据与异常数据之间的密度差异很明显,所以如何识别密度差异的算法就是我们需要的,这边我大概找了6、7种常见的切分方法,这边主要讲三种:isolation forest,lof,distance similarity。理论我之前也讲过,贴上地址,不废话了:密度算法。这边主要展示效果差异:

通过68个数据集,很明显的可以看出LOF的识别出来的用户的异常用户异常程度是低于Isolation Forest和Distince Similarity的,起码在我们这些数据集样本中,Isolation Forest和Distince Similarity识别效果差异不大,所以,我们再考虑了另一个性能问题:

我们用了CV=10的交叉检验,发现,平均下来,Isolation Forest识别速度是Distince Similarity的1/3以下。综合上述,还有一些其他因素,最后我们选择了Isoation Forest的方法。

当前的设计下存在哪些问题?

上面说的都是比较正面的问题,让我们看看,有哪些缺点。
首先,从头到尾,我们一直在围绕密度差异这个问题,但是就我平时做的一些小爬虫都知道,降低暴力获取的速度,慢慢搞,这时候就以上的方法就无法做到有效的识别。除此之外,因为我们用了切比雪夫不等式,所以对其有概念的同学知道,算马氏距离的时候需要算协方差矩阵,当数据量异常异常大(我测算的是12mx100)的时候计算资源紧张,可能算不出来;数据量异常异常小的时候feature严重共线性,也可能计算不出来。

未来的方向会在哪边?

所以,后续我们会新增其他算法,支持过大过小情况下的识别方法。针对数据量过小的识别情况,我在V0.0.3版本下更新了一个简单识别的方法,之后会优化更好的算法替代掉的。只要数据量太大无法计算的问题,我之后会采取矩阵切割分块计算的方法,这个是后话了。

最后,我们以当前算法包的使用来结束整篇介绍:

1
2
#安装
pip install Frcwp

 

自动识别过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Frcwp import Frcwp
traindata = pd.read_table('../路径')#数据可以在https://github.com/sladesha/machine_learning/tree/master/data下的data_all.csv获取
frc = Frcwp()
traindata = frc.changeformat(traindata, index=0)
# You can define your own outlier size , the details of these params can be got from ../Frcwp/Frcwp.py:
params = {
'na_rate': 0.4,
'single_dealed': 1,
'is_scale': 0,
'distince_method': 'Maha',
'outlier_rate': 0.05,
'strange_rate': 0.15,
'nestimators': 150,
'contamination': 0.2
}

# train the frc model
frc.fit(traindata, **params)

 

相关的结果显示:

1
2
3
4
5
6
7
8
9
# predict outliers with the trained frc model
predict_params = {
'output': 20,
'is_whole': 1
}
frc.predict(frc.potentialdata_set, **predict_params)

# if you want get the whole probability of your potential outliers
frc.similarity_label

 

以上部分内容截取自我的github,希望对大家有一些帮助。

posted @ 2018-09-30 11:15  bonelee  阅读(1571)  评论(0编辑  收藏  举报