【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「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.mzph.cn/news/66628.shtml

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

相关文章

# Go学习-Day9

文章目录 Channel声明存入取出一个简单的死锁分析 个人博客&#xff1a;CSDN博客 Channel Channel本质是一个队列多goroutine访问时不需要加锁&#xff0c;Channel天然线程安全channel有类型&#xff0c;只能写入相同类型channel是引用类型channel必须初始化才能写入数据&…

pandas数据分析之数据绘图

一图胜千言&#xff0c;将信息可视化&#xff08;绘图&#xff09;是数据分析中最重要的工作之一。它除了让人们对数据更加直观以外&#xff0c;还可以帮助我们找出异常值、必要的数据转换、得出有关模型的想法等等。pandas 在数据分析、数据可视化方面有着较为广泛的应用。本文…

使用MDK5的一些偏僻使用方法和谋个功能的作用

程序下载后无法运行 需要勾选如下库&#xff0c;是优化后的库&#xff1b; MicroLib和标准C库之间的主要区别是: 1、MicroLib是专为深度嵌入式应用程序而设计的。 2、MicroLib经过优化&#xff0c;比使用ARM标准库使用更少的代码和数据内存。 3、MicroLib被设计成在没有操作…

Windows安装配置Rust(附CLion配置与运行)

Windows安装配置Rust&#xff08;附CLion配置与运行&#xff09; 前言一、下载二、安装三、配置标准库&#xff01;&#xff01;&#xff01;四、使用 CLion 运行 rust1、新建rust项目2、配置运行环境3、运行 前言 本文以 windows 安装为例&#xff0c;配置编译器为 minGW&…

Linux知识点 -- Linux多线程(四)

Linux知识点 – Linux多线程&#xff08;四&#xff09; 文章目录 Linux知识点 -- Linux多线程&#xff08;四&#xff09;一、线程池1.概念2.实现3.单例模式的线程池 二、STL、智能指针和线程安全1.STL的容器是否是线程安全的2.智能指针是否是线程安全的 三、其他常见的各种锁…

boringssl EVP_aes_128_ecb实现

最近学习boringssl&#xff0c;发现没找到EVP_aes_128_ecb在哪里实现的 饶了一大圈&#xff0c;发现它的定义很无语 #define EVP_CIPHER_FUNCTION(keybits, mode) \const EVP_CIPHER *EVP_aes_##keybits##_##mode(void) { \return aes_##keybits##_##mode##_gene…

Shiro整合SpringBoot,实战下的应用场景

文章目录 前言一、springBootshiro环境准备1.数据库2.ssmp环境搭建3.实体类4.三层搭建5.初始化测试数据 二、Shiro过滤器1.Shiro认证过滤器2.Shiro授权过滤器 三、springBootshiro身份认证1.创建Realm,重写认证方法doGetAuthenticationInfo2.创建shiro配置类3.Postman测试 四、…

什么是分布式系统?

分布式系统是由多个独立的计算机或计算节点组成的系统&#xff0c;这些节点通过消息传递或共享数据的方式进行协调和通信&#xff0c;以实现共同的目标。分布式系统的设计目标是提高系统的可靠性、可扩展性、性能和容错性。 在一个分布式系统中&#xff0c;各个计算机节点之间…

财报解读:迈向高端化,珍酒李渡如何持续讲好品牌故事?

2023年上半年&#xff0c;尤其是第二季度&#xff0c;白酒行业淡季属性较为明显。对于市场情况&#xff0c;中国酒业协会《2023中国白酒市场中期研究报告》也有所披露&#xff1a;约40.91%的受访者反馈春节后平日的白酒消费量有所减少&#xff0c;约31.82%的受访者反馈五一期间…

mysql调优小计

1.选择最合适的字段属性&#xff1a;类型、⻓度、是否允许NULL等&#xff1b;尽量把字段设为not null&#xff0c;⼀⾯查询时对⽐是否为null&#xff1b; 2.要尽量避免全表扫描&#xff0c;⾸先应考虑在 where 及 order by 涉及的列上建⽴索引。 3.应尽量避免在 where ⼦句中对…

