【DSW Gallery】基于图算法实现金融风控

本文涉及的产品
模型在线服务 PAI-EAS,A10/V100等 500元 1个月
交互式建模 PAI-DSW,每月250计算时 3个月
模型训练 PAI-DLC,100CU*H 3个月
简介: 图算法一般被用来解决关系网状的业务场景。与常规的结构化数据不同,图算法需要把数据整理成首尾相连的关系图谱,更多的是考虑边和点的概念。这里提供了丰富的图算法组件,包括K-Core、最大联通子图、标签传播聚类等。本示例是使用人物关系图数据,和少量标记用户数据,基于图算法实现金融风控。

直接使用

请打开基于图算法实现金融风控,并点击右上角 “ 在DSW中打开” 。

image.png


使用图算法实现金融风控

图算法一般被用来解决关系网状的业务场景。与常规的结构化数据不同,图算法需要把数据整理成首尾相连的关系图谱,更多的是考虑边和点的概念。这里提供了丰富的图算法组件,包括K-Core、最大联通子图、标签传播聚类等。

本示例是使用人物关系图数据,和少量标记用户数据,基于图算法实现金融风控。

运行环境要求

PAI-DSW 官方镜像中默认已经安装了 PyAlink,内存要求 4G 及以上。

本 Notebook 的内容可以直接运行查看,不需要准备任何其他文件。

导入 pyalink 包,并启用本地运行环境

  • 在这个示例中,我们使用 useLocalEnv 在本地(也就是 DSW 的 container 内)运行 Alink 作业,使用多线程的方式模拟分布式计算。
  • Alink也可以使用usePaiEnv提交到MaxCompute上。
from pyalink.alink import *
useLocalEnv(1)

数据准备

本示例需要两个数据集:人物关系图数据表和已知用户标签表(标记哪些用户是欺诈用户,哪些用户是信用用户)。

人物关系图数据

  • 每两个人之间的连线表示两人有一定关系,可以是同事关系或者亲人关系等。

40-1.png

人物关系图数据定义

# Alink支持多种数据源, 包括MaxCompute表,OSS,Oracle,内存数据源等。这里使用了内存数据源。
import pandas as pd
df = pd.DataFrame([
    ["Enoch", "Evan", 10],
    ["Enoch", "Gregary", 2],
    ["Gregary", "Hale", 6],
    ["Evan", "Hugo", 2],
    ["Evan", "Jeff", 4],
    ["Gregary", "Keith", 7],
    ["Jeff", "Keith", 5],
    ["Hale", "Jeff", 11],
    ["Keith", "Leif", 3],
    ["Keith", "Lionel", 1],
    ["Leif", "Mick", 4],
    ["Mick", "Noah", 5],
    ["Lionel", "Noah", 5],
    ["Rex", "Parker", 3],
    ["Rex", "Stan", 4],
    ["Stan", "Parker", 5]
])
edges = BatchOperator.fromDataframe(df, schemaStr='source string, target string, weight double')
### OSS数据源
# OssCsvSinkBatchOp()\
#         .setEndPoint("oss-cn-shanghai.aliyuncs.com")\
#         .setFilePath('oss://bucket_name/xxx/xxx.csv')\
#         .setOverwriteSink(True)\
#         .setAccessKeyId('*')\
#         .setAccessKeySecret('*')
### MaxCompute数据源
# OdpsSourceBatchOp() \
#         .setAccessId("*")\
#         .setAccessKey("*")\
#         .setEndPoint("http://service-corp.odps.aliyun-inc.com/api")\
#         .setProject("*")\
#         .setInputTableName("*")

查看人物关系表

edges.lazyPrint(5)
BatchOperator.execute()
source target weight
0 Enoch Evan 10
1 Enoch Gregary 2
2 Gregary Hale 6
3 Evan Hugo 2
4 Evan Jeff 4


查看离散变量的统计

edges.select('source, target').lazyVizDive()
BatchOperator.execute()

image.png

查看人物关系表统计信息

edges.lazyPrintStatistics()
BatchOperator.execute()
Summary: 
|colName|count|missing|sum|  mean|variance|min|max|
|-------|-----|-------|---|------|--------|---|---|
| source|   16|      0|NaN|   NaN|     NaN|NaN|NaN|
| target|   16|      0|NaN|   NaN|     NaN|NaN|NaN|
| weight|   16|      0| 77|4.8125|  7.3625|  1| 11|

查看人物关系表统计面板

edges.lazyVizStatistics()
BatchOperator.execute()

image.png

已知用户标签表

