国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【Python數據分析基礎】: 異常值檢測和處理

banana_pi / 493人閱讀

摘要:紅色箭頭所指就是異常值。箱型圖這種方法是利用箱型圖的四分位距對異常值進行檢測,也叫。異常值總結以上是對異常值檢測和處理方法的匯總。

作者:xiaoyu

微信公眾號:Python數據科學

知乎:python數據分析師



上一篇分享了關于數據缺失值處理的一些方法,鏈接如下:
【Python數據分析基礎】: 數據缺失值處理

本篇繼續分享數據清洗中的另一個常見問題:異常值檢測和處理。

1 什么是異常值?

在機器學習中,異常檢測和處理是一個比較小的分支,或者說,是機器學習的一個副產物,因為在一般的預測問題中,模型通常是對整體樣本數據結構的一種表達方式,這種表達方式通常抓住的是整體樣本一般性的性質,而那些在這些性質上表現完全與整體樣本不一致的點,我們就稱其為異常點,通常異常點在預測問題中是不受開發者歡迎的,因為預測問題通產關注的是整體樣本的性質,而異常點的生成機制與整體樣本完全不一致,如果算法對異常點敏感,那么生成的模型并不能對整體樣本有一個較好的表達,從而預測也會不準確。
從另一方面來說,異常點在某些場景下反而令分析者感到極大興趣,如疾病預測,通常健康人的身體指標在某些維度上是相似,如果一個人的身體指標出現了異常,那么他的身體情況在某些方面肯定發生了改變,當然這種改變并不一定是由疾病引起(通常被稱為噪音點),但異常的發生和檢測是疾病預測一個重要起始點。相似的場景也可以應用到信用欺詐,網絡攻擊等等。

2 異常值的檢測方法

一般異常值的檢測方法有基于統計的方法,基于聚類的方法,以及一些專門檢測異常值的方法等,下面對這些方法進行相關的介紹。

1. 簡單統計

如果使用pandas,我們可以直接使用describe()來觀察數據的統計性描述(只是粗略的觀察一些統計量),不過統計數據為連續型的,如下:

df.describe()

或者簡單使用散點圖也能很清晰的觀察到異常值的存在。如下所示:

2. 3?原則

這個原則有個條件:數據需要服從正態分布。在3?原則下,異常值如超過3倍標準差,那么可以將其視為異常值。正負3?的概率是99.7%,那么距離平均值3?之外的值出現的概率為P(|x-u| > 3?) <= 0.003,屬于極個別的小概率事件。如果數據不服從正態分布,也可以用遠離平均值的多少倍標準差來描述。

紅色箭頭所指就是異常值。

3. 箱型圖

這種方法是利用箱型圖的四分位距(IQR)對異常值進行檢測,也叫Tukey‘s test。箱型圖的定義如下:

四分位距(IQR)就是上四分位與下四分位的差值。而我們通過IQR的1.5倍為標準,規定:超過上四分位+1.5倍IQR距離,或者下四分位-1.5倍IQR距離的點為異常值。下面是Python中的代碼實現,主要使用了numpypercentile方法。

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來實現:

f,ax=plt.subplots(figsize=(10,8))
sns.boxplot(y="length",data=df,ax=ax)
plt.show()

紅色箭頭所指就是異常值。

以上是常用到的判斷異常值的簡單方法。下面來介紹一些較為復雜的檢測異常值算法,由于涉及內容較多,僅介紹核心思想,感興趣的朋友可自行深入研究。

4. 基于模型檢測

這種方法一般會構建一個概率分布模型,并計算對象符合該模型的概率,把具有低概率的對象視為異常點。如果模型是簇的集合,則異常是不顯著屬于任何簇的對象;如果模型是回歸時,異常是相對遠離預測值的對象。

離群點的概率定義:離群點是一個對象,關于數據的概率分布模型,它具有低概率。這種情況的前提是必須知道數據集服從什么分布,如果估計錯誤就造成了重尾分布。

比如特征工程中的RobustScaler方法,在做數據特征值縮放的時候,它會利用數據特征的分位數分布,將數據根據分位數劃分為多段,只取中間段來做縮放,比如只取25%分位數到75%分位數的數據做縮放。這樣減小了異常數據的影響。

優缺點:(1)有堅實的統計學理論基礎,當存在充分的數據和所用的檢驗類型的知識時,這些檢驗可能非常有效;(2)對于多元數據,可用的選擇少一些,并且對于高維數據,這些檢測可能性很差。

5. 基于近鄰度的離群點檢測

統計方法是利用數據的分布來觀察異常值,一些方法甚至需要一些分布條件,而在實際中數據的分布很難達到一些假設條件,在使用上有一定的局限性。

確定數據集的有意義的鄰近性度量比確定它的統計分布更容易。這種方法比統計學方法更一般、更容易使用,因為一個對象的離群點得分由到它的k-最近鄰(KNN)的距離給定。

需要注意的是:離群點得分對k的取值高度敏感。如果k太小,則少量的鄰近離群點可能導致較低的離群點得分;如果K太大,則點數少于k的簇中所有的對象可能都成了離群點。為了使該方案對于k的選取更具有魯棒性,可以使用k個最近鄰的平均距離。

優缺點:(1)簡單;(2)缺點:基于鄰近度的方法需要O(m2)時間,大數據集不適用;(3)該方法對參數的選擇也是敏感的;(4)不能處理具有不同密度區域的數據集,因為它使用全局閾值,不能考慮這種密度的變化。

