前言
友情提示摹闽,這篇文章很長,光是滑動到底部就需要好幾秒根盒,請合理安排閱讀時間钳幅。
最近在學(xué)習(xí)異常值探測(Outlier Detection)。
家里的書架上有一本叫《數(shù)據(jù)挖掘與R語言》的書炎滞,作者是Luís Torgo敢艰。這本書給出了用R做數(shù)據(jù)挖掘的四個案例,其中一個正好是欺詐交易探測厂榛。
這個案例給出的數(shù)據(jù)預(yù)處理過程非常棒盖矫,思路很值得學(xué)習(xí),所以這部分我跟著案例击奶,把處理過程自己實現(xiàn)了一遍辈双。這篇文章的前半一部分是分享這個數(shù)據(jù)預(yù)處理過程。
在算法部分柜砾,作者給出了好幾類不同的異常值探測方法湃望。這篇文章的后半部分討論其中一種探測方法(局部異常因子算法),及其分析效果痰驱。
順帶一提证芭,這本書出得早(英文版出版于2011年,中文版出版于2012年)担映,當(dāng)時一些很elegant的R庫還不成熟废士,作者在書中使用的代碼比較舊,大家如果想照著案例把分析過程實現(xiàn)一遍蝇完,我個人覺得不需要完全按作者的代碼走官硝,太繞。
然后就是短蜕,作者并不是系統(tǒng)地介紹各個數(shù)據(jù)挖掘方法氢架,而是圍繞案例,把能用到的算法都聊一遍朋魔,我個人覺得不是很適合新手岖研。(這本書是我在出國前買的,當(dāng)時對數(shù)據(jù)挖掘的概念還很模糊警检,看這本書基本上是一頭霧水孙援。當(dāng)然,現(xiàn)在依然還是不能全都看懂……)
另外扇雕,這本書的翻譯實在是太一言難盡了赃磨,機械工業(yè)出版社一生黑,對這本書非常感興趣的朋友洼裤,我極力推薦你們?nèi)タ从⑽脑妗?/p>
廢話結(jié)束邻辉,以下是我關(guān)于這個分析案例的學(xué)習(xí)筆記溪王。
數(shù)據(jù)預(yù)處理
0. 分析工具與數(shù)據(jù)來源
- 分析工具:R
- 主要用到的庫:
tidyverse
,ggplot2
(作者沒有用這些庫值骇,而是用R的基本庫) - 數(shù)據(jù)來源:
library(DMwR)
data(sales)
1. 數(shù)據(jù)集
先來看看分析中使用的數(shù)據(jù)集莹菱。
上圖是數(shù)據(jù)集的前14行。整個數(shù)據(jù)集一共有401146行吱瘩。
這個數(shù)據(jù)集的每一行道伟,表示一份關(guān)于某銷售員銷售某款產(chǎn)品的銷售報告,具體特征包括:
- ID:銷售員id使碾,一個銷售員可以銷售多款產(chǎn)品蜜徽。
- Prod:產(chǎn)品id,一款產(chǎn)品可以被多個銷售員售賣票摇。
- Quant:銷售員上報的產(chǎn)品銷售數(shù)量拘鞋。
- Val:銷售員上報的產(chǎn)品銷售總額。
- Insp:報告標(biāo)簽矢门。ok - 公司檢查了該銷售報告并認(rèn)為其真實有效盆色;fraud - 公司認(rèn)為該報告為欺詐報告;unkn - 該報告未經(jīng)過公司審查祟剔。
Insp是此次欺詐交易探測任務(wù)的目標(biāo)特征隔躲,即,我們想要知道物延,在這些unkn的報告中宣旱,哪些是ok的哪些是fraud的。
2. 數(shù)據(jù)基本情況
明白數(shù)據(jù)集的基本構(gòu)成之后叛薯,現(xiàn)在我們來進一步認(rèn)識一下這份數(shù)據(jù)浑吟。
2.1 數(shù)據(jù)概述
先來summarize一下各個特征。
報告數(shù)量最多的銷售員是v431案训,有10159份銷售報告买置;報告談及最多的產(chǎn)品是p1125粪糙,有3923份報告是關(guān)于它的强霎;在產(chǎn)品銷售量上,數(shù)據(jù)可能是right-skewed的蓉冈,注意到平均數(shù)(mean)比中位數(shù)(median)要大很多;同理,在銷售額上杭攻,數(shù)據(jù)也可能是right-tailed的钝侠;在報告標(biāo)簽方面,unkn比另兩者在數(shù)量上要大很多伐弹。
另外拉馋,注意Quant和Val是有不少缺失值的(NA's)。既然有缺失值,那么不妨順帶看一下數(shù)據(jù)集中的缺失值有什么特點(Missing Pattern):
第2-5行煌茴、第2-6列中随闺,1表示該特征無缺失值,0表示該特征有缺失值蔓腐,由此可以得到4種不同的缺失值分布(最后一列的第2-5行):0 - 所有特征都沒有缺失值矩乐,1 - 有一個特征存在缺失值,2 - 有兩個特征存在缺失值回论。則散罕,第一列表示該缺失值分布下的樣本數(shù),最后一行表示該特征的缺失值總數(shù)傀蓉。
可以看到欧漱,在13842個Quant缺失的樣本中,有12954個樣本只在Quant這個特征上有缺失僚害;在1182個Val缺失的樣本中硫椰,有294個樣本只在Val這個特征上有缺失;此外萨蚕,共有888個樣本靶草,Quant和Val同時缺失。
2.2 Insp
接著看一下目標(biāo)特征Insp的分布情況岳遥。
左圖是三類標(biāo)簽(ok奕翔、fraud、unkn)的數(shù)量分布浩蓉,可以看到派继,unkn比另外兩者要多很多(占96%)。
右圖是去掉了unkn后捻艳,ok和fraud的數(shù)量分布圖驾窟,ok和fraud樣本的數(shù)量比約為11:1。
這個情況符合異常值的特性:在一份數(shù)據(jù)集中认轨,異常值只占很少很少的一部分绅络。(這同時也是異常值探測不那么容易做的原因,占比實在太小嘁字。)
2.3 ID & Prod
這個數(shù)據(jù)集中恩急,有6016個不重復(fù)的銷售員id和4548個不重復(fù)的產(chǎn)品id。
每個銷售員id下的報告數(shù)和每款產(chǎn)品id下的報告數(shù)分布如下:
可以看到纪蜒,數(shù)據(jù)分布很不均勻衷恭,有些銷售員/產(chǎn)品下的報告總數(shù)明顯遠高于其他銷售員/產(chǎn)品。
3. 構(gòu)建新特征
3.1 產(chǎn)品單位價格
有銷售總量Quant和銷售總額Val纯续,我們其實可以用Val/Quant
來計算每份報告的產(chǎn)品單位價格随珠。
Summarize一下這個新特征可以得到:
可以看到灭袁,最小產(chǎn)品單位價格為0,最大為26460窗看,平均數(shù)(20.3)大于中位數(shù)(11.89)简卧,數(shù)據(jù)分布可能是right-skewed的。
下面來具體看一下產(chǎn)品單位價格的分布情況:
為了更清晰地展現(xiàn)數(shù)據(jù)烤芦,我給單位價格小于200和大于200的數(shù)據(jù)分別做了直方圖举娩。
可以看到,數(shù)據(jù)非常的skewed构罗。
3.2 產(chǎn)品標(biāo)準(zhǔn)價格
上述產(chǎn)品單位價格是每份報告中Val和Quant的比值铜涉,那么一款產(chǎn)品,在不同的報告中可能會有不同的產(chǎn)品單位價格(不同Val遂唧、Quant給出不同的比值)芙代。
也就是說,每款產(chǎn)品對應(yīng)一組產(chǎn)品單位價格數(shù)據(jù)盖彭。
在這種情況下纹烹,作者用每組單位價格的中位數(shù)來代表其對應(yīng)產(chǎn)品的標(biāo)準(zhǔn)價格。
去掉極值(大于2500)的產(chǎn)品標(biāo)準(zhǔn)格分布如下:
可以看到產(chǎn)品標(biāo)準(zhǔn)價格同樣是right-tailed的(median = 11.24召边,mean = 15.00)铺呵。
4. 基于Quant、Val隧熙、產(chǎn)品單位價格的極值對比
作者在案例中做了三組對比分析:
- 標(biāo)準(zhǔn)價格最高的5款產(chǎn)品 vs. 標(biāo)準(zhǔn)價格最低的5款產(chǎn)品
- 總銷售收益額最高的5個銷售員 vs. 總銷售收益額最低的5個銷售員
- 總銷量最高的5款產(chǎn)品 vs. 總銷售量最低的5款產(chǎn)品
這些對比是很好的BI分析片挂,可以幫助公司管理團隊做出有價值的決策。
上述三組對比通過箱型圖展示如下:
可以看到贞盯,在每組對比中音念,最高的5個數(shù)據(jù)在數(shù)值上比最低的5個數(shù)據(jù)要高很多,說明公司的銷售情況是極其不均的躏敢。
實際上闷愤,在銷售員總銷售收益額(sum of Vals per salesperson)方面,前100的銷售員占了所有報告Val的總和的38%件余,后2000位銷售員只占了2%讥脐。而在產(chǎn)品總銷量上,前100的產(chǎn)品占了所有報告Quant的總和的75%蛾扇,后4000個產(chǎn)品只占9%攘烛。
這樣的比例構(gòu)成說明公司其實可以精簡產(chǎn)品線和銷售員隊伍魏滚。
我個人最喜歡這部分镀首,缺少商業(yè)經(jīng)驗的analyst很難在一開始就想到要做這些方面的分析,至少我是被驚艷到了鼠次。
5. 缺失值處理
在缺失值的處理上更哄,作者也分析得很細(xì)致芋齿,思路上值得學(xué)習(xí)(結(jié)論上有待進一步探討)。
回顧一下前文成翩,在所有有缺失值的樣本中觅捆,有:
- 888個樣本在Quant和Val上都有缺失
- 12954個樣本只在Quant上有缺失
- 294個樣本只在Val上有缺失
先來看那888個在Quant和Val上都有缺失的樣本。這里主要是看每位銷售員或每款產(chǎn)品的Quant和Val同時缺失的報告的占比麻敌。
下圖是Quant和Val同時缺失的報告占比最大的10位銷售員:
這些缺失比例都不是很大栅炒,最大的只有14%左右。又考慮到术羔,因為Quant和Val都缺失了赢赊,缺失值填補無從下手,所以作者認(rèn)為可以把這些樣本直接刪除级历。
下圖是Quant和Val同時缺失的報告占比最大的10款產(chǎn)品:
可以看到释移,有幾款產(chǎn)品兩個特征同時缺失的報告比例是比較大的,p2689有近40%的報告同時缺失Quant和Val數(shù)據(jù)寥殖。在這種情況下玩讳,作者認(rèn)為用剩余報告去填補缺失信息(如用p2689剩余的60%的銷售信息去填補其40%的缺失數(shù)據(jù))是不合理的,所以這些報告也應(yīng)該直接刪除嚼贡。(這部分的解釋其實沒有說服我熏纯,中文版翻譯得亂七八糟,邏輯上我沒有想透粤策,先留個疑問在這里豆巨。)
接下來分析一下那12954份只在Quant上有缺失的樣本。
下圖是僅Quant缺失的報告占比最大的10款產(chǎn)品:
p2442和p2443完全沒有Quant的信息(缺失比例為100%)掐场,所以這兩款產(chǎn)品的單位價格和標(biāo)準(zhǔn)價格都無法計算往扔,也即無法進一步通過別的特征來填補這兩款產(chǎn)品的Quant數(shù)據(jù);此外熊户,涉及p2442和p2443的一共有54份報告萍膛,其中2份標(biāo)記為fraud,其余52份標(biāo)記為ok嚷堡,說明這兩款產(chǎn)品已經(jīng)被公司做過檢測蝗罗,暫時不需要進一步進行異常預(yù)測。因此蝌戒,作者決定刪除這54份報告串塑。(其余報告保留。)
再看看僅Quant缺失的報告占比最大的10位銷售員:
有5位銷售員沒有在他們的報告中填寫Quant信息北苟,但這些信息其實可以用Val/產(chǎn)品標(biāo)準(zhǔn)價格
來填補(只要一款產(chǎn)品的Quant或Val不是完全缺失桩匪,其標(biāo)準(zhǔn)價格就可以被計算出來,那么某份報告缺失的Quant或Val就可以通過標(biāo)準(zhǔn)價格來計算)友鼻,所以這些樣本不刪除傻昙。
最后來分析那294個只在Val上有缺失的樣本闺骚。
來看看僅Val缺失的報告占比最大的10款產(chǎn)品:
比例都不是很大,可以用產(chǎn)品標(biāo)準(zhǔn)價格*Quant
來填補缺失的Val值妆档。
最后看僅Val缺失的報告占比最大的10位銷售員:
同理僻爽,可以用產(chǎn)品標(biāo)準(zhǔn)價格*Quant
來填補這些缺失的Val值。
總結(jié)贾惦,在缺失值處理這部分:
- 刪除888個在Quant和Val上均缺失的樣本和54個涉及p2442胸梆、p2443的樣本(完全沒有Quant信息);
- 其余僅Quant有缺失的樣本须板,通過
Val/產(chǎn)品標(biāo)準(zhǔn)價格
來填補其Quant缺失值乳绕; - 其余僅Val有缺失的樣本,通過
產(chǎn)品標(biāo)準(zhǔn)價格*Quant
來填補其Val缺失值逼纸。
注意洋措,這里的產(chǎn)品標(biāo)準(zhǔn)價格是剔除被標(biāo)記為fraud的報告后,重新計算的產(chǎn)品標(biāo)準(zhǔn)價格杰刽。
缺失值處理后的數(shù)據(jù)集共有400204行菠发。
異常值檢測
進行完數(shù)據(jù)預(yù)處理之后,我們就可以開始運用具體算法進行異常值檢測(在這個案例中贺嫂,也稱為欺詐交易探測)滓鸠,主要目的是找出那些在Quant或Val上有異常數(shù)值的報告,并對這些報告的異常程度進行排序(進而依據(jù)異常程度對這些報告依次進行人工核查)第喳。
算法方面糜俗,作者在書中談到的檢測方法有:
- 無監(jiān)督方法:基于箱圖規(guī)則(i.e. 中位數(shù)、IQR)的探測方法曲饱,局部異常因子算法(Local Outlier Factor悠抹,LOF),基于聚類的離群值排名方法
- 有監(jiān)督方法:簡單貝葉斯扩淀,AdaBoost
- 半監(jiān)督方法:自我訓(xùn)練模型
此外楔敌,作者沒談到但比較熱門的無監(jiān)督算法還有Isolation Forest。
這次的異常值探測我只選擇了LOF算法驻谆。下面卵凑,我簡單談?wù)凩OF,重點放在對LOF的理解和對其計算效果的討論上胜臊。
1. 數(shù)據(jù)子集
我下面只用到了整個數(shù)據(jù)集的1%來做計算勺卢,原因是我用全部數(shù)據(jù)做計算的時候R給拒絕了,說數(shù)據(jù)量過大導(dǎo)致返回結(jié)果超出內(nèi)存容量(40w+數(shù)據(jù)其實沒有很大象对,可能是算法設(shè)計不高效導(dǎo)致了這個問題)黑忱。
另外,由于LOF是無監(jiān)督方法,我個人的理解是在訓(xùn)練模型的時候不需要將數(shù)據(jù)集分為訓(xùn)練集和測試集(不一定正確)杨何,所以我沒有做數(shù)據(jù)分割。
以下是用于運算的1%的數(shù)據(jù)子集的數(shù)據(jù)概述:
整個計算用到Quant沥邻、Val和產(chǎn)品標(biāo)準(zhǔn)價格3個特征危虱,數(shù)據(jù)集不存在缺失值。
2. 局部異常因子算法(Local Outlier Factor唐全,LOF)
LOF是一種基于距離的異常檢測算法埃跷,其思想主要是:
- 通過比較每個點和其鄰域點的密度來判斷該點是否為異常點,點p的密度越低邮利,越可能被認(rèn)定是異常點弥雹;
- 密度通過點之間的距離來計算,點之間距離越遠延届,密度越低剪勿,距離越近,密度越高方庭;
- 因為LOF中厕吉,密度通過點的第k鄰域來計算,而不是全局計算械念,因此得名“局部”異常因子头朱。
算法計算過程的描述如下:
- 計算點p和其他點之間的距離;
- 確定第k距離和第k距離鄰域龄减;
- 計算點p的局部可達密度项钮,即點p的第k鄰域內(nèi)點到p的平均可達距離的倒數(shù);
- 計算點p的局部離群因子希停,即點p的鄰域點的平均局部可達密度與點p的局部可達密度之比烁巫。
最終,通過各點的局部離群因子可以得到數(shù)據(jù)的異常值排序宠能,某一點局的部離群因子數(shù)值越大(大于1)程拭,其越可能為異常值。
具體數(shù)學(xué)描述可以看這里棍潘。
3. 異常值檢測結(jié)果
這里恃鞋,我通過DMwR
包的lofactor()
函數(shù)調(diào)用LOF算法。且k取10亦歉。
3.1 基于原始特征的LOF異常值探測
首先恤浪,在不對特征進行任何處理的情況下,調(diào)用LOF做計算肴楷。
局部離群因子 Top 10 如下:
這些點的局部離群因子都大于5水由,其中排在第一位的點,其離群因子高達74.16赛蔫。
去掉局部離群因子最大點之后砂客,各點局部離群因子的直方圖如下:
可以看到泥张,絕大部分點的局部離群因子小于2.5。
下面我們依據(jù)計算結(jié)果鞠值,對樣本進行離散化:局部離群因子大于2.5的點被視為異常值媚创,小于等于2.5的點為正常值。統(tǒng)計結(jié)果如下:
可以看到彤恶,所有點的局部離群因子的中位數(shù)為1.04钞钙;在所有被計算的點中,有45個點被視為異常點(局部離群因子大于2.5)声离。
值得注意的是芒炼,統(tǒng)計結(jié)果顯示有10個點的計算結(jié)果為無窮值,有12個點的計算結(jié)果缺失术徊。出現(xiàn)無窮值的原因可能是這些點的鄰域內(nèi)存在其他點與之重合本刽,導(dǎo)致鄰域點到該點的平均可達距離為0,從而該點局部可達密度無窮大赠涮,最終使得其局部離群因子無窮大盅安。至于出現(xiàn)缺失值的原因,我暫時想不明白世囊,可能是所調(diào)用的算法在設(shè)計上有bug别瞭?
下面作散點圖看一下LOF算法下的異常值(局部離群因子大于2.5)分布情況:
綠色表示異常點。
左邊的圖橫軸為Quant株憾,縱軸為Val蝙寨。這張圖中,所有遠離左下角的點都被標(biāo)為綠色嗤瞎,即這些極值點都被歸為了異常點墙歪,這是我們想要看到的結(jié)果。
中間和右邊這兩張圖的橫軸分別為Quant和Val贝奇,縱軸都為產(chǎn)品標(biāo)準(zhǔn)價格虹菲。可以看到掉瞳,這兩張圖中毕源,有一些點的Quant或Val值在正常范圍之內(nèi),但其產(chǎn)品標(biāo)準(zhǔn)價格卻極高陕习。這些點從直覺上來說并不正常霎褐,但其絕大多數(shù)并沒有被標(biāo)為綠色,即LOF算法沒有將其歸為異常點该镣。這不符合預(yù)期冻璃。
對比上面這三張散點圖可以發(fā)現(xiàn),LOF能夠較準(zhǔn)確地識別Quant或Val異常的點,但卻不能很好地辨別出產(chǎn)品標(biāo)準(zhǔn)價格異常的點省艳。而回看我們的數(shù)據(jù)集娘纷,Quant和Val在數(shù)值上,比產(chǎn)品標(biāo)準(zhǔn)價格高了幾個量級跋炕。
結(jié)合以上兩點赖晶,我猜測LOF對特征的數(shù)值敏感。因此枣购,我決定對Quant嬉探、Val擦耀、產(chǎn)品標(biāo)準(zhǔn)價格標(biāo)準(zhǔn)化棉圈,將它們的數(shù)值限定在(-1, 1)區(qū)間內(nèi),再對這些標(biāo)準(zhǔn)化后的特征進行LOF運算眷蜓。
3.2 基于標(biāo)準(zhǔn)化特征的LOF異常值探測
標(biāo)準(zhǔn)化后的Quant分瘾、Val、產(chǎn)品標(biāo)準(zhǔn)價格如下(前6行):
重新計算的局部離群因子 Top 10:
有6個點的局部離群因子大于10;排名第一的點汽纤,其局部離群因子為36.6上岗。
新的計算結(jié)果分布如下(排除了局部離群因子大于10的點):
絕大多數(shù)點的局部離群因子小于2.5。
接下來我們依舊以2.5為臨界值蕴坪,對樣本進行離散化:局部離群因子大于2.5的點被視為異常值肴掷,小于等于2.5的點為正常值。統(tǒng)計結(jié)果如下:
可以看到背传,所有點的局部離群因子的中位數(shù)為1.03呆瞻;在所有被計算的點中,有46個點被視為異常點(局部離群因子大于2.5)径玖。這一結(jié)果與之前結(jié)果相似痴脾。
這次計算中仍然存在無窮大值和缺失值。
對新結(jié)果作散點圖梳星,可以得到如下異常值(局部離群因子大于2.5)分布情況:
綠色表示異常點赞赖。
可以看到,相比之前的結(jié)果冤灾,對標(biāo)準(zhǔn)化后的特征進行LOF計算薯定,總體而言能更高效地識別出各個特征下的異常值。
以上瞳购。