df_labeled_vertices = pd.DataFrame([
    ["Enoch", "信用用户", 1.0],
    ["Evan", "欺诈用户", 0.8]
 ])
labeled_vertices = BatchOperator.fromDataframe(df_labeled_vertices, schemaStr='vertices string, labels string, weight double')
labeled_vertices.print()
vertices labels weight
0 Enoch 信用用户 1
1 Evan 欺诈用户 0.8

使用图算法判断用户是否是欺诈用户

分为三步,


第一步,最大联通子图

通过最大联通子图组件将数据中的群体分为两部分,并赋予group_id。然后通过filter和JOIN去除图中的无关联人员。

最大联通子图组件可以查找具有通联关系的最大集合,从而排除团队中与风控无关的人。

# 通过联通子图找到无关人员
connected_components = edges\
    .link(
          ConnectedComponentsBatchOp()\
            .setEdgeSourceCol("source")\
            .setEdgeTargetCol("target")\
    )\
    .lazyPrint(title="【连通子图】") 
BatchOperator.execute()
【连通子图】
node groupId
0 Enoch 0
1 Evan 0
2 Gregary 0
3 Hale 0
4 Hugo 0
5 Jeff 0
6 Keith 0
7 Leif 0
8 Lionel 0
9 Mick 0
10 Noah 0
11 Parker 11
12 Rex 11
13 Stan 11

画成下图:

40-2.png

如上图所示,结果有两组,groupId=0和groupId=11,可以看出groupId=11中没有已标记的欺诈用户和诚信用户,因此认为groupId=11是无关联人员,需要去掉。

# 过滤groupId=0的用户
selected_nodes = connected_components\
    .filter("groupId=0") \
    .lazyPrint(5, title="【选择 group 0】") 
BatchOperator.execute()
【选择 group 0】
node groupId
0 Enoch 0
1 Evan 0
2 Gregary 0
3 Hale 0
4 Hugo 0
# 使用Join, 去掉无关人员
join1 = JoinBatchOp()\
    .setJoinPredicate("source=node")\
    .setSelectClause("source, target, weight")\
    .linkFrom(edges, selected_nodes)
filtered_edges = JoinBatchOp()\
    .setJoinPredicate("target=node")\
    .setSelectClause("source, target, weight")\
    .linkFrom(join1, selected_nodes)\
    .lazyPrint(title="【过滤后的边】")
BatchOperator.execute()
【过滤后的边】
source target weight
0 Enoch Evan 10
1 Enoch Gregary 2
2 Gregary Hale 6
3 Evan Hugo 2
4 Evan Jeff 4
5 Hale Jeff 11
6 Gregary Keith 7
7 Jeff Keith 5
8 Keith Leif 3
9 Keith Lionel 1
10 Leif Mick 4
11 Mick Noah 5
12 Lionel Noah 5

第二步,探查每个人的一度人脉及二度人脉等关系

  • 单元最短路径组件的输出结果中,distance表示Enoch通过几个人可以联络到目标人
# 指定source(源头) = 'Enoch'
filtered_edges.link(\
      SingleSourceShortestPathBatchOp()\
        .setIsUndirectedGraph(True)\
        .setEdgeSourceCol("source")\
        .setEdgeTargetCol("target")\
        .setEdgeWeightCol("weight")\
        .setSourcePoint("Enoch")\
    )\
    .lazyPrint(title="【单源最短路径】")
BatchOperator.execute()
【单源最短路径】
vertex distance
0 Enoch 0
1 Evan 10
2 Gregary 2
3 Hale 8
4 Hugo 12
5 Jeff 14
6 Keith 9
7 Leif 12
8 Lionel 10
9 Mick 16
10 Noah 15

第三步,使用标签传播确定未标记点的标签

标签传播分类为半监督的分类算法,原理为用已标记节点的标签信息去预测未标记节点的标签信息。

在算法执行过程中,每个节点的标签按相似度传播给相邻节点,在节点传播的每一步,每个节点根据相邻节点的标签来更新自己的标签, 与该节点相似度越大,其相邻节点对其标注的影响权值越大,相似节点的标签越趋于一致,其标签就越容易传播。 在标签传播过程中,保持已标注数据的标签不变,使其像一个源头把标签传向未标注数据。

最终,当迭代过程结束时,相似节点的概率分布也趋于相似,可以划分到同一个类别中,从而完成标签传播过程

