Outlier Handling
이상치 처리
- 이상치란, 데이터의 중심에서 많이 떨어져 있는 값을 의미한다.
- 이러한 이상치들은 Mean(평균)에는 많은 영향을 미치나, Median(중앙값)에는 많은 영향을 미치지 않는다.
- Linear Regression에서는 이상치를 제거해야 성능이 제고되나,
k-NN에서는 이상치가 미치는 영향이 크지 않다.
- 이상치가 통계학에서 갖는 의의는 아래 포스트를 참조하자.
* Outlier (이상치) (URL)
- 대표적인 이상치 처리 방법은 아래와 같다:
- Standard Score(\(Z\); 표준점수)로 변환한 후, \(\pm 3\sigma\) 를 제거하는 방법
- IQR을 이용한 처리 방법
- Domain 지식을 기반으로 한 처리 방법
- 이상치를 처리하는 방법은 아니지만,
Skewness(데이터의 분포가 극단적으로 한 곳에 집중된 양상; 왜도)를 해결하는 방법은 아래와 같다:
(대부분의 ML 모델은 특정 분포 하에서 좋은 성능을 보이기 때문에 이러한 전처리 작업이 수반된다.)
- Log Transformation (로그 변환)
- Square Root Transformation (루트 변환)
- Box-Cox Transformation (Box-Cox 변환)
- matplotlib의 Box Plot을 이용한 아래의 코드를 통해 Outlier를 시각화할 수 있다.
import matplotlib.pyplot as plt
plt.boxplot(data) # data: Outlier를 확인하고자 하는 데이터셋
plt.show()
Standard Score(\(Z\); 표준점수)로 변환한 후, \(\pm 3\sigma\) 를 제거하는 방법
IQR을 이용한 처리 방법
import pandas as pd
Q1 = x_train['<column_name>'].quantile(0.25)
Q3 = x_train['<column_name>'].quantile(0.75)
IQR = Q3 - Q1
MIN = Q1 - 1.5 * IQR
MAX = Q3 - 1.5 * IQR
target = x_train[ (x_train['<column_name>'] < MIN) | (x_train['<column_name>'] > MAX) ]
x_train = x_train.drop(target.index)
y_train = y_train.drop(target.index)
Domain 지식을 기반으로 한 처리 방법
Log Transformation (로그 변환)
- 데이터들의 Skewness를 해소하는 방법 중 하나이다.
- 이때, np.log()
함수가 아닌, np.log1p()
함수를 사용하는데,
데이터가 0인 경우 -inf로 변환됨을 방지하기 위해서이다.
(로그변환 후, 원래 값으로 다시 변환하기 위해 np.expm1() 함수를 사용한다.)
* NumPy log1p()
Function
- log(1+x)를 취하는 함수이다. (데이터에 1을 더해서 로그를 취하는 함수이다.)
* NumPy expm1()
Function
- exp(x) - 1을 계산하는 함수이다.
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import skew
x = np.random.RAndomState(2022).lognormal(size=(100))
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.hist(x)
plt.title(f'{skew(x)}')
plt.subplot(1, 2, 2)
plt.hist(np.log(x))
plt.title(f'{skew(np.log(x)}')
plt.show()