【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「NUFE」解题思路

第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。

本方案为【大规模金融图数据中异常风险行为模式挖掘】赛题的一等奖获奖方案,赛题地址:https://www.datafountain.cn/competitions/586(戳底部“阅读原文”可直达)

图片

获奖团队简介

团队名称:NUFE

团队成员:队长韩鲁峰,就职于南京财经大学,高级工程师。队员张斌,就职于南京财经大学,工程师。

团队荣誉:2018年华为软件精英挑战赛季军、2020年CCF BDCI 基于买方意向的货物撮合交易二等奖、2019华为云鲲鹏开发者大赛决赛第二名、2021 CCF BDCI大规模金融仿真图数据中金融交易环路查询的设计与性能优化二等奖。

所获奖项:一等奖

摘   要

图计算在金融场景的运用最为成熟,贷前审批、贷后管理、反欺诈、反洗钱等业务均对图计算能力有要求,包含但不限于k度邻居、找环、社区发现。业界常用的频繁子图挖掘算法可以帮助发现高频出现的子图结构,如何使用频繁子图挖掘算法高效地进行异常风险行为模式挖掘显得尤为重要。

本赛题要求在尽可能短的时间内挖掘出不小于频繁度(f >= 10000)的频繁子图模式集合。子图同构是NP难问题。虽然可以使用图的编码来代替同构计算,但是此类方法的复杂度也相当高,另外还存在历史结果的使用问题。

针对题目要求本文主要做了以下几个方面的工作:

  1. 在题目要求下输出准确的频繁模式以及模式对应的频繁度。

  2. 多次压缩编码数组的长度,可以遍历数据集一次求出就将所有的候选模式的频繁度求出。

  3. 重新构图,减少图结构大小,增加缓存命中率。

  4. 通过实验验证此方法的高效性,准确性。

关 键 词

子图同构,频繁模式,NP难问题

1 背景及算法介绍

1.1 背景介绍

频繁子图挖掘的两个难点是支持度的计算和候选子图的生成,支持度计算中的子图同构是NP 难题,虽然可以使用图的编码来代替同构测试但是此类方法的复杂度也相当高,另外还存在历史结果的使用问题。如果使用历史同构图的信息可以加快测试的速度,但是会极大增加存储量,反之不使用,在同构测试方面又会做大量的重复工作;候选子图生成如果没有高效的剪枝算法会产生大量的冗余结果,对存储和支持度的计算都是一个极大的考验。单一大图频繁子图挖掘当前已经多种算法,主要包括非精确挖掘算法(SUBDUE,SEus)、不相交子图挖掘算法(Grew,SiGram)、分布式挖掘算法(MRPF,MRSUB)和CSP 搜索挖掘算法(GRAMI[3])等。2014年提出的GRAMI算法将难点转为限制约束问题,该算法在单机频繁子图挖掘中效较好。本文简化的编码方式,先通过图拓展算出3阶候选模式,然后计算候选模式的MNI支持度作为最终模式的支持度。

1.2 算法介绍

赛题使用简化的金融仿真数据,数据为带有时间戳和金额的账户间交易、转账等数据。基于此数据自动挖掘出不小于频繁度(f >= 10000)的频繁子图模式集合。本次给到的图是属性图结构,判定子图同构的方法需要属性值匹配,严格匹配属性包括:名称、金额、策略名和业务编码。本文算法流程图如图1,各个步骤的细节将在下一章详细介绍。

图片

图1

2 本方案流程

2.1 读取数据及优化

点数据和边数据如下所示,点数据中有效字段为id和name,边数据中有效字段为id,金额,策略名和业务编码。数据分析后发现,点数据中name只有三种类型Jobs、Mike和John,需要将name映射成{0,1,2}的数字方便编码,此处我们计算name每个字节的ASCII和,映射到固定数字上,而不需要用Hash表。边数据中策略名和业务编码只有最后一个字符不一样,所以解析这两个字段时只用解析最后一个字符,这样既可以方便后续的编码,又可以节省解析时间。

点数据: 

799999,Jobs,1587334106293,0

799998,John,1585916964769,0

799997,Jobs,1587852713474,0

799996,Jobs,1585425941502,0

799995,Mike,1586242334882,0

799994,Jobs,1584384932575,0

边数据:

684821,434860,1590492254126,5.0,strategy_name-4,1590492251120278,buscode3,,,,,,

684821,434860,1591061355388,0.0,strategy_name-4,159106135809535,buscode3,,,,,,

684821,434860,1590945232703,33.0,strategy_name-4,159094523696782,buscode3,,,,,,

349837,98007,1587894603848,2.0,strategy_name-4,158789460447921,buscode1,,,,,,

181713,317857,1588705807550,40.0,strategy_name-4,158870580500216,buscode2,,,,,,

181713,317857,1588326392299,10.0,strategy_name-4,158832639552221,buscode2,,,,,,

