摘要:紅色箭頭所指就是異常值。箱型圖這種方法是利用箱型圖的四分位距對(duì)異常值進(jìn)行檢測(cè),也叫。異常值總結(jié)以上是對(duì)異常值檢測(cè)和處理方法的匯總。
作者:xiaoyu
微信公眾號(hào):Python數(shù)據(jù)科學(xué)
知乎:python數(shù)據(jù)分析師
上一篇分享了關(guān)于數(shù)據(jù)缺失值處理的一些方法,鏈接如下:
【Python數(shù)據(jù)分析基礎(chǔ)】: 數(shù)據(jù)缺失值處理
本篇繼續(xù)分享數(shù)據(jù)清洗中的另一個(gè)常見問題:異常值檢測(cè)和處理。
1 什么是異常值?在機(jī)器學(xué)習(xí)中,異常檢測(cè)和處理是一個(gè)比較小的分支,或者說,是機(jī)器學(xué)習(xí)的一個(gè)副產(chǎn)物,因?yàn)樵谝话愕念A(yù)測(cè)問題中,模型通常是對(duì)整體樣本數(shù)據(jù)結(jié)構(gòu)的一種表達(dá)方式,這種表達(dá)方式通常抓住的是整體樣本一般性的性質(zhì),而那些在這些性質(zhì)上表現(xiàn)完全與整體樣本不一致的點(diǎn),我們就稱其為異常點(diǎn),通常異常點(diǎn)在預(yù)測(cè)問題中是不受開發(fā)者歡迎的,因?yàn)轭A(yù)測(cè)問題通產(chǎn)關(guān)注的是整體樣本的性質(zhì),而異常點(diǎn)的生成機(jī)制與整體樣本完全不一致,如果算法對(duì)異常點(diǎn)敏感,那么生成的模型并不能對(duì)整體樣本有一個(gè)較好的表達(dá),從而預(yù)測(cè)也會(huì)不準(zhǔn)確。
從另一方面來說,異常點(diǎn)在某些場(chǎng)景下反而令分析者感到極大興趣,如疾病預(yù)測(cè),通常健康人的身體指標(biāo)在某些維度上是相似,如果一個(gè)人的身體指標(biāo)出現(xiàn)了異常,那么他的身體情況在某些方面肯定發(fā)生了改變,當(dāng)然這種改變并不一定是由疾病引起(通常被稱為噪音點(diǎn)),但異常的發(fā)生和檢測(cè)是疾病預(yù)測(cè)一個(gè)重要起始點(diǎn)。相似的場(chǎng)景也可以應(yīng)用到信用欺詐,網(wǎng)絡(luò)攻擊等等。
一般異常值的檢測(cè)方法有基于統(tǒng)計(jì)的方法,基于聚類的方法,以及一些專門檢測(cè)異常值的方法等,下面對(duì)這些方法進(jìn)行相關(guān)的介紹。
1. 簡單統(tǒng)計(jì)如果使用pandas,我們可以直接使用describe()來觀察數(shù)據(jù)的統(tǒng)計(jì)性描述(只是粗略的觀察一些統(tǒng)計(jì)量),不過統(tǒng)計(jì)數(shù)據(jù)為連續(xù)型的,如下:
df.describe()
或者簡單使用散點(diǎn)圖也能很清晰的觀察到異常值的存在。如下所示:
2. 3?原則這個(gè)原則有個(gè)條件:數(shù)據(jù)需要服從正態(tài)分布。在3?原則下,異常值如超過3倍標(biāo)準(zhǔn)差,那么可以將其視為異常值。正負(fù)3?的概率是99.7%,那么距離平均值3?之外的值出現(xiàn)的概率為P(|x-u| > 3?) <= 0.003,屬于極個(gè)別的小概率事件。如果數(shù)據(jù)不服從正態(tài)分布,也可以用遠(yuǎn)離平均值的多少倍標(biāo)準(zhǔn)差來描述。
紅色箭頭所指就是異常值。
3. 箱型圖這種方法是利用箱型圖的四分位距(IQR)對(duì)異常值進(jìn)行檢測(cè),也叫Tukey‘s test。箱型圖的定義如下:
四分位距(IQR)就是上四分位與下四分位的差值。而我們通過IQR的1.5倍為標(biāo)準(zhǔn),規(guī)定:超過上四分位+1.5倍IQR距離,或者下四分位-1.5倍IQR距離的點(diǎn)為異常值。下面是Python中的代碼實(shí)現(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來實(shí)現(xiàn):
f,ax=plt.subplots(figsize=(10,8)) sns.boxplot(y="length",data=df,ax=ax) plt.show()
紅色箭頭所指就是異常值。
以上是常用到的判斷異常值的簡單方法。下面來介紹一些較為復(fù)雜的檢測(cè)異常值算法,由于涉及內(nèi)容較多,僅介紹核心思想,感興趣的朋友可自行深入研究。
4. 基于模型檢測(cè)這種方法一般會(huì)構(gòu)建一個(gè)概率分布模型,并計(jì)算對(duì)象符合該模型的概率,把具有低概率的對(duì)象視為異常點(diǎn)。如果模型是簇的集合,則異常是不顯著屬于任何簇的對(duì)象;如果模型是回歸時(shí),異常是相對(duì)遠(yuǎn)離預(yù)測(cè)值的對(duì)象。
離群點(diǎn)的概率定義:離群點(diǎn)是一個(gè)對(duì)象,關(guān)于數(shù)據(jù)的概率分布模型,它具有低概率。這種情況的前提是必須知道數(shù)據(jù)集服從什么分布,如果估計(jì)錯(cuò)誤就造成了重尾分布。
比如特征工程中的RobustScaler方法,在做數(shù)據(jù)特征值縮放的時(shí)候,它會(huì)利用數(shù)據(jù)特征的分位數(shù)分布,將數(shù)據(jù)根據(jù)分位數(shù)劃分為多段,只取中間段來做縮放,比如只取25%分位數(shù)到75%分位數(shù)的數(shù)據(jù)做縮放。這樣減小了異常數(shù)據(jù)的影響。
優(yōu)缺點(diǎn):(1)有堅(jiān)實(shí)的統(tǒng)計(jì)學(xué)理論基礎(chǔ),當(dāng)存在充分的數(shù)據(jù)和所用的檢驗(yàn)類型的知識(shí)時(shí),這些檢驗(yàn)可能非常有效;(2)對(duì)于多元數(shù)據(jù),可用的選擇少一些,并且對(duì)于高維數(shù)據(jù),這些檢測(cè)可能性很差。
5. 基于近鄰度的離群點(diǎn)檢測(cè)統(tǒng)計(jì)方法是利用數(shù)據(jù)的分布來觀察異常值,一些方法甚至需要一些分布條件,而在實(shí)際中數(shù)據(jù)的分布很難達(dá)到一些假設(shè)條件,在使用上有一定的局限性。
確定數(shù)據(jù)集的有意義的鄰近性度量比確定它的統(tǒng)計(jì)分布更容易。這種方法比統(tǒng)計(jì)學(xué)方法更一般、更容易使用,因?yàn)?strong>一個(gè)對(duì)象的離群點(diǎn)得分由到它的k-最近鄰(KNN)的距離給定。
需要注意的是:離群點(diǎn)得分對(duì)k的取值高度敏感。如果k太小,則少量的鄰近離群點(diǎn)可能導(dǎo)致較低的離群點(diǎn)得分;如果K太大,則點(diǎn)數(shù)少于k的簇中所有的對(duì)象可能都成了離群點(diǎn)。為了使該方案對(duì)于k的選取更具有魯棒性,可以使用k個(gè)最近鄰的平均距離。
優(yōu)缺點(diǎn):(1)簡單;(2)缺點(diǎn):基于鄰近度的方法需要O(m2)時(shí)間,大數(shù)據(jù)集不適用;(3)該方法對(duì)參數(shù)的選擇也是敏感的;(4)不能處理具有不同密度區(qū)域的數(shù)據(jù)集,因?yàn)樗褂萌珠撝担荒芸紤]這種密度的變化。
5. 基于密度的離群點(diǎn)檢測(cè)從基于密度的觀點(diǎn)來說,離群點(diǎn)是在低密度區(qū)域中的對(duì)象。基于密度的離群點(diǎn)檢測(cè)與基于鄰近度的離群點(diǎn)檢測(cè)密切相關(guān),因?yàn)槊芏韧ǔS绵徑榷x。一種常用的定義密度的方法是,定義密度為到k個(gè)最近鄰的平均距離的倒數(shù)。如果該距離小,則密度高,反之亦然。另一種密度定義是使用DBSCAN聚類算法使用的密度定義,即一個(gè)對(duì)象周圍的密度等于該對(duì)象指定距離d內(nèi)對(duì)象的個(gè)數(shù)。
優(yōu)缺點(diǎn):(1)給出了對(duì)象是離群點(diǎn)的定量度量,并且即使數(shù)據(jù)具有不同的區(qū)域也能夠很好的處理;(2)與基于距離的方法一樣,這些方法必然具有O(m2)的時(shí)間復(fù)雜度。對(duì)于低維數(shù)據(jù)使用特定的數(shù)據(jù)結(jié)構(gòu)可以達(dá)到O(mlogm);(3)參數(shù)選擇是困難的。雖然LOF算法通過觀察不同的k值,然后取得最大離群點(diǎn)得分來處理該問題,但是,仍然需要選擇這些值的上下界。
6. 基于聚類的方法來做異常點(diǎn)檢測(cè)基于聚類的離群點(diǎn):一個(gè)對(duì)象是基于聚類的離群點(diǎn),如果該對(duì)象不強(qiáng)屬于任何簇,那么該對(duì)象屬于離群點(diǎn)。
離群點(diǎn)對(duì)初始聚類的影響:如果通過聚類檢測(cè)離群點(diǎn),則由于離群點(diǎn)影響聚類,存在一個(gè)問題:結(jié)構(gòu)是否有效。這也是k-means算法的缺點(diǎn),對(duì)離群點(diǎn)敏感。為了處理該問題,可以使用如下方法:對(duì)象聚類,刪除離群點(diǎn),對(duì)象再次聚類(這個(gè)不能保證產(chǎn)生最優(yōu)結(jié)果)。
優(yōu)缺點(diǎn):(1)基于線性和接近線性復(fù)雜度(k均值)的聚類技術(shù)來發(fā)現(xiàn)離群點(diǎn)可能是高度有效的;(2)簇的定義通常是離群點(diǎn)的補(bǔ),因此可能同時(shí)發(fā)現(xiàn)簇和離群點(diǎn);(3)產(chǎn)生的離群點(diǎn)集和它們的得分可能非常依賴所用的簇的個(gè)數(shù)和數(shù)據(jù)中離群點(diǎn)的存在性;(4)聚類算法產(chǎn)生的簇的質(zhì)量對(duì)該算法產(chǎn)生的離群點(diǎn)的質(zhì)量影響非常大。
7. 專門的離群點(diǎn)檢測(cè)其實(shí)以上說到聚類方法的本意是是無監(jiān)督分類,并不是為了尋找離群點(diǎn)的,只是恰好它的功能可以實(shí)現(xiàn)離群點(diǎn)的檢測(cè),算是一個(gè)衍生的功能。
除了以上提及的方法,還有兩個(gè)專門用于檢測(cè)異常點(diǎn)的方法比較常用:One Class SVM和Isolation Forest,詳細(xì)內(nèi)容不進(jìn)行深入研究。
3 異常值的處理方法檢測(cè)到了異常值,我們需要對(duì)其進(jìn)行一定的處理。而一般異常值的處理方法可大致分為以下幾種:
刪除含有異常值的記錄:直接將含有異常值的記錄刪除;
視為缺失值:將異常值視為缺失值,利用缺失值處理的方法進(jìn)行處理;
平均值修正:可用前后兩個(gè)觀測(cè)值的平均值修正該異常值;
不處理:直接在具有異常值的數(shù)據(jù)集上進(jìn)行數(shù)據(jù)挖掘;
是否要?jiǎng)h除異常值可根據(jù)實(shí)際情況考慮。因?yàn)橐恍┠P蛯?duì)異常值不很敏感,即使有異常值也不影響模型效果,但是一些模型比如邏輯回歸LR對(duì)異常值很敏感,如果不進(jìn)行處理,可能會(huì)出現(xiàn)過擬合等非常差的效果。
4 異常值總結(jié)以上是對(duì)異常值檢測(cè)和處理方法的匯總。
通過一些檢測(cè)方法我們可以找到異常值,但所得結(jié)果并不是絕對(duì)正確的,具體情況還需自己根據(jù)業(yè)務(wù)的理解加以判斷。同樣,對(duì)于異常值如何處理,是該刪除,修正,還是不處理也需結(jié)合實(shí)際情況考慮,沒有固定的。
參考:https://zhuanlan.zhihu.com/p/...
http://www.cnblogs.com/pinard...
https://blog.csdn.net/u013719...
http://www.cnblogs.com/charlo...《Python數(shù)據(jù)分析與挖掘?qū)崙?zhàn)》
關(guān)注微信公眾號(hào):Python數(shù)據(jù)科學(xué),發(fā)現(xiàn)更多精彩內(nèi)容。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/42150.html
摘要:另一種常見錯(cuò)誤是邏輯錯(cuò)誤。當(dāng)檢測(cè)到一個(gè)錯(cuò)誤時(shí),解釋器就無法繼續(xù)執(zhí)行下去,于是拋出提示信息,即為異常。 錯(cuò)誤 >>> for i in range(10) File , line 1 for i in range(10) ^ SyntaxError: invalid syntax 上面那句話因?yàn)槿鄙倜疤?hào):,導(dǎo)致解釋器無法解釋,于是報(bào)錯(cuò)。這個(gè)...
摘要:在前面介紹語法的過程中,我們已經(jīng)接觸到了解釋器給的錯(cuò)誤和異常,但并沒有詳細(xì)講解它們。解釋器這樣報(bào)出的好處是告訴我們哪一行代碼出錯(cuò)了錯(cuò)誤的類型是什么。 在前面介紹Python語法的過程中,我們已經(jīng)接觸到了解釋器給的錯(cuò)誤和異常,但并沒有詳細(xì)講解它們?,F(xiàn)在我們就全面的來學(xué)習(xí)Python是對(duì)語法錯(cuò)誤等錯(cuò)誤進(jìn)行定義和處理的,這包括至少有兩種可以區(qū)分的錯(cuò)誤,它們是語法錯(cuò)誤和異常。 語法錯(cuò)誤 Pyt...
摘要:貢獻(xiàn)者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時(shí)間,如果你一本書一本書看的話,的確要用很長時(shí)間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識(shí)點(diǎn)合并,手動(dòng)整理了這個(gè)知識(shí)樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...
摘要:在這里我分享下我個(gè)人入門機(jī)器學(xué)習(xí)的經(jīng)歷,希望能對(duì)大家能有所幫助。相關(guān)學(xué)習(xí)鏈接,,入門后的體驗(yàn)在入門了機(jī)器學(xué)習(xí)之后,在實(shí)際工作中,絕大多數(shù)的情況下你并不需要去創(chuàng)造一個(gè)新的算法。 機(jī)器學(xué)習(xí)在很多眼里就是香餑餑,因?yàn)闄C(jī)器學(xué)習(xí)相關(guān)的崗位在當(dāng)前市場(chǎng)待遇不錯(cuò),但同時(shí)機(jī)器學(xué)習(xí)在很多人面前又是一座大山,因?yàn)榘l(fā)現(xiàn)它太難學(xué)了。在這里我分享下我個(gè)人入門機(jī)器學(xué)習(xí)的經(jīng)歷,希望能對(duì)大家能有所幫助。 PS:這篇文章...
閱讀 3656·2021-11-24 10:19
閱讀 3803·2021-09-30 09:47
閱讀 1371·2019-08-30 15:56
閱讀 859·2019-08-29 15:11
閱讀 965·2019-08-29 13:43
閱讀 3645·2019-08-28 18:25
閱讀 2222·2019-08-26 13:27
閱讀 1492·2019-08-26 11:44