『壹』 如何判別測量數據中是否有異常值
一般異常值的檢測方法有基於統計的方法,基於聚類的方法,以及一些專門檢測異常值的方法等,下面對這些方法進行相關的介紹。
1. 簡單統計
如果使用pandas,我們可以直接使用describe()來觀察數據的統計性描述(只是粗略的觀察一些統計量),不過統計數據為連續型的,如下:
df.describe()紅色箭頭所指就是異常值。
以上是常用到的判斷異常值的簡單方法。下面來介紹一些較為復雜的檢測異常值演算法,由於涉及內容較多,僅介紹核心思想,感興趣的朋友可自行深入研究。
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. 專門的離群點檢測
其實以上說到聚類方法的本意是是無監督分類,並不是為了尋找離群點的,只是恰好它的功能可以實現離群點的檢測,算是一個衍生的功能。
『貳』 python 異常處理總結
什麼是異常?
異常即是一個事件,該事件會在程序執行過程中發生,影響了程序的正常執行。一般情況下,在Python無法正常處理程序時就會發生一個異常。
異常是Python對象,表示一個錯誤。當Python腳本發生異常時我們需要捕獲處理它,否則程序會終止執行。
python提供了兩個非常重要的功能來處理python程序在運行中出現的異常和錯誤。你可以使用該功能來調試python程序。
異常處理: 本站Python教程會具體介紹。
斷言(Assertions):本站Python教程會具體介紹。
異常處理
捕捉異常可以使用try/except語句。try/except語句用來檢測try語句塊中的錯誤,從而讓except語句捕獲異常信息並處理。如果你不想在異常發生時結束你的程序,只需在try里捕獲它。
語法:
以下為簡單的try….except…else的語法:
try的工作原理是,當開始一個try語句後,python就在當前程序的上下文中作標記,這樣當異常出現時就可以回到這里,try子句先執行,接下來會發生什麼依賴於執行時是否出現異常。
· 如果當try後的語句執行時發生異常,python就跳回到try並執行第一個匹配該異常的except子句,異常處理完畢,控制流就通過整個try語句(除非在處理異常時又引發新的異常)。
· 如果在try後的語句里發生了異常,卻沒有匹配的except子句,異常將被遞交到上層的try,或者到程序的最上層(這樣將結束程序,並列印預設的出錯信息)。
· 如果在try子句執行時沒有發生異常,python將執行else語句後的語句(如果有else的話),然後控制流通過整個try語句。
實例
下面是簡單的例子,它打開一個文件,在該文件中的內容寫入內容,且並未發生異常:
以上程序輸出結果:
實例
下面是簡單的例子,它打開一個文件,在該文件中的內容寫入內容,但文件沒有寫入許可權,發生了異常:
以上程序輸出結果:
使用except而不帶任何異常類型
你可以不帶任何異常類型使用except,如下實例:
以上方式try-except語句捕獲所有發生的異常。但這不是一個很好的方式,我們不能通過該程序識別出具體的異常信息。因為它捕獲所有的異常。
使用except而帶多種異常類型
你也可以使用相同的except語句來處理多個異常信息,如下所示:
try-finally 語句
try-finally 語句無論是否發生異常都將執行最後的代碼。
實例
如果打開的文件沒有可寫許可權,輸出如下所示:
同樣的例子也可以寫成如下方式:
當在try塊中拋出一個異常,立即執行finally塊代碼。finally塊中的所有語句執行後,異常被再次提出,並執行except塊代碼。參數的內容不同於異常。
異常的參數
一個異常可以帶上參數,可作為輸出的異常信息參數。你可以通過except語句來捕獲異常的參數,如下所示:
變數接收的異常值通常包含在異常的語句中。在元組的表單中變數可以接收一個或者多個值。
元組通常包含錯誤字元串,錯誤數字,錯誤位置。
實例
以下為單個異常的實例:
以上程序執行結果如下:
觸發異常
我們可以使用raise語句自己觸發異常
raise語法格式如下:
語句中Exception是異常的類型(例如,NameError)參數是一個異常參數值。該參數是可選的,如果不提供,異常的參數是」None」。
最後一個參數是可選的(在實踐中很少使用),如果存在,是跟蹤異常對象。
實例
一個異常可以是一個字元串,類或對象。 Python的內核提供的異常,大多數都是實例化的類,這是一個類的實例的參數。
定義一個異常非常簡單,如下所示:
注意:為了能夠捕獲異常,」except」語句必須有用相同的異常來拋出類對象或者字元串。
例如我們捕獲以上異常,」except」語句如下所示:
用戶自定義異常
通過創建一個新的異常類,程序可以命名它們自己的異常。異常應該是典型的繼承自Exception類,通過直接或間接的方式。
以下為與RuntimeError相關的實例,實例中創建了一個類,基類為RuntimeError,用於在異常觸發時輸出更多的信息。
在try語句塊中,用戶自定義的異常後執行except塊語句,變數 e 是用於創建Networkerror類的實例。
在你定義以上類後,你可以觸發該異常,如下所示:
來源 | 腳本之家 原文鏈接:http://www.jb51.net/article/47996.htm