104178,101658,1589394253501,11.0,strategy_name-6,158939425206018,buscode1,,,,,,

我们将代码优化前进行了对比测试,如下图2。可发现优化后无论是单线程还是多线程的读取速度都得到显著提升。

图片

图2

2.2 图剪枝及重构

Grami在解决单一大图频繁子图挖掘性能表现优异,它采用CSP计算子图同构来代替存储实例。并且根据问题的定义,在计算支持度时,并不计算子图的精确的支持度,而是只证明子图的支持度大于阈值就停止。本文采用类似的方法,在计算一阶子图频繁度时并不精确算出频繁度,只计算其频繁度的最大值,将不满足阈值的边全部删掉,保证频繁模式都在剩下边拓展图中即可。为了提高CPU缓存的命中率,我们对剩下的边重新构图,去掉不可能存在满足条件的3阶子图的边,此外我们把每条边数据都存在uint64_t中,提高缓存加载条数。虽然图重构增加了此部分的时间开销,但在后续三阶子图查找过程中节省了很多的时间,整体上程序运行速度得到了提高。

#define MERGE(a,b,c,d) ((uint64_t)(uint64_t(a) << 32u|uint64_t(b)<<16u|uint64_t(c)<<8u| uint64_t(d)))

#define AIM(a) (uint32_t(a >> 32u))

#define AMT(a) (uint16_t(a>>16u))

#define STRATEGY(a) (uint8_t(a>>8u))

#define BUSCODE(a) (uint8_t(a))

单条边的编码我们采用进制编码的形式,具体实现过程如下:

radix=max_amt*max_buscode*max_strategy*max_name*max_name;

radix_=max_amt*max_buscode*max_strategy*max_name;

radix__=max_amt*max_buscode*max_strategy;

radix___=max_buscode*max_strategy;

radix____=max_buscode;

uint32_tcode=0;

code+=radix_*account_ids[src_id];

code+=radix__*account_ids[aim_ids[edge_id]];

code+=radix___*amts[edge_id];

code+=radix____*strategy_names[edge_id];

code+=buscodes[edge_id];

2.3 确定候选模式

一阶子图使用DFS向后拓展,拓展过程不精确计算频繁模式的支持度。虽然会存在不满足MNI支持度的子图,但时可以确保正确答案的频繁模式集合是候选模式集合的子集。3阶子图不能直接使用上面的进制编码,需要将一阶的进制编码重新编码,一阶编码中存在大量小于阈值的编码,所以可以将满足阈值的编码重新编码到成新整数,减小最大编码的值,使三阶子图也可以使用上述编码方法,只是每条边都需要二次编码。具体过程如下图3,其中阈值为10000,对于小于阈值的边,不需要二次编码。

图片

图3

2.4 计算频繁度

通过上述方法求出候选模式后,分别求出每个模式的频繁度。正常情况下如果有n种候选模式,需要搜索n次图,由于本题中候选模式较少,可以通过二维数组遍历一次图求出所有模式的频繁度。这里需要将三阶子图编码进行再次编码。减小二维数组的规模,编码方式参考图3,去掉不满足条件的模式编码。在计算频繁度时,采用MNI(minimum image based suppor)支持度,就是找到节点映射数量的最小值。具体过程如图4,图中MNI值为3。

图片

图4

2.5 充分利用并行运算

在程序的各个阶段,都尽量使用并行运算,我们使用OpenMP并行库支持程序的任意线程的并行化,该并行库编降低的并行编程的难度,让我们把时间都投入到优化算法本身,而并非并发编程。 

3 实验结果与分析

本题数据集有四个文件,2个点文件2个边文件:

account:顶点数:800000

card:顶点数:600000

account_to_card:边数:3410191

account_to_account:边数:6010512

图片

表1:执行时间

通过表1可以看出本方案执行时间比第二名优化了20%,证明本文的优化方案效果更加明显。

致谢

这次比赛让我们深入了解了性能优化相关算法,通过阅读大量的前沿论文,以及自我思考,不断突破自己的极限分数。感谢主办方提供这样的平台,让我们有幸参与其中,与其他选手共同比拼进步。感谢出题方出了一道这么有趣的题目,从实际业务需求抽象成赛题。感谢工作人员的辛苦答疑,让我们在比赛中更轻松更快速的解决问题。希望CCF BDCI越办越好。

参考

[1]   Wang Wei Zhou Haofeng, Yuan Qingqing, etc., frequent pattern mining based on graph theory[J]. Journal of computer research and development, 2005, and (2) : 230-235.王伟,周浩峰,袁青青,等。基于图论的明频繁模式[J]。计算机研究与发展,2005,42(2):230-235。

[2] 李先通,李建中,高宏.一种高效频繁子图挖掘算法[J].软件学报,2007,18(10):2469-2480.LI Xiantong, LI Jianzhong, GAO Hong. AN efficient frequent subgraph mining algorithm [J]. Journal of Software,2007, 18(10) : 2469-2480.

