常用去除離群值的演算法!

2021-09-25 12:20:28 字數 1840 閱讀 7383

1.引言:

資料預處理的方法主要包括去極值、標準化、中性化。那麼這裡介紹幾個常用的去離群值的方法,所謂離群值就是異常值,這個和極值其實並不一樣。常用的剔除離群值的方法有mad、

2.mad演算法

mad,即median absolute deviation,可譯為絕對中位值偏差。其大致思想是通過判斷每乙個元素與中位值的偏差是否處於合理的範圍內來判斷該元素是否為離群值。具體方法如下:

(1)計算所有元素的中位值:

(2)計算所有元素與中位值的絕對偏差:

(3)取得絕對偏差的中位值:

(4)確定引數n,則可以對所有的資料作如下調整:

在這裡我沒有調整離群值,而是直接將其剔除了。

**如下:

import numpy as np

# mad法: media absolute deviation

def mad(dataset, n):

median = np.median(dataset) # 中位數

deviations = abs(dataset - median)

mad = np.median(deviations)

remove_idx = np.where(abs(dataset - median) > n * mad)

new_data = np.delete(dataset, remove_idx)

return new_data

2.又稱為標準差法。標準差本身可以體現因子的離散程度,和mad演算法類似,只是用到的不是中位值,而是均值,並且n的取值為3,**如下:

# 3sigma法

def three_sigma(dataset, n= 3):

mean = np.mean(dataset)

sigma = np.std(dataset)

remove_idx = np.where(abs(dataset - mean) > n * sigma)

new_data = np.delete(dataset, remove_idx)

return new_data

3.百分位法百分位計算的邏輯是將因子值進行公升序的排序,對排位百分位高於97.5%或排位百分位低於2.5%的因子值,類似於比賽中」去掉幾個最高分,去掉幾個最低分「的做法。**如下:這裡引數採用的是20%和80%,具體取值,還需具體情況具體分析。

# 百分位法:原始引數 min=0.025, max=0.975

def percent_range(dataset, min= 0.20, max= 0.80):

range_max = np.percentile(dataset, max * 100)

range_min = -np.percentile(-dataset, (1 - min) * 100)

# 剔除前20%和後80%的資料

new_data =

for value in dataset:

if value < range_max and value > range_min:

return new_data

這三個方法思路簡單,易於實現,但是只能處理一維資料,接下來,再考慮更複雜但卻更精準的可適用於多維資料的離群值處理方法!參考資料:離群點檢測---基於knn的離群點檢測、lof演算法和clof算

資料建模 極端值的檢測 離群值檢測

極端值 又稱離群值,往往會扭曲 結果並影響模型精度。回歸模型 線性回歸,廣義線性回歸 中離群值的影響尤其大,使用該模型時我們需要對其進行檢測和處理。處理離群值或者極端值並不是資料建模的必要流程,然而,了解它們對 模型的影響也是大有裨益的。資料分析師們需要自己判斷處理離群值的必要性,並結合實際問題選取...

poj 2833 堆的應用(去若干最大值最小值)

題意 給定一些正數,去掉給定個數的最大值和給定個數的最小值,輸出其餘數字的平均數。思路 建立乙個大頂堆,乙個小頂堆。大頂堆的大小為去掉的最小值個數,存放當前的若干最小值。遍歷資料的同時維護這兩個堆,最後堆中的資料即為需要去掉的資料。輸入 1 2 5 1 2 3 4 5 4 2 10 2121187 ...

去除List集合中的重複值 去除陣列的重複值

一 最近專案中需要對list集合中的重複值進行處理,大部分是採用兩種方法,一種是用遍歷list集合判斷後賦給另乙個list集合,一種是用賦給set集合再返回給list集合。但是賦給set集合後,由於set集合是無序的,原先的順序就打亂了。所以我又想著能不能用set的特性進行去重又不打亂順序呢?試了一...