1. 程式人生 > >風控用戶識別方法

風控用戶識別方法

item 方差 想去 大量數據 wan out ast def key

風控用戶識別方法

update:
18.1.1 :Frcwp已如期上線,滿足本文中的所有方法,歡迎拍磚

前言

因為工作方向相關,之前我也嘗試著在Google、arXiv、wikipedia等等地方搜一些風控識別的資料或者思路,但是事與願違的是,絕大多數的與風控算法都毫無關系,基本上都是推銷自己家的產品的,所以,我之前也嘗試著寫了一些方法的梳理,如:

  • 多算法識別撞庫刷券等異常用戶
  • 異常值識別與處理

但是在我前幾天再回過頭去看自己寫的這些東西的時候,作為一個老司機來說,我都不想去看一篇又一篇動則上千字的文章,理論交錯,文筆粗陋,正巧現在公司內部也有一個風控的項目,所以,我準備做一個開源的項目Frcwp

,核心在於:

  • 簡單操作,幾乎不用多少調參,自動識別異常點
  • 理論清晰,支持的方法多,兼容性好
  • 集成數據預處理的過程,減輕前置工作量

“糾結”了幾個朋友的情況下,一期已經完工,主要是搭建了最簡單的框架,我相信,這只是一個開始,歡迎大家試用,也歡迎每一個人來批評,更希望有想法的同學一起來做這個事情。


接下來,讓我們來講講,一期我們做了什麽?

核心我們一期做的異常點識別中,核心是利用的14年周誌華教授提出的isolation forest算法進行識別,詳細的理論部分請參見:Isolation Forest,重復說一個事情的意義也不大。這邊需要解釋幾點:

  • 具體是怎麽得到當前的算法流程的呢?
  • 為什麽用當前的算法進行識別而不用其他的識別算法?
  • 當前的設計下存在哪些問題?
  • 未來的方向會在哪邊?

讓我們來一一來回答這些問題。

為了用Isolation Forest而不用其他的識別算法?

在設計這套算法之前,我們其實是遇到了一個實際的業務問題,黑產撞庫。相信大家毫不陌生這個詞,無論是阿裏、京東、滴滴還是騰訊,被撞庫是一件普通了不能再普通的事情,“黑產”的人從第三方渠道,獲取到你歷史上的手機號和一些你曾經用的密碼,重復的登陸,暴力的嘗試,如果你的密碼設置的比較簡單,比如:“123456”,“qwerty”…非常容易被破解,然後再根據你歷史下單的情況,進行假冒“客服”退款,進行詐騙,百度一搜就有一堆這樣的新聞:

  • 頻發假冒電商客服
  • 當心!近期有人冒充假客服行騙 幾分鐘騙走市民八九萬元

所以,我們需要阻止“黑產”人員進行這樣的暴力破解,獲取用戶的資料,由此而引發了我們對這個問題的思考。我們在對這個問題分析的時候,巧妙的發現了如下的一些信息:
技術分享圖片

因為涉及公司機密,這邊隱去了具體坐標和值,很容易發現以下問題:

  • 正常扇面內數據分布密集,未知扇面內數據分布松散,異常扇面內數據分布稀疏
  • 正常扇面內的數據量占全量數據的絕大多數
  • 不存在明顯的分割線,正常扇面和異常扇面存在過度地帶

這個給了我們一些啟發,我們做了如下的分析:

  • 我們觀察了異常扇面內的用戶黑白比,如我們預計的黑白比為20:3,也就是說分布遠離大量數據點的用戶絕大多數存在問題
  • 為止區域的用戶黑白比為1:2,這說明在黑白用戶之間不存在明顯的界限,有交錯地帶
  • 正常區域內也存在黑名單用戶,比例在504:1,也就是說,我們劃分有一定識別能力,但是還是不能做到全量識別

綜合上述這些預先的處理,我們要用算法完成三件事情:
1.切分全量用戶,做到識別出正常,未知,異常用戶
2.識別出異常用戶和正常用戶之間的差異約束切割
3.在異常用戶+未知用戶裏面,找出利用差異約束切割出黑名單