[3]  Bhuiyan M A, Hasan M A. An Iterative MapReduce Based Frequent Subgraph Mining Algorithm [J]. Knowledge & Data Engineering IEEE Transactions on, 2015, 27(3):608-620.


我是行业领先的大数据竞赛平台 @DataFountain ,欢迎广大政企校军单位合作办赛,推动优秀数据人才揭榜挂帅!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/91680.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT 总结数据分析的所有知识点

ChatGPT功能非常多,特别是对某个行业,某个方向,某个技术进行总结那是相当专业的。 如下图。 直接用一个指令便总结出来数据分析当中的所有知识点内容。 AIGC ChatGPT ,BI商业智能, 可视化Tableau, PowerBI, FineReport, 数据库Mysql Oracle, Office, Python ,ETL Ex…

MongoDB实验——MongoDB shell操作

MongoDB shell操作 实验原理 MongoDB shell是一个可执行文件&#xff0c;是MongoDB自带的一个交互式JavaScript shell&#xff0c;位于MongoDB安装路径下的/bin文件夹中。要启动MongoDB shell&#xff0c;可执行命令mongo。这将在控制台提示符中启动该shell&#xff0c;Mongo…

OpenCV c++ 使用imshow显示灰色窗口

OpenCV使用imshow显示灰色窗口 原因是使用了system(‘pause’);函数&#xff0c;只需要将该函数去掉&#xff0c;使用opencv中的对应函数 waitKey(0) 即可实现同样效果。 system(“pause”); 改为&#xff1a; cv::waitKey(0); 显示效果&#xff1a;

学习JAVA打卡第四十八天

Math类 在编写程序时可能需要计算一个数的平方根、绝对值或获取一个随机数等。 Math类的常用方法 BigInteger类 程序如果需要处理特别大的整数就可以用Java.math包中的BigInteger类的对象。 可以构造public BigInteger&#xff08;string val&#xff09;构造一个十进制的B…

The Annotated Transformer(Attention Is All You Need)

"Attention is All You Need"[1] 一文中提出的Transformer网络结构最近引起了很多人的关注。Transformer不仅能够明显地提升翻译质量&#xff0c;还为许多NLP任务提供了新的结构。虽然原文写得很清楚&#xff0c;但实际上大家普遍反映很难正确地实现。 所以我们为此…

中间件环境搭建配置过程解读

中间件环境搭建 目录 中间件环境搭建xampp 搭建环境Tomcat环境配置安装mysql连接mysql 问题解决 xampp 搭建环境 安装xampp服务集成环境工具 官网地址下载项目压缩包&#xff0c;将项目文件夹放在xampp安装目录的htdocs文件夹下初始化xampp&#xff1a;运行目录内的setup_xamp…

Nuxt 菜鸟入门学习笔记五:CSS 样式

文章目录 本地样式表在组件内导入通过 Nuxt 配置 CSS 属性导入使用字体导入通过 NPM 发布的样式表 外部样式表动态添加样式表【高级】使用 Nitro 插件修改渲染的头部 使用预处理器单文件组件 SFC 样式类和样式绑定使用 v-bind 的动态样式Scoped StylesCSS Modules预处理器支持 …

电商数仓项目需求及架构设计

一、项目需求 1.用户行为数据采集平台搭建 2.业务数据采集平台搭建 3.数仓维度建模 4.统计指标 5.即席查询工具&#xff0c;随时进行指标分析 6.对集群性能进行监控&#xff0c;发生异常时报警&#xff08;第三方信息&#xff09; 7.元数据管理 8.质量监控 9.权限管理&#xff…

国产10米分辨率的卫星介绍、下载和处理教程

10米分辨率的资源卫星介绍、下载和处理教程 简介 说起免费的10米分辨率卫星影像,大家首先想到的是sentinel卫星。但其实还有我国的中巴地球资源卫星04星(CBERS04)。 中巴地球资源卫星(China Brazil Earth Resources Satellite, CBERS)是中国和巴西共同投资、联合研制的地球…

【ES】elasticsearch8.3.3

这里仅实践操作并根据实际问题进行记录笔记。 运行 ES8 我们需要在自己的电脑上安装好 Docker Desktop。接着我们运行如下的命令&#xff1a;出现两个异常&#xff0c;一个是需要使用winpty因为我使用win的docker desktop&#xff0c;另外一个问题是docker启动elasticsearchE…

LeetCode--HOT100题(46)

目录 题目描述&#xff1a;114. 二叉树展开为链表&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;114. 二叉树展开为链表&#xff08;中等&#xff09; 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链…

简单了解OSI网络模型

目录 一、协议是什么&#xff1f; 二、OSI七层模型 三、TCP/IP五层模型 一、协议是什么&#xff1f; 协议顾名思义就是通过大家伙一起协商讨论达成的统一规则和标准。网络协议就是规定用户数据信息如何在网络上传播以及实现某种网络技术所要遵循的统一标准和规则。 二、OSI…