Python數(shù)據(jù)分析基礎(chǔ)之異常值檢測和處理方式
1 什么是異常值?
在機器學(xué)習中,異常檢測和處理是一個比較小的分支,或者說,是機器學(xué)習的一個副產(chǎn)物,因為在一般的預(yù)測問題中,模型通常是對整體樣本數(shù)據(jù)結(jié)構(gòu)的一種表達方式,這種表達方式通常抓住的是整體樣本一般性的性質(zhì),而那些在這些性質(zhì)上表現(xiàn)完全與整體樣本不一致的點,我們就稱其為異常點,通常異常點在預(yù)測問題中是不受開發(fā)者歡迎的,因為預(yù)測問題通產(chǎn)關(guān)注的是整體樣本的性質(zhì),而異常點的生成機制與整體樣本完全不一致,如果算法對異常點敏感,那么生成的模型并不能對整體樣本有一個較好的表達,從而預(yù)測也會不準確。
從另一方面來說,異常點在某些場景下反而令分析者感到極大興趣,如疾病預(yù)測,通常健康人的身體指標在某些維度上是相似,如果一個人的身體指標出現(xiàn)了異常,那么他的身體情況在某些方面肯定發(fā)生了改變,當然這種改變并不一定是由疾病引起(通常被稱為噪音點),但異常的發(fā)生和檢測是疾病預(yù)測一個重要起始點。相似的場景也可以應(yīng)用到信用欺詐,網(wǎng)絡(luò)攻擊等等。
2 異常值的檢測方法
一般異常值的檢測方法有基于統(tǒng)計的方法,基于聚類的方法,以及一些專門檢測異常值的方法等,下面對這些方法進行相關(guān)的介紹。
1. 簡單統(tǒng)計
如果使用pandas,我們可以直接使用describe()來觀察數(shù)據(jù)的統(tǒng)計性描述(只是粗略的觀察一些統(tǒng)計量),不過統(tǒng)計數(shù)據(jù)為連續(xù)型的,如下:
df.describe()
或者簡單使用散點圖也能很清晰的觀察到異常值的存在。如下所示:
2. 3∂原則
這個原則有個條件:數(shù)據(jù)需要服從正態(tài)分布。在3∂原則下,異常值如超過3倍標準差,那么可以將其視為異常值。正負3∂的概率是99.7%,那么距離平均值3∂之外的值出現(xiàn)的概率為P(|x-u| > 3∂) <= 0.003,屬于極個別的小概率事件。如果數(shù)據(jù)不服從正態(tài)分布,也可以用遠離平均值的多少倍標準差來描述。
紅色箭頭所指就是異常值。
3. 箱型圖
這種方法是利用箱型圖的四分位距(IQR)對異常值進行檢測,也叫Tukey‘s test。箱型圖的定義如下:
四分位距(IQR)就是上四分位與下四分位的差值。而我們通過IQR的1.5倍為標準,規(guī)定:超過上四分位+1.5倍IQR距離,或者下四分位-1.5倍IQR距離的點為異常值。下面是Python中的代碼實現(xiàn),主要使用了numpy的percentile方法。
Percentile = np.percentile(df['length'],[0,25,50,75,100]) IQR = Percentile[3] - Percentile[1] UpLimit = Percentile[3]+ageIQR*1.5 DownLimit = Percentile[1]-ageIQR*1.5
也可以使用seaborn的可視化方法boxplot來實現(xiàn):
f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y='length',data=df,ax=ax) plt.show()
紅色箭頭所指就是異常值。
以上是常用到的判斷異常值的簡單方法。下面來介紹一些較為復(fù)雜的檢測異常值算法,由于涉及內(nèi)容較多,僅介紹核心思想,感興趣的朋友可自行深入研究。
4. 基于模型檢測
這種方法一般會構(gòu)建一個概率分布模型,并計算對象符合該模型的概率,把具有低概率的對象視為異常點。如果模型是簇的集合,則異常是不顯著屬于任何簇的對象;如果模型是回歸時,異常是相對遠離預(yù)測值的對象。
離群點的概率定義:離群點是一個對象,關(guān)于數(shù)據(jù)的概率分布模型,它具有低概率。這種情況的前提是必須知道數(shù)據(jù)集服從什么分布,如果估計錯誤就造成了重尾分布。
比如特征工程中的RobustScaler方法,在做數(shù)據(jù)特征值縮放的時候,它會利用數(shù)據(jù)特征的分位數(shù)分布,將數(shù)據(jù)根據(jù)分位數(shù)劃分為多段,只取中間段來做縮放,比如只取25%分位數(shù)到75%分位數(shù)的數(shù)據(jù)做縮放。這樣減小了異常數(shù)據(jù)的影響。
優(yōu)缺點:
(1)有堅實的統(tǒng)計學(xué)理論基礎(chǔ),當存在充分的數(shù)據(jù)和所用的檢驗類型的知識時,這些檢驗可能非常有效;
(2)對于多元數(shù)據(jù),可用的選擇少一些,并且對于高維數(shù)據(jù),這些檢測可能性很差。
5. 基于近鄰度的離群點檢測
統(tǒng)計方法是利用數(shù)據(jù)的分布來觀察異常值,一些方法甚至需要一些分布條件,而在實際中數(shù)據(jù)的分布很難達到一些假設(shè)條件,在使用上有一定的局限性。
確定數(shù)據(jù)集的有意義的鄰近性度量比確定它的統(tǒng)計分布更容易。這種方法比統(tǒng)計學(xué)方法更一般、更容易使用,因為一個對象的離群點得分由到它的k-最近鄰(KNN)的距離給定。
需要注意的是:離群點得分對k的取值高度敏感。如果k太小,則少量的鄰近離群點可能導(dǎo)致較低的離群點得分;如果K太大,則點數(shù)少于k的簇中所有的對象可能都成了離群點。為了使該方案對于k的選取更具有魯棒性,可以使用k個最近鄰的平均距離。
優(yōu)缺點:
(1)簡單;
(2)缺點:基于鄰近度的方法需要O(m2)時間,大數(shù)據(jù)集不適用;
(3)該方法對參數(shù)的選擇也是敏感的;
(4)不能處理具有不同密度區(qū)域的數(shù)據(jù)集,因為它使用全局閾值,不能考慮這種密度的變化。
5. 基于密度的離群點檢測
從基于密度的觀點來說,離群點是在低密度區(qū)域中的對象?;诿芏鹊碾x群點檢測與基于鄰近度的離群點檢測密切相關(guān),因為密度通常用鄰近度定義。一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數(shù)。如果該距離小,則密度高,反之亦然。另一種密度定義是使用DBSCAN聚類算法使用的密度定義,即一個對象周圍的密度等于該對象指定距離d內(nèi)對象的個數(shù)。
優(yōu)缺點:
(1)給出了對象是離群點的定量度量,并且即使數(shù)據(jù)具有不同的區(qū)域也能夠很好的處理;
(2)與基于距離的方法一樣,這些方法必然具有O(m2)的時間復(fù)雜度。對于低維數(shù)據(jù)使用特定的數(shù)據(jù)結(jié)構(gòu)可以達到O(mlogm);
(3)參數(shù)選擇是困難的。雖然LOF算法通過觀察不同的k值,然后取得最大離群點得分來處理該問題,但是,仍然需要選擇這些值的上下界。
6. 基于聚類的方法來做異常點檢測
基于聚類的離群點:一個對象是基于聚類的離群點,如果該對象不強屬于任何簇,那么該對象屬于離群點。
離群點對初始聚類的影響:如果通過聚類檢測離群點,則由于離群點影響聚類,存在一個問題:結(jié)構(gòu)是否有效。這也是k-means算法的缺點,對離群點敏感。為了處理該問題,可以使用如下方法:對象聚類,刪除離群點,對象再次聚類(這個不能保證產(chǎn)生最優(yōu)結(jié)果)。
優(yōu)缺點:
(1)基于線性和接近線性復(fù)雜度(k均值)的聚類技術(shù)來發(fā)現(xiàn)離群點可能是高度有效的;
(2)簇的定義通常是離群點的補,因此可能同時發(fā)現(xiàn)簇和離群點;
(3)產(chǎn)生的離群點集和它們的得分可能非常依賴所用的簇的個數(shù)和數(shù)據(jù)中離群點的存在性;
(4)聚類算法產(chǎn)生的簇的質(zhì)量對該算法產(chǎn)生的離群點的質(zhì)量影響非常大。
7. 專門的離群點檢測
其實以上說到聚類方法的本意是是無監(jiān)督分類,并不是為了尋找離群點的,只是恰好它的功能可以實現(xiàn)離群點的檢測,算是一個衍生的功能。
除了以上提及的方法,還有兩個專門用于檢測異常點的方法比較常用:One Class SVM和Isolation Forest,詳細內(nèi)容不進行深入研究。
3 異常值的處理方法
檢測到了異常值,我們需要對其進行一定的處理。而一般異常值的處理方法可大致分為以下幾種:
- 刪除含有異常值的記錄:直接將含有異常值的記錄刪除;
- 視為缺失值:將異常值視為缺失值,利用缺失值處理的方法進行處理;
- 平均值修正:可用前后兩個觀測值的平均值修正該異常值;
- 不處理:直接在具有異常值的數(shù)據(jù)集上進行數(shù)據(jù)挖掘;
是否要刪除異常值可根據(jù)實際情況考慮。因為一些模型對異常值不很敏感,即使有異常值也不影響模型效果,但是一些模型比如邏輯回歸LR對異常值很敏感,如果不進行處理,可能會出現(xiàn)過擬合等非常差的效果。
4 異常值總結(jié)
以上是對異常值檢測和處理方法的匯總。
通過一些檢測方法我們可以找到異常值,但所得結(jié)果并不是絕對正確的,具體情況還需自己根據(jù)業(yè)務(wù)的理解加以判斷。同樣,對于異常值如何處理,是該刪除,修正,還是不處理也需結(jié)合實際情況考慮,沒有固定的。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- Python數(shù)據(jù)分析應(yīng)用之Matplotlib數(shù)據(jù)可視化詳情
- python數(shù)據(jù)分析之單因素分析線性擬合及地理編碼
- python數(shù)據(jù)分析繪圖可視化
- Python數(shù)據(jù)分析numpy數(shù)組的3種創(chuàng)建方式
- Python數(shù)據(jù)分析之Matplotlib數(shù)據(jù)可視化
- Python數(shù)據(jù)分析之使用scikit-learn構(gòu)建模型
- Python數(shù)據(jù)分析matplotlib折線圖案例處理
- Python數(shù)據(jù)分析之堆疊數(shù)組函數(shù)示例總結(jié)
- 使用python對泰坦尼克號幸存者進行數(shù)據(jù)分析與預(yù)測
相關(guān)文章
Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法
今天小編就為大家分享一篇Python使用Selenium爬取淘寶異步加載的數(shù)據(jù)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python實現(xiàn)Mysql數(shù)據(jù)庫連接池實例詳解
這篇文章主要介紹了Python實現(xiàn)Mysql數(shù)據(jù)庫連接池實例詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04Python使用type關(guān)鍵字創(chuàng)建類步驟詳解
在本文里我們給讀者們整理了關(guān)于Python如何使用type關(guān)鍵字創(chuàng)建類的相關(guān)知識點,需要的朋友們參考學(xué)習下。2019-07-07使用PyTorch構(gòu)建神經(jīng)網(wǎng)絡(luò)的操作指南
PyTorch 是一個在研究領(lǐng)域廣泛使用的深度學(xué)習框架,提供了大量的靈活性和效率,本文將向你介紹如何使用 PyTorch 構(gòu)建你的第一個神經(jīng)網(wǎng)絡(luò),感興趣的小伙伴可以參考閱讀2023-07-07