為什麽用當前的算法進行識別而不用其他的識別算法?

切分數據的時候,我們這邊采用的是切比雪夫切割。非理工科的同學可能比較疑惑什麽是切比雪夫切割,這邊如果數據是正態下,箱式圖的Q3+3/2xQI作為上top點進行切割,大家就應該很熟悉了,其實利用的就是數據出現的概率。
技術分享圖片
上面這張圖很好的解釋了,在數據服從正態分布的情況下,出現數據值比均值+3x標準差要大的概率不足0.1%,所以,我們可以認為這些數據是異常點了。那現在出現了一個問題,日常數據分布都不一定是正態的,所以引出來了類似的切比雪夫理論,它用的是馬氏距離距離中心點的程度,詳細的馬氏距離理論見馬氏距離分布。

切分完成數據之後,我們要做尋找差異約束切割邏輯。從最上面的扇面圖,我們很容易發現,正常數據與異常數據之間的密度差異很明顯,所以如何識別密度差異的算法就是我們需要的,這邊我大概找了6、7種常見的切分方法,這邊主要講三種:isolation forest,lof,distance similarity。理論我之前也講過,貼上地址,不廢話了:密度算法。這邊主要展示效果差異:
技術分享圖片
通過68個數據集,很明顯的可以看出LOF的識別出來的用戶的異常用戶異常程度是低於Isolation Forest和Distince Similarity的,起碼在我們這些數據集樣本中,Isolation Forest和Distince Similarity識別效果差異不大,所以,我們再考慮了另一個性能問題:
技術分享圖片
我們用了CV=10的交叉檢驗,發現,平均下來,Isolation Forest識別速度是Distince Similarity的1/3以下。綜合上述,還有一些其他因素,最後我們選擇了Isoation Forest的方法。

當前的設計下存在哪些問題?

上面說的都是比較正面的問題,讓我們看看,有哪些缺點。
首先,從頭到尾,我們一直在圍繞密度差異這個問題,但是就我平時做的一些小爬蟲都知道,降低暴力獲取的速度,慢慢搞,這時候就以上的方法就無法做到有效的識別。除此之外,因為我們用了切比雪夫不等式,所以對其有概念的同學知道,算馬氏距離的時候需要算協方差矩陣,當數據量異常異常大(我測算的是12mx100)的時候計算資源緊張,可能算不出來;數據量異常異常小的時候feature嚴重共線性,也可能計算不出來。

未來的方向會在哪邊?

所以,後續我們會新增其他算法,支持過大過小情況下的識別方法。針對數據量過小的識別情況,我在V0.0.3版本下更新了一個簡單識別的方法,之後會優化更好的算法替代掉的。只要數據量太大無法計算的問題,我之後會采取矩陣切割分塊計算的方法,這個是後話了。

最後,我們以當前算法包的使用來結束整篇介紹:

1
2
#安裝
pip install Frcwp

自動識別過程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from Frcwp import Frcwp
traindata = pd.read_table(‘../路徑‘)#數據可以在https://github.com/sladesha/machine_learning/tree/master/data下的data_all.csv獲取
frc = Frcwp()
traindata = frc.changeformat(traindata, index=0)
# You can define your own outlier size , the details of these params can be got from ../Frcwp/Frcwp.py:
params = {
‘na_rate‘: 0.4,
‘single_dealed‘: 1,
‘is_scale‘: 0,
‘distince_method‘: ‘Maha‘,
‘outlier_rate‘: 0.05,
‘strange_rate‘: 0.15,
‘nestimators‘: 150,
‘contamination‘: 0.2
}

# train the frc model
frc.fit(traindata, **params)

相關的結果顯示:

1
2
3
4
5
6
7
8
9
# predict outliers with the trained frc model
predict_params = {
‘output‘: 20,
‘is_whole‘: 1
}
frc.predict(frc.potentialdata_set, **predict_params)

# if you want get the whole probability of your potential outliers
frc.similarity_label

以上部分內容截取自我的github,希望對大家有一些幫助。

風控用戶識別方法