OpenMLDB在银行上线事中交易反欺诈模型实践

原创
07/13 19:13
阅读数 3.1K

业务背景

随着机器学习慢慢得业界认可,很多银行开始引入机器学习模型辅助规则引擎做决策,银行也做很多离线机器学习模型探索,效果都不错,但是却很少最后应用于在线环境,主要有以下几个原因

  1. 在风控场景,在线推理需要高性能,要求tp99 20ms,大部分模型性能很难达到
  2. 特征实效性要求高,基于真正滑动时间窗口做时序特征,大部分的基础设施无法满足
  3. 特征计算复杂且量大,上线成本非常高
  4. 离线特征计算与在线一致性保持困难,最终出现离线效果好,在线效果差情况

今天作为一个机器学习应用开发者,来告诉大家基于openmldb(https://github.com/4paradigm/OpenMLDB)是如何解决这些问题的

如何使用OpenMLDB解决一致性问题

在没有使用OpenMLDB之前,完成一个反欺诈模型上线项目需要做以下事情去解决一致性问题

  1. 因为数据科学家离线使用SQL处理数据,而再在线需要实时计算特征,需要转写特征方案,就需要和数据科学家对齐特征处理逻辑,还需要考虑数据科学家方案变化的风险
  2. 根据反欺诈在线系统架构设计一套在线适合实时数据处理架构
  3. 需要人肉开发每一个特征处理逻辑,每个特征方案如果几千特征,会有大量开发成本,如果要对接多个模式是不可能的

在这个过程中特征处理会消耗大量时间去对齐,有时候还会因为特征无法上线砍掉科学家的部分特征,而使用OpenMLDB之后,数据科学家的SQL特征处理逻辑能够直接给我使用,也就是说我只用做一件事情,拿着数据科学家的sql 扔到OpenMLDB里面执行拿到结果做模型推理,再也不用关心数据科学家的特征处理逻辑是什么,所以OpenMLDB给我带来的好处

  1. 不用理解数据科学家的特征方案逻辑,即使方案调整,我也只需要更新SQL到OpenMLDB里面就行
  2. 不用设计整套在线数据计算流,使用OpenMLDB让我感觉就像使用MySQL开发传统应用一样简单
  3. 告别人肉开发特征,人生苦短,开发机器学习应用我用OpenMLDB

这里大家可能会好奇,OpenMLDB是如何做到一个SQL不用做任何修改就能批量和实时执行,因为OpenMLDB支持两种执行模式

  1. 批量模式,针对训练过程产生样本,类似传统数据库执行SQL
  2. Request模式,针对推理过程实时产生样本,只会计算与请求相关的特征

如何使用OpenMLDB解决性能问题

OpenMLDB自带了一些列编译优化技术,比如函数动态循环绑定以及在线部分数据完全是in-memory的,能够保证非常高执行性能,以下是OpenMLDB github自带的性能数据

我们可以看出OpenMLDB的执行性能比SingleStore和Hana有很大的优势,接下来我们看一个实际SQL执行效率,SQL如下

select * from (select card_no, trx_time, merchant_id, month(trx_time) as fea_month, 
dayofmonth(trx_time) as fea_day_of_month, hour(trx_time) as fea_hour, 
week(trx_time) as fea_week, substr(card_no, 1, 6) as card_no_prefix,
max(trx_amt) over w30d as w30d_trx_max , min(trx_amt) over w30d as w30d_trx_min, 
sum(trx_amt) over w30d, avg(trx_amt) over w30d, max(usd_amt) over w30d, 
min(usd_amt) over w30d, sum(usd_amt) over w30d, avg(usd_amt) over w30d, 
max(org_amt) over w30d, min(org_amt) over w30d, sum(org_amt) over w30d, 
avg(org_amt) over w30d, distinct_count(merchant_id) over w30d, 
count(merchant_id) over w30d, distinct_count(term_city) over w30d, 
count(term_city) over w30d, max(trx_amt) over w10d, min(trx_amt) over w10d, 
sum(trx_amt) over w10d, avg(trx_amt) over w10d, max(usd_amt) over w10d, 
min(usd_amt) over w10d, sum(usd_amt) over w10d, avg(usd_amt) over w10d, 
max(org_amt) over w10d, min(org_amt) over w10d, sum(org_amt) over w10d,
avg(org_amt) over w10d, distinct_count(merchant_id) over w10d, 
count(merchant_id) over w10d, distinct_count(term_city) over w10d,
count(term_city) over w10d
from tran window w30d as (PARTITION BY tran.card_no ORDER BY tran.trx_time ROWS_RANGE BETWEEN 30d PRECEDING AND CURRENT ROW), 
w10d as (PARTITION BY tran.card_no ORDER BY tran.trx_time ROWS_RANGE BETWEEN 10d PRECEDING AND CURRENT ROW)) as trx_fe 
last join card_info order by card_info.crd_lst_isu_dte on trx_fe.card_no = card_info.crd_nbr and trx_fe.trx_time >= card_info.crd_lst_isu_dte ;

先分析一下这个SQL,影响起性能的因素

  1. 时间窗口里面数据条数
  2. 特征个数

因为特征个数是特定的,所以我们测试在不同条数的时间窗口的性能表现

使用OpenMLDB在线业务效果

业务效果,是大家非常关心的事情,目前我上线了多个银行的反欺诈场景,在线效果与离线评估效果保持了一致,模型效果对比客户的专家规则有2~8提升,在同样的召回率情况下,客户非常认可我们的工作,希望我的分享能够帮助大家

关于OpenMLDB

OpenMLDB是一个面向机器学习应用提供正确、高效数据供给的开源数据库。除了超过10倍的机器学习数据开发效率的提升,OpenMLDB也提供了统一的计算与存储引擎减少开发运维的复杂性与总体成本。

欢迎大家参与到https://github.com/4paradigm/OpenMLDB 社区中

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部