python调用git出错:ImportError: Failed to initialize: Bad git executable.

报错信息 #报错信息 Traceback (most recent call last): File “”, line 1, in File “C:\Python27\lib\site-packages\git_init_.py”, line 85, in raise ImportError(‘Failed to initialize: {0}’.format(exc)) ImportError: Failed to initialize: Bad git executab…

锂电池充电电路方案

锂电池充电电路一 原理图如下 都是比较小的&#xff0c;SOT-23-6 封装 此方案的优势是器件可以扩容&#xff0c;也就是可以替换成容量更大的mos管。 锂电池充电电路二 锂电池充电电路三 注意线的粗细。 引脚说明 锂电池电量检测电路 键盘上的电量检测电路原理图 电量检…

L1-051 打折(Python实现) 测试点全过

前言&#xff1a; {\color{Blue}前言&#xff1a;} 前言&#xff1a; 本系列题使用的是&#xff0c;“PTA中的团体程序设计天梯赛——练习集”的题库&#xff0c;难度有L1、L2、L3三个等级&#xff0c;分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度&#xff0c;…

Flutter状态管理 — 探索Flutter中的状态

前言 随着响应式编程的理念&Flutter被大众所了解以来&#xff0c;状态管理一直是一个引人深思的话题。如果想要学习好Flutter这样的响应式的编程框架就一定是离不开状态管理的。我遇到过很多没有了解过响应式编程框架的&#xff0c;或者从事后端开发&#xff0c;自己想用F…

Java 中的移位运算符(Shift Operator)

针对移位&#xff08;Shift Operator&#xff09;操作符是最基本的操作符之一&#xff0c;几乎每种编程语言都包含这一操作符。 同时我们对移位运算又会觉得比较陌生和困惑&#xff0c;这是因为移位运算除了在 JDK 底层你会遇到不少&#xff0c;还有就是在各种奇葩的面试题会遇…

Pygame中Trivia游戏解析6-5

3.4 next_question()函数 next_question()函数的作用是显示下一个题目。当用户按下“确认”按键后&#xff0c;将会显示下一个题目&#xff0c;代码如下所示。 if self.scored or self.failed:self.scored Falseself.failed Falseself.correct 0self.colors [white,white…

国标GB28181视频平台EasyGBS国标视频云平台级联到EasyCVR,上级平台无法播放通道视频的问题解决方案

EasyGBS国标视频云平台是基于国标GB28181协议的视频能力兼服务平台&#xff0c;可实现的视频能力包括将设备通过国标GB28181协议接入、流媒体转码、处理及分发、直播录像、语音对讲、云存储、告警、平台级联等功能。其中&#xff0c;平台级联功能是指平台与平台之间可以通过国标…

计算机竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

文章目录 0 简介1 二维码检测2 算法实现流程3 特征提取4 特征分类5 后处理6 代码实现5 最后 0 简介 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于机器学习的二维码识别检测 - opencv 二维码 识别检测 机器视觉 该项目较为新颖&#xff0c;适合作为竞赛课…

解决npm install报错: No module named gyp

今天运行一个以前vue项目&#xff0c;启动时报错如下&#xff1a; ERROR Failed to compile with 1 error上午10:19:33 error in ./src/App.vue?vue&typestyle&index0&langscss& Syntax Error: Error: Missing binding D:\javacode\Springboot-MiMall-RSA\V…

#include <graphics.h> #include <conio.h> #include<stdlib.h>无法打开源文件解决方案

一、问题描述 学习数据结构链表的过程中&#xff0c;在编写漫天星星闪烁的代码时&#xff0c;遇到了如下图所示的报错&#xff0c;#include <graphics.h> 、 #include <conio.h> 等无法打开源文件。 并且主程序中initgraph(初始化画布)、setfillcolor&#xff08;…