zoukankan      html  css  js  c++  java
  • 风控用户识别方法

    风控用户识别方法

    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,希望对大家有一些帮助。

  • 相关阅读:
    react ts axios 配置跨域
    npm run eject“Remove untracked files, stash or commit any changes, and try again.”错误
    java 进程的参数和list的线程安全
    帆软报表 大屏列表跑马灯效果JS
    帆软报表 快速复用数据集,避免重复劳动
    分析云 OA中部门分级思路和实现方法
    分析云 分段器 只显示一个块的数据
    分析云 更改服务默认的端口号
    分析云U8项目配置方法新版本(2)
    Oracle 创建时间维度表并更新是否工作日字段
  • 原文地址:https://www.cnblogs.com/bonelee/p/9728663.html
Copyright © 2011-2022 走看看