业务背景
随着机器学习慢慢得业界承认,不少银行开始引入机器学习模型辅助规则引擎作决策,银行也作不少离线机器学习模型探索,效果都不错,可是却不多最后应用于在线环境,主要有如下几个缘由git
- 在风控场景,在线推理须要高性能,要求tp99 20ms,大部分模型性能很难达到
- 特征实效性要求高,基于真正滑动时间窗口作时序特征,大部分的基础设施没法知足
- 特征计算复杂且量大,上线成本很是高
- 离线特征计算与在线一致性保持困难,最终出现离线效果好,在线效果差状况
今天做为一个机器学习应用开发者,来告诉你们基于openmldb(https://github.com/4paradigm/OpenMLDB)是如何解决这些问题的github
如何使用OpenMLDB解决一致性问题
在没有使用OpenMLDB以前,完成一个反欺诈模型上线项目须要作如下事情去解决一致性问题sql
- 由于数据科学家离线使用SQL处理数据,而再在线须要实时计算特征,须要转写特征方案,就须要和数据科学家对齐特征处理逻辑,还须要考虑数据科学家方案变化的风险
- 根据反欺诈在线系统架构设计一套在线适合实时数据处理架构
- 须要人肉开发每个特征处理逻辑,每一个特征方案若是几千特征,会有大量开发成本,若是要对接多个模式是不可能的
在这个过程当中特征处理会消耗大量时间去对齐,有时候还会由于特征没法上线砍掉科学家的部分特征,而使用OpenMLDB以后,数据科学家的SQL特征处理逻辑可以直接给我使用,也就是说我只用作一件事情,拿着数据科学家的sql 扔到OpenMLDB里面执行拿到结果作模型推理,不再用关心数据科学家的特征处理逻辑是什么,因此OpenMLDB给我带来的好处数据库
- 不用理解数据科学家的特征方案逻辑,即便方案调整,我也只须要更新SQL到OpenMLDB里面就行
- 不用设计整套在线数据计算流,使用OpenMLDB让我感受就像使用MySQL开发传统应用同样简单
- 告别人肉开发特征,人生苦短,开发机器学习应用我用OpenMLDB
这里你们可能会好奇,OpenMLDB是如何作到一个SQL不用作任何修改就能批量和实时执行,由于OpenMLDB支持两种执行模式架构
- 批量模式,针对训练过程产生样本,相似传统数据库执行SQL
- 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,影响起性能的因素函数
- 时间窗口里面数据条数
- 特征个数
由于特征个数是特定的,因此咱们测试在不一样条数的时间窗口的性能表现性能
使用OpenMLDB在线业务效果
业务效果,是你们很是关心的事情,目前我上线了多个银行的反欺诈场景,在线效果与离线评估效果保持了一致,模型效果对比客户的专家规则有2~8提高,在一样的召回率状况下,客户很是承认咱们的工做,但愿个人分享可以帮助你们学习
关于OpenMLDB
OpenMLDB是一个面向机器学习应用提供正确、高效数据供给的开源数据库。除了超过10倍的机器学习数据开发效率的提高,OpenMLDB也提供了统一的计算与存储引擎减小开发运维的复杂性与整体成本。
欢迎你们参与到https://github.com/4paradigm/OpenMLDB 社区中