5. 基于密度的離群點檢測

從基于密度的觀點來說,離群點是在低密度區域中的對象。基于密度的離群點檢測與基于鄰近度的離群點檢測密切相關,因為密度通常用鄰近度定義。一種常用的定義密度的方法是,定義密度為到k個最近鄰的平均距離的倒數。如果該距離小,則密度高,反之亦然。另一種密度定義是使用DBSCAN聚類算法使用的密度定義,即一個對象周圍的密度等于該對象指定距離d內對象的個數。

優缺點:(1)給出了對象是離群點的定量度量,并且即使數據具有不同的區域也能夠很好的處理;(2)與基于距離的方法一樣,這些方法必然具有O(m2)的時間復雜度。對于低維數據使用特定的數據結構可以達到O(mlogm);(3)參數選擇是困難的。雖然LOF算法通過觀察不同的k值,然后取得最大離群點得分來處理該問題,但是,仍然需要選擇這些值的上下界。

6. 基于聚類的方法來做異常點檢測

基于聚類的離群點:一個對象是基于聚類的離群點,如果該對象不強屬于任何簇,那么該對象屬于離群點。

離群點對初始聚類的影響:如果通過聚類檢測離群點,則由于離群點影響聚類,存在一個問題:結構是否有效。這也是k-means算法的缺點,對離群點敏感。為了處理該問題,可以使用如下方法:對象聚類,刪除離群點,對象再次聚類(這個不能保證產生最優結果)。

優缺點:(1)基于線性和接近線性復雜度(k均值)的聚類技術來發現離群點可能是高度有效的;(2)簇的定義通常是離群點的補,因此可能同時發現簇和離群點;(3)產生的離群點集和它們的得分可能非常依賴所用的簇的個數和數據中離群點的存在性;(4)聚類算法產生的簇的質量對該算法產生的離群點的質量影響非常大。

7. 專門的離群點檢測

其實以上說到聚類方法的本意是是無監督分類,并不是為了尋找離群點的,只是恰好它的功能可以實現離群點的檢測,算是一個衍生的功能。

除了以上提及的方法,還有兩個專門用于檢測異常點的方法比較常用:One Class SVMIsolation Forest,詳細內容不進行深入研究。

3 異常值的處理方法

檢測到了異常值,我們需要對其進行一定的處理。而一般異常值的處理方法可大致分為以下幾種:

刪除含有異常值的記錄:直接將含有異常值的記錄刪除;

視為缺失值:將異常值視為缺失值,利用缺失值處理的方法進行處理;

平均值修正:可用前后兩個觀測值的平均值修正該異常值;

不處理:直接在具有異常值的數據集上進行數據挖掘;

是否要刪除異常值可根據實際情況考慮。因為一些模型對異常值不很敏感,即使有異常值也不影響模型效果,但是一些模型比如邏輯回歸LR對異常值很敏感,如果不進行處理,可能會出現過擬合等非常差的效果。

4 異常值總結

以上是對異常值檢測和處理方法的匯總。

通過一些檢測方法我們可以找到異常值,但所得結果并不是絕對正確的,具體情況還需自己根據業務的理解加以判斷。同樣,對于異常值如何處理,是該刪除,修正,還是不處理也需結合實際情況考慮,沒有固定的。

參考:

https://zhuanlan.zhihu.com/p/...
http://www.cnblogs.com/pinard...
https://blog.csdn.net/u013719...
http://www.cnblogs.com/charlo...

《Python數據分析與挖掘實戰》

關注微信公眾號:Python數據科學,發現更多精彩內容。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42150.html

相關文章

  • Python基礎之(九)錯誤異常

    摘要:另一種常見錯誤是邏輯錯誤。當檢測到一個錯誤時,解釋器就無法繼續執行下去,于是拋出提示信息,即為異常。 錯誤 >>> for i in range(10) File , line 1 for i in range(10) ^ SyntaxError: invalid syntax 上面那句話因為缺少冒號:,導致解釋器無法解釋,于是報錯。這個...

    yimo 評論0 收藏0
  • python基礎教程:錯誤處理異常處理

    摘要:在前面介紹語法的過程中,我們已經接觸到了解釋器給的錯誤和異常,但并沒有詳細講解它們。解釋器這樣報出的好處是告訴我們哪一行代碼出錯了錯誤的類型是什么。 在前面介紹Python語法的過程中,我們已經接觸到了解釋器給的錯誤和異常,但并沒有詳細講解它們。現在我們就全面的來學習Python是對語法錯誤等錯誤進行定義和處理的,這包括至少有兩種可以區分的錯誤,它們是語法錯誤和異常。 語法錯誤 Pyt...

    tinylcy 評論0 收藏0
  • ApacheCN 人工智能知識樹 v1.0

    摘要:貢獻者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻者:飛龍版...

    劉厚水 評論0 收藏0
  • 我是如何入門機器學習的呢

    摘要:在這里我分享下我個人入門機器學習的經歷,希望能對大家能有所幫助。相關學習鏈接,,入門后的體驗在入門了機器學習之后,在實際工作中,絕大多數的情況下你并不需要去創造一個新的算法。 機器學習在很多眼里就是香餑餑,因為機器學習相關的崗位在當前市場待遇不錯,但同時機器學習在很多人面前又是一座大山,因為發現它太難學了。在這里我分享下我個人入門機器學習的經歷,希望能對大家能有所幫助。 PS:這篇文章...

    ShowerSun 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<