業務背景
隨着機器學習慢慢得業界承認,不少銀行開始引入機器學習模型輔助規則引擎作決策,銀行也作不少離線機器學習模型探索,效果都不錯,可是卻不多最後應用於在線環境,主要有如下幾個緣由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 社區中