先介绍下金融借贷业务流程:用户前来申请借贷,会先经过欺诈识别,把欺诈团伙和主观欺诈的个人拒绝掉,然后对通过的人做信用评估,最后根据额度模型,算出利润最大化时放款金额。
刚才提到了团队欺诈,举个真实的例子。宜人贷在他们的财报中公布的,他们被一个团伙成功撸走了2000多单,当时宜人贷的件均4w, 一下损失了8000w!!
那么如何防范这种风险呢。这就是今天要分享的图算法。图可以将这些一个个有良好记录的个体关联起来,一网打尽。
再举一些团伙欺诈的行为。比如一个团伙,注册真实的淘宝商家,然后刷出良好的淘宝购物记录。或者来回转账,刷出良好的银行流水。
刚才前两位老师都没有提到额度模型,简单介绍下,如果只给用户放款5000,可能坏账风险很小,但是利息也少,如果放款10000,利息虽然收到利息多了,但是坏账风险高岭,所以需要做个权衡
文章图片
Graph简介
G=(V,E)G=(V,E)
- V:vertex set
- E:edge set (有向,无向,有权重和没有权重)
举例,两个人之间的联系, A给B买了东西,A和B之间的通话次数时长多于A和C之间。
- 度中心性(Degree Centrality) - 表示连接到某节点的边数。在有向图中,我们可以有2个度中心性度量:流入和流出。一个节点的节点度越大就意味着该节点在网络中就越重要。
- 接近中心性(Closeness Centrality) - 从某节点到所有其他节点的最短路径的平均长度。反映在网络中某一节点与其他节点之间的接近程度。
- 介中心性(Betweenness Centrality) - 某节点在多少对节点的最短路径上。介数中心性是比较能体现节点在图中桥梁作用的中心性度量方法。介数反映了相应的节点或者边在整个网络中的作用和影响力,具有很强的现实意义。例如,在交通网络中,介数较高的道路拥挤的概率很大;在电力网络中,介数较高的输电线路和节点容易发生危险。
- 最小割, 正则化割:通过计算图的最小割,即将网络划分为预定的分组数,并使连接各分组的边的条数最少。
- 非负矩阵分解:基本原理是将原始矩阵分解得到社区指示矩阵和基矩阵
- 基于模块度的社区划分
- 基于节点相似性的社区划分
最小割算法广泛应用在分布式计算的负载均衡中,对集群节点的分组有利于减少不相关节点之间的通信。然而由于该算法限定了网络最终分组的个数,而不能通过算法“发现”节点间的内在联系并自然地构成若干个社区,因此最小割算法应用较为局限。本文主要分享这两类的主要算法,基于模块度的 louvain和基于信息熵infomap,基于相似度的node2vec
模块度(Modularity)公式及简化
【金融风控反欺诈之图算法】优化目标:一般认为社团内部的点之间的连接相对稠密,而不同社团的点之间的连接相对稀疏。
所以模块度也可以理解是社区内部边的权重减去所有与社区节点相连的边的权重和,对无向图更好理解,即社区内部边的度数(内部的连线数)减去社区内节点的总度数。
文章图片
模块度公式的解释
文章图片
节点i和节点j之间边的权重,网络不是带权图时,所有边的权重可以看做是1;
文章图片
表示所有与节点i相连的边的权重之和(度数);
表示节点i所属的社区;
文章图片
表示所有边的权重之和(边的数目)。
其中
文章图片
表示社区c内的边的权重之和,
文章图片
表示与社区c内的节点相连的边的权重之和,即社区c节点的度之和(包含与其他社区相连边的度)。
从概率的角度去看:一般使用后面简化的公式,简化后的公式删除了判断两个节点是否划为同一个社区的函数,所以在一定程度上大大减少了Q值计算量。
文章图片
表示实际情况下,c社区内产生边的概率。
文章图片
表示在一种理想情况下,给定任意节点i的的度ki,对节点i和节点j进行随机连边,边属于社区c的概率期望。
于是上式就表示了社区内连边数与随机期望的一个差值。连边数比随机期望值越高,表明社区划分的越好。
Louvain
Louvain算法的思想很简单:
文章图片
第一阶段称为Modularity Optimization,主要是将每个节点划分到与其邻接的节点所在的社区中,以使得模块度的值不断变大;
第二阶段称为Community Aggregation,主要是将第一步划分出来的社区聚合成为一个点,即根据上一步生成的社区结构重新构造网络。重复以上的过程,直到网络中的结构不再改变为止。
移动
文章图片
文章图片
是社区c内节点与节点i的边权重之和,再乘以2
前面部分表示把节点i加入到社区c后的模块度,后一部分是节点i作为一个独立社区和社区c的模块度
1. 模块度与Louvain社区发现算法
http://www.cnblogs.com/fengfenggirl/p/louvain.html
2. Spark GraphX分布式图计算实战
文章图片
infomap
从信息论的角度出发,假设一个random worker 在图上进行随机游走,那么怎么用最少的编码长度来表示其路径呢?
如果节点存在社区结构,那么社区内的节点就可以共享社区的bit位码,可以得到更小的平均比特, 所以社区划分的越好,那么表示任意一条随机游走的路径所需的平均比特就越小。
如果我们能够计算出每个节点的到达概率,就可以依据信息熵的公式来量化平均比特了:
文章图片
怎么计算每个点的到达概率呢?
一个暴力的办法是在图上进行长时间的随机游走,最后统计每个节点的出现概率。太暴力了。
利用pagerank思路,初始化了每个节点的到达概率之后,就可以不断地迭代更新每个节点的到达概率,这个结果会很快趋于收敛。
其实这过程就是一个马尔科夫随机过程,随机初始化起始值,然后随机游走就相当于不停地用概率转移矩阵相乘,最后就可以达到马尔科夫稳态。
把随机游走事件归为三类:进入某个社团,离开某个社团,再社团内部游走。
定义清楚各类事件的发生概率,依据信息熵公式,就可以得到此时编码所需的平均比特了,其本质就是从信息论的角度出发。
文章图片
Infomap算法的迭代过程
- 初始化,对每个节点都视作独立的社区;
- while 平均比特的值不再下降;
- 对图里的节点随机采样出一个序列,按顺序依次尝试将每个节点赋给邻居节点所在的社区,取平均比特下降最大时的社区赋给该节点,如果没有下降,该节点的社区不变。
1. The map equation
http://www.mapequation.org/apps/MapDemo.html
2. https://mp.weixin.qq.com/s/qUxMesQA-edSyHeudQRRGA
3. DEEP GRAPH INFOMAX 阅读笔记
https://zhuanlan.zhihu.com/p/58682802
Graph embeddings Deepwalk
- 使用随机游走(RandomWalk)的方式在图中进行节点采样获得节点共关系,
- 使用skip-gram,根据步骤1中生成的节点序列学习每个节点的向量表示。skip-gram就是根据给定输入的节点,预测上下文节点。
其中一个就是采样,从其邻居中随机采样节点作为下一个访问节点,是一种可重复访问已访问节点的深度优先遍历算法。
node2vec是一种综合考虑DFS邻域和BFS邻域的graph embedding方法
node2vec
文章图片
这个node2vec优化目标函数,因为它跟大名鼎鼎的word2vec是一样。
我们最初是用一个Python写的包,跑一遍算法需要一周。后来想,既然优化目标是一样的,那能不能用word2vec包,因为word2vec用c写的,而且还采用了 Hierarchical Softmax,negative sampling加速。
然后在网上找到了一个套用word2vec实现的node2vec包,速度快很多。
随机游走的方式
复杂网络处理的任务其实离不开两种特性,前面也提到过:一种是同质性,就是之前所说的社区。一种就是结构相似性,值得注意的是,结构相似的两个点未必相连,可以是相距很远的两个节点。
能不能改进DeepWalk中随机游走的方式,使它综合DFS和BFS的特性呢?所以本文引入了两个参数用来控制随机游走产生的方式。
文章图片
Z是分子的归一化常数
如果已经采样了 (t,v) ,也就是说现在停留在节点v上,那么下一个要采样的节点x是哪个?作者定义了一个概率分布,也就是一个节点到它的不同邻居的转移概率:
直观的解释一下这个分布:
文章图片
简而言之:
参数p控制重复访问刚刚访问过的顶点的概率,
参数q控制着游走是向外还是向内,若q>1,随机游走倾向于访问和t接近的顶点(偏向BFS)。若q<1,倾向于访问远离t的顶点(偏向DFS)。
文章图片
缺点
- 慢
- 先embedding再聚类,感觉这两个过程很割裂!!融合一下
Graphembedding得到向量后,可以做很多事情,在我们这个主题可以简单的通过聚类来讲节点分组。
但是这个过程比较割裂,先优化node2vec,然后再优化聚类。能不能整体上一次性优化完呢。
comE这个算法优化目标中加入了社区的检测和嵌入。通过一个混合高斯模型将节点划分开。
文章图片
文章图片
优化目标中前面两项跟LINE定义的相似度相似:
文章图片
1. https://blog.csdn.net/u012151283/article/details/87013915
2. Learning Community Embedding with Community Detection and Node Embedding on Graphs
https://zhuanlan.zhihu.com/p/36924789
3. Learning Community Embedding with Community Detection and Node Embedding on Graphs
https://github.com/vwz/ComE
4. http://sentic.net/community-embedding.pdf
评价指标
Modularity
标准化互信息 NMI ( Normalized Mutual Information )
文章图片
实时社区发现
1. 基于个体稳定度博弈的动态社区发现算法研究
http://www.deliwenku.com/p-84779.html
2. 基于标签传播的实时社区发现算法研究
http://www.doc88.com/p-1055432963471.html
3. 基于 spark streaming 的动态社区发现及其在个性化推荐应用中的研究
http://www.doc88.com/p-6991331093268.html
4. 一种基于局部模块度的增量式动态社区发现算法
http://www.doc88.com/p-9146960189736.html
5. 基于标签传播的实时社区发现算法研究
http://www.doc88.com/p-1055432963471.html
6. 图流合璧——基于Spark Streaming和GraphX的动态图计算
https://wenku.baidu.com/view/fa65268159eef8c75fbfb3a6.html?re=view
参考佳文
1. 深度学习时代的图模型,清华发文综述图网络
2. 社区发现(Community Detection)算法
https://blog.csdn.net/cleverlzc/article/details/39494957
3. 社区发现算法FastUnfolding的GraphX实现
http://www.aboutyun.com/forum.php?mod=viewthread&tid=19817
4. 谱聚类(spectral clustering)原理总结
https://www.cnblogs.com/pinard/p/6221564.html
5. GraphWave:一种全新的无监督网络嵌入方法
6. 社团划分结果评估指标:Q、ARI、NMI
https://blog.csdn.net/DreamHome_S/article/details/78167267
7. 论文解读:从乌合之众到群体智慧的一步之遥
8. 2017CIKM-Network Embedding专题论文分享
https://yq.aliyun.com/articles/294450
9. node2vec: Scalable Feature Learning for Networkshttps://www.jianshu.com/p/a9a2ed8b98be
10. node2vec: Scalable Feature Learning for Networkshttps://arxiv.org/pdf/1607.00653.pdf
11. node2vec: Scalable Feature Learning for Networks 阅读笔记 https://zhuanlan.zhihu.com/p/30599602
12. 基于PageRank的复杂网络社区发现
https://blog.csdn.net/qq_32284189/article/details/80827899
13. Modularity的计算方法——社团检测中模块度计算公式详解
http://www.yalewoo.com/2017/03/10/modularity_community_detection/
14. 社区发现算法 - Fast Unfolding(Louvian)算法初探
https://www.cnblogs.com/LittleHann/p/9078909.html
15. 论文 | 蚂蚁金服亮相数据挖掘顶会KDD 2018,这些你不可错过!
作者介绍:
张行军,Abakus高级风控算法经理。曾先后工作于百度、360等公司。
转发:https://mp.weixin.qq.com/s?__biz=MzU1NTMyOTI4Mw==&mid=2247489851&idx=1&sn=8b214e028188b176b6acc8533af4e1a6&chksm=fbd4ab57cca3224162fc762eb5dcb8cb6013dcf28b96c928d9d3c1d5e6898525b8425552d65a&mpshare=1&scene=23&srcid=#rd