很可惜 T 。T 您現在還不是作者身份,不能自主發(fā)稿哦~
如有投稿需求,請把文章發(fā)送到郵箱tougao@appcpx.com,一經錄用會有專人和您聯系
咨詢如何成為春羽作者請聯系:鳥哥筆記小羽毛(ngbjxym)
異常數據識別在數據分析和數據挖掘中,是經常會遇到的問題。本文會介紹不同場景下,異常數據識別的方法有哪些,以及他們之間的區(qū)別。
當前異常數據識別的使用場景主要有以下2方面:
1、數據分析和數據挖掘在正式分析前的數據處理,識別異常數據后,刪除或者修正異常數據,避免異常數據影響分析結論;
2、 風控業(yè)務,通過數據識別異常用戶、異常訪問、異常訂單、異常支付等,避免黑產團隊入侵。
對變量做描述性統計,然后再基于業(yè)務考慮哪些數據是不合理的。常用的統計量是最大值和最小值,判斷這個變量是否超過合理的范圍。例如:用戶的年齡為150歲,這就是異常的。
定義:如果單變量數據服從正態(tài)分布,異常值被定義為與平均值偏差超過3倍標準差的值。
原因:是因為在正態(tài)分布的假設下,偏離均值3倍標準差出現的概率小于0.003,是一個小概率事件。
在實際分析中,我們也不一定要拘泥于3倍標準差,可以根據實際嚴格程度定義,如偏離均值的4倍標準差。
如果原始數據的分布是有偏的,不滿足正態(tài)分布時,可通過BOX-COX轉化,在一定程度上修正分布的偏態(tài)。轉換無需先驗信息,但需要搜尋最優(yōu)的參數λ。
Box-Cox變換的一般形式為:
1)式中y(lambda)為經Box-Cox變換后得到的新變量,y為原始連續(xù)因變量,lambda為變換參數。
2)以上變換要求原始變量y取值為正,若取值為負時,可先對所有原始數據同加一個常數a,使其(y+a)為正值,然后再進行以上的變換。
Box-Cox的python實現如下,可直接通過函數boxcox找到最優(yōu)的lambda和轉化后的值:
它能顯示出一組數據的最大值、最小值、中位數及上下四分位數;
箱線圖提供了一種數據識別的標準:異常值通常被定義為小于下邊緣或者大于上邊緣的數據為異常值。如下圖所示:
上四分位數:1/4的樣本值取值比他大
下四分位數:1/4的樣本值取值比他小
上邊緣=上四分位數+1.5*(上四分位數-下四分位數)
下邊緣=下四分位數-1.5*(上四分位數-下四分位數)
箱線圖識別異常數據的優(yōu)勢:
1)箱線圖根據數據的真實分布繪制,他對數據不做任何限制性的要求,比如要服從正態(tài)分布等;
2)箱線圖異常數據識別依賴于上四分數和下四分位數,因此異常值極其偏差不會影響異常值識別的上下邊緣。這一點是優(yōu)于3倍標準差方法的。
日常工作中還有一種場景,是需要對時間序列數據進行監(jiān)控,如:訂單量、廣告訪問量、廣告點擊量;我們需要從時間維度識別出是否異常刷單、刷廣告點擊的問題。像廣告投放場景下,如果發(fā)現渠道刷量,會及時停止廣告投放,減少損失。
對于時間序列數據異常識別,根據數據不同的特點,識別方法不同。
如果時間序列呈現平穩(wěn)分布狀態(tài),即時間序列數據圍繞中心值小范圍內波動;我們可以定義上下界的恒定閾值,如果超過上下閾值則定義為異常。
所謂動態(tài)閾值是指,當前時間的異常閾值是由過去n段時間的時序數據計算決定的;通常對于無周期,比較平穩(wěn)的時間序列,設定動態(tài)閾值的方法是移動平均法。
所謂移動平均法是:
就是用過去n個時間點的時序數據的平均值作為下一個時間點的時序數據的預測,
異常數據識別即是:確定固定移動窗口n,以過去n個窗口的指標平均值作為下一個窗口的預測值;以過去n個窗口的指標的平均值加減3倍方差作為監(jiān)控的上下界。
如果時間序列數據是周期性數據,可使用STL算法將時序數據拆解成趨勢項、周期項和余項。即每個時刻的時序數據等于當前時序趨勢項、周期項和余項的和(或者乘)。
趨勢項(T_v):涵蓋了這個時序數據的趨勢變化;
周期項(S_v):涵蓋了時序數據的周期變化;
一般使用STL需要確定2個點:
1)確定數據周期,外賣業(yè)務的一個常規(guī)周期為7天,在周一至周五又可以將數據周期縮短為1天。
2)拆分規(guī)則,是選擇加法方式還是乘法方式。
加法方式:原始數據 = 平均季節(jié)數據 + 趨勢數據 + 余項這種方式,隨著時間的推移季節(jié)數據不會有太大的變化,在以七天為一大周期的業(yè)務數據更適合這樣的拆分方式。
乘法方式:原始數據 = 平均季節(jié)數據 * 趨勢數據 * 余項
這種方式,直觀感受是隨著時間的推移季節(jié)數據波動會非常明顯。
至于如何要判斷某事的時序數據是否異常,是根據STL分解后的余項來判斷;一般情況下,余項部分的時序數據是平穩(wěn)分布狀態(tài),我們可對余項設置恒定閾值或者動態(tài)閾值,如果某個時間節(jié)點的分解余項超過設定閾值,則是異常數據。
python可以用seasonal_decompose可以將時間序列數據拆解成三部分,具體函數代碼如下:
import statsmodels.api as sm
from statsmodels.tsa.seasonal
import seasonal_decomposeimport matplotlib.pyplot as plt
# Multiplicative Decomposition
result_mul = seasonal_decompose(data1, model='multiplicative', extrapolate_trend='freq')
Actual_Values = result_mul.seasonal * result_mul.trend * result_mul.resid
# Additive Decomposition
result_add = seasonal_decompose(data1, model='additive', extrapolate_trend='freq')
Actual_Values = result_mul.seasonal + result_mul.trend + result_mul.resid
所謂多變量數據異常識別是指:不只從一個特征去判讀數據異常,而是在多個特征下來判斷其是否異常。多變量異常數據識別的方法很多,比如聚類模型、孤立森林模型、one-class svm模型等。下面主要介紹簡單高效,更容易使用的孤立森林模型。
基本介紹:
孤立森林iForest (Isolation Forest) 是一個可擴散到多變量的快速異常檢測方法。iForest 適用于連續(xù)數據的異常檢測,將異常定義為“容易被孤立的離群點——可以理解為分布稀疏且離密度高的群體較遠的點。用統計學來解釋,在數據空間里面,分布稀疏的區(qū)域表示數據發(fā)生在此區(qū)域的概率很低,因而可以認為落在這些區(qū)域里的數據是異常的。
iForest屬于Non-parametric和unsupervised的方法,即不用定義數學模型也不需要有標記的訓練。
算法邏輯介紹:
假設現在有一組一維數據(如下圖所示),我們要對這組數據進行隨機切分,希望可以把點 A 和點 B 單獨切分出來。具體的,我們先在最大值和最小值之間隨機選擇一個值 x,然后按照
我們把數據從一維擴展到兩維。同樣的,我們沿著兩個坐標軸進行隨機切分,嘗試把下圖中的點A'和點B'分別切分出來。我們先隨機選擇一個特征維度,在這個特征的最大值和最小值之間隨機選擇一個值,按照跟特征值的大小關系將數據進行左右切分。然后,在左右兩組數據中,我們重復上述步驟,再隨機的按某個特征維度的取值把數據進行細分,直到無法細分,即:只剩下一個數據點,或者剩下的數據全部相同。跟先前的例子類似,直觀上,點B'跟其他數據點比較疏離,可能只需要很少的幾次操作就可以將它細分出來;點A'需要的切分次數可能會更多一些。
上面其實就是 Isolation Forest(IF)的核心概念。而具體的IF采用二叉樹去對數據進行切分,數據點在二叉樹中所處的深度反應了該條數據的“疏離”程度。整個算法大致可以分為兩步:
訓練:抽取多個樣本,構建多棵二叉樹(Isolation Tree,即 iTree);
預測:綜合多棵二叉樹的結果,計算每個數據點的異常分值。
訓練:構建一棵 iTree 時,先從全量數據中抽取一批樣本,然后隨機選擇一個特征作為起始節(jié)點,并在該特征的最大值和最小值之間隨機選擇一個值,將樣本中小于該取值的數據劃到左分支,大于等于該取值的劃到右分支。然后,在左右兩個分支數據中,重復上述步驟,直到滿足如下條件:
數據不可再分,即:只包含一條數據,或者全部數據相同。
二叉樹達到限定的最大深度。
預測:根據估算它在每棵 iTree 中的路徑長度(也可以叫深度),計算數據 x 的異常分值,通常這個異常分值越小越異常。
Isolation Forest 算法主要有兩個參數:一個是二叉樹的個數;另一個是訓練單棵 iTree 時候抽取樣本的數目。實驗表明,當設定為 100 棵樹,抽樣樣本數為 256 條時候,IF 在大多數情況下就已經可以取得不錯的效果。這也體現了算法的簡單、高效。
具體python實現如下:
from sklearn.ensemble import IsolationForest
IsolationForest(*, n_estimators=100, max_samples='auto', contamination='auto', max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)
參數介紹如下:
1、n_estimators :int,optional(默認值= 100)
模型擬合中的二叉樹數量。
2、max_samples :int或float,optional(default =“auto”)
每棵二叉樹訓練需要的樣本量。
如果是int,則繪制max_samples樣本。
如果是float,則繪制max_samples * X.shape [0]樣本。
如果是“auto”,則max_samples = min(256,n_samples)。
如果max_samples大于提供的樣本數,則所有樣本將用于所有樹(無采樣)。
3、contamination :float(0.,0.5),可選(默認值= 0.1)
數據集中異常值的比例。在擬合時用于定義決策函數的閾值。如果是“自動”,則確定決策函數閾值,如原始論文中所示。
4、max_features :int或float,可選(默認值= 1.0)
訓練每棵二叉樹的特征數。
如果是int,則繪制max_features特征。
如果是float,則繪制max_features * X.shape [1]特征。
5、bootstrap :boolean,optional(default = False)
如果為True,則單個樹適合于通過替換采樣的訓練數據的隨機子集。
如果為假,則執(zhí)行未更換的采樣。
6、n_jobs :int或None,可選(默認=無)
適合和預測并行運行的作業(yè)數。
7. random_state :int,RandomState實例或None,可選(默認=無)
如果是int,則random_state是隨機數生成器使用的種子;
如果是RandomState實例,則random_state是隨機數生成器;
如果沒有,隨機數生成器所使用的RandomState實例np.random。
下圖是我用孤立森林擬合數據識別異常值的可視化圖,左邊表示原始數據的呈現,右邊表示孤立森林異常識別(黑色表示異常,黃色表示正常);從左右對比可看出,離散點都能識別出,但是也有一些偏離中心的正常點也被識別為異常數據。
以上就是我要介紹的異常數據識別的方法,上述方法可以覆蓋日常中80%的異常數據識別;所以要熟悉掌握這些方法哦,具體細節(jié)可加微信繼續(xù)溝通探討。
-END-
本文為作者獨立觀點,不代表鳥哥筆記立場,未經允許不得轉載。
《鳥哥筆記版權及免責申明》 如對文章、圖片、字體等版權有疑問,請點擊 反饋舉報
我們致力于提供一個高質量內容的交流平臺。為落實國家互聯網信息辦公室“依法管網、依法辦網、依法上網”的要求,為完善跟帖評論自律管理,為了保護用戶創(chuàng)造的內容、維護開放、真實、專業(yè)的平臺氛圍,我們團隊將依據本公約中的條款對注冊用戶和發(fā)布在本平臺的內容進行管理。平臺鼓勵用戶創(chuàng)作、發(fā)布優(yōu)質內容,同時也將采取必要措施管理違法、侵權或有其他不良影響的網絡信息。
一、根據《網絡信息內容生態(tài)治理規(guī)定》《中華人民共和國未成年人保護法》等法律法規(guī),對以下違法、不良信息或存在危害的行為進行處理。
1. 違反法律法規(guī)的信息,主要表現為:
1)反對憲法所確定的基本原則;
2)危害國家安全,泄露國家秘密,顛覆國家政權,破壞國家統一,損害國家榮譽和利益;
3)侮辱、濫用英烈形象,歪曲、丑化、褻瀆、否定英雄烈士事跡和精神,以侮辱、誹謗或者其他方式侵害英雄烈士的姓名、肖像、名譽、榮譽;
4)宣揚恐怖主義、極端主義或者煽動實施恐怖活動、極端主義活動;
5)煽動民族仇恨、民族歧視,破壞民族團結;
6)破壞國家宗教政策,宣揚邪教和封建迷信;
7)散布謠言,擾亂社會秩序,破壞社會穩(wěn)定;
8)宣揚淫穢、色情、賭博、暴力、兇殺、恐怖或者教唆犯罪;
9)煽動非法集會、結社、游行、示威、聚眾擾亂社會秩序;
10)侮辱或者誹謗他人,侵害他人名譽、隱私和其他合法權益;
11)通過網絡以文字、圖片、音視頻等形式,對未成年人實施侮辱、誹謗、威脅或者惡意損害未成年人形象進行網絡欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法規(guī)禁止的其他內容;
2. 不友善:不尊重用戶及其所貢獻內容的信息或行為。主要表現為:
1)輕蔑:貶低、輕視他人及其勞動成果;
2)誹謗:捏造、散布虛假事實,損害他人名譽;
3)嘲諷:以比喻、夸張、侮辱性的手法對他人或其行為進行揭露或描述,以此來激怒他人;
4)挑釁:以不友好的方式激怒他人,意圖使對方對自己的言論作出回應,蓄意制造事端;
5)羞辱:貶低他人的能力、行為、生理或身份特征,讓對方難堪;
6)謾罵:以不文明的語言對他人進行負面評價;
7)歧視:煽動人群歧視、地域歧視等,針對他人的民族、種族、宗教、性取向、性別、年齡、地域、生理特征等身份或者歸類的攻擊;
8)威脅:許諾以不良的后果來迫使他人服從自己的意志;
3. 發(fā)布垃圾廣告信息:以推廣曝光為目的,發(fā)布影響用戶體驗、擾亂本網站秩序的內容,或進行相關行為。主要表現為:
1)多次發(fā)布包含售賣產品、提供服務、宣傳推廣內容的垃圾廣告。包括但不限于以下幾種形式:
2)單個帳號多次發(fā)布包含垃圾廣告的內容;
3)多個廣告帳號互相配合發(fā)布、傳播包含垃圾廣告的內容;
4)多次發(fā)布包含欺騙性外鏈的內容,如未注明的淘寶客鏈接、跳轉網站等,誘騙用戶點擊鏈接
5)發(fā)布大量包含推廣鏈接、產品、品牌等內容獲取搜索引擎中的不正當曝光;
6)購買或出售帳號之間虛假地互動,發(fā)布干擾網站秩序的推廣內容及相關交易。
7)發(fā)布包含欺騙性的惡意營銷內容,如通過偽造經歷、冒充他人等方式進行惡意營銷;
8)使用特殊符號、圖片等方式規(guī)避垃圾廣告內容審核的廣告內容。
4. 色情低俗信息,主要表現為:
1)包含自己或他人性經驗的細節(jié)描述或露骨的感受描述;
2)涉及色情段子、兩性笑話的低俗內容;
3)配圖、頭圖中包含庸俗或挑逗性圖片的內容;
4)帶有性暗示、性挑逗等易使人產生性聯想;
5)展現血腥、驚悚、殘忍等致人身心不適;
6)炒作緋聞、丑聞、劣跡等;
7)宣揚低俗、庸俗、媚俗內容。
5. 不實信息,主要表現為:
1)可能存在事實性錯誤或者造謠等內容;
2)存在事實夸大、偽造虛假經歷等誤導他人的內容;
3)偽造身份、冒充他人,通過頭像、用戶名等個人信息暗示自己具有特定身份,或與特定機構或個人存在關聯。
6. 傳播封建迷信,主要表現為:
1)找人算命、測字、占卜、解夢、化解厄運、使用迷信方式治??;
2)求推薦算命看相大師;
3)針對具體風水等問題進行求助或咨詢;
4)問自己或他人的八字、六爻、星盤、手相、面相、五行缺失,包括通過占卜方法問婚姻、前程、運勢,東西寵物丟了能不能找回、取名改名等;
7. 文章標題黨,主要表現為:
1)以各種夸張、獵奇、不合常理的表現手法等行為來誘導用戶;
2)內容與標題之間存在嚴重不實或者原意扭曲;
3)使用夸張標題,內容與標題嚴重不符的。
8.「飯圈」亂象行為,主要表現為:
1)誘導未成年人應援集資、高額消費、投票打榜
2)粉絲互撕謾罵、拉踩引戰(zhàn)、造謠攻擊、人肉搜索、侵犯隱私
3)鼓動「飯圈」粉絲攀比炫富、奢靡享樂等行為
4)以號召粉絲、雇用網絡水軍、「養(yǎng)號」形式刷量控評等行為
5)通過「蹭熱點」、制造話題等形式干擾輿論,影響傳播秩序
9. 其他危害行為或內容,主要表現為:
1)可能引發(fā)未成年人模仿不安全行為和違反社會公德行為、誘導未成年人不良嗜好影響未成年人身心健康的;
2)不當評述自然災害、重大事故等災難的;
3)美化、粉飾侵略戰(zhàn)爭行為的;
4)法律、行政法規(guī)禁止,或可能對網絡生態(tài)造成不良影響的其他內容。
二、違規(guī)處罰
本網站通過主動發(fā)現和接受用戶舉報兩種方式收集違規(guī)行為信息。所有有意的降低內容質量、傷害平臺氛圍及欺凌未成年人或危害未成年人身心健康的行為都是不能容忍的。
當一個用戶發(fā)布違規(guī)內容時,本網站將依據相關用戶違規(guī)情節(jié)嚴重程度,對帳號進行禁言 1 天、7 天、15 天直至永久禁言或封停賬號的處罰。當涉及欺凌未成年人、危害未成年人身心健康、通過作弊手段注冊、使用帳號,或者濫用多個帳號發(fā)布違規(guī)內容時,本網站將加重處罰。
三、申訴
隨著平臺管理經驗的不斷豐富,本網站出于維護本網站氛圍和秩序的目的,將不斷完善本公約。
如果本網站用戶對本網站基于本公約規(guī)定做出的處理有異議,可以通過「建議反饋」功能向本網站進行反饋。
(規(guī)則的最終解釋權歸屬本網站所有)