# 标签传播算法
CommunityDetectionClassifyBatchOp()\
    .setIsUndirectedGraph(True)\
    .setEdgeSourceCol("source")\
    .setEdgeTargetCol("target")\
    .setEdgeWeightCol("weight")\
    .setVertexCol("vertices")\
    .setVertexLabelCol("labels")\
    .linkFrom(filtered_edges, labeled_vertices)\
    .lazyPrint(title="【标签传播--过滤的节点】")
BatchOperator.execute()
【标签传播--过滤的节点】
vertex label
0 Enoch 信用用户
1 Evan 欺诈用户
2 Gregary 信用用户
3 Hale 欺诈用户
4 Hugo 欺诈用户
5 Jeff 欺诈用户
6 Keith 信用用户
7 Leif 信用用户
8 Lionel 信用用户
9 Mick 信用用户
10 Noah 信用用户


附录

相关实践学习
使用PAI-EAS一键部署ChatGLM及LangChain应用
本场景中主要介绍如何使用模型在线服务(PAI-EAS)部署ChatGLM的AI-Web应用以及启动WebUI进行模型推理,并通过LangChain集成自己的业务数据。
机器学习概览及常见算法
机器学习(Machine Learning, ML)是人工智能的核心,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能,它是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域。 本课程将带你入门机器学习,掌握机器学习的概念和常用的算法。
相关文章
|
消息中间件 运维 算法
【DSW Gallery】IsolationForest算法解决异常检测问题
IsolationForest 是一种无监督的异常检测算法, 用于对无 label 的数据进行异常检测,并且支持将 IsolationForest 模型部署成一个流服务,用来对实时数据进行异常检测。该 Demo 将介绍如何在 DSW 中使用 IsolationForest 算法解决异常检测问题。
【DSW Gallery】IsolationForest算法解决异常检测问题
|
消息中间件 运维 算法
【DSW Gallery】OneClassSVM 算法解决异常检测问题
OneClassSVM 是一种无监督的异常检测算法, 用于对无 label 的数据进行异常检测,并且支持将 OneClassSVM 模型部署成一个流服务,用来对实时数据进行异常检测。该D emo 将介绍如何在 DSW 中使用 OneClassSVM 算法解决异常检测问题。
【DSW Gallery】OneClassSVM 算法解决异常检测问题
|
分布式计算 算法 搜索推荐
【DSW Gallery】交替最小二乘算法解决推荐相关问题
ALS (Alternating Lease Square)交替最小二乘法是一种model based的协同过滤算法, 用于对评分矩阵进行因子分解,然后预测user对item的评分。 它通过观察到的所有用户给产品的打分,来推断每个用户的喜好并向用户推荐适合的产品。
【DSW Gallery】交替最小二乘算法解决推荐相关问题
|
机器学习/深度学习 算法 Python
使用DSW运行机器学习算法朴素贝叶斯
使用DSW运行机器学习算法朴素贝叶斯
201 0
使用DSW运行机器学习算法朴素贝叶斯
|
机器学习/深度学习 人工智能 算法
Interview:算法岗位面试—10.30上午上海某信息公司(偏图算法)技术面试之单链表反转、给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xcepti
Interview:算法岗位面试—10.30上午上海某信息公司(偏图算法)技术面试之单链表反转、给定整型数组和目标值 二分法查找+下午上海某金融公司(AI岗位,上市)CTO和主管技术面试之Xcepti
|
算法
【图算法】金融风控实验
本文的业务场景如下: 已知的一份人物通联关系图,每两个人之间的连线表示两人有一定关系,可以是同事关系或者亲人关系等。已知“Enoch”是信用用户,"Evan"是欺诈用户,计算出其它人的信用指数。通过图算法,可以算出图中每个人是欺诈用户的概率,这个数据可以方便相关机构做风控。<br />数据源:风控数据<br />数据大小:896 B<br />字段数量:3<br />使用组件:SQL脚本,读数据表,JOIN<br />
4219 0
|
算法
【图算法】金融风控实验_997
jjljljlkjlj<br />数据源:<br />数据大小:896 B<br />字段数量:3<br />使用组件:SQL脚本,读数据表,JOIN<br />
909 0
|
7月前
|
存储 算法 测试技术
☆打卡算法☆LeetCode 133. 克隆图 算法解析
☆打卡算法☆LeetCode 133. 克隆图 算法解析
|
6月前
|
数据采集 算法 Java
Java数据结构与算法:图算法之广度优先搜索(BFS)
Java数据结构与算法:图算法之广度优先搜索(BFS)
|
6月前
|
算法 Java
Java数据结构与算法:图算法之深度优先搜索(DFS)
Java数据结构与算法:图算法之深度优先搜索(DFS)