所謂離群值就是異常值,這個和極值其實並不一樣。常用的剔除離群值的方法有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)
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:
new_data.append(value)
這三個方法思路簡單,易於實現,但是隻能處理一維資料,接下來,再考慮更復雜但卻更精準的可適用於多維資料的離群值處理方法!參考資料:離群點檢測---基於kNN的離群點檢測、LOF演算法和CLOF演算法
所謂離群值就是異常值,這個和極值其實並不一樣。常用的剔除離群值的方法有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:
new_data.append(value)
return new_data
這三個方法思路簡單,易於實現,但是隻能處理一維資料,接下來,再考慮更復雜但卻更精準的可適用於多維資料的離群值處理方法!參考資料:離群點檢測---基於kNN的離群點檢測、LOF演算法和CLOF演算法