본문 바로가기
CS/머신러닝

머신러닝 이상치 (outlier) 제거하기

by jaehoonChoi 2023. 2. 18.

머신러닝에서 이상치를 제거해야 예측성능을 높일 수 있습니다.

예를 들어 몇년치 자전거 이용 수요를 예측하는데 어떤 하루가 자전거 대회가 열렸던 날이라면

그 날을 제거하고 모델을 테스트하는게 타당합니다. 한 이상치로 인해 다양한 예측지표나 계산값에

악영향을 미치기 때문입니다.

 

이상치 제거로 자주 쓰이는 방법은 IQR 방식입니다. 

IQR은 사분위 값의 편차를 이용하여 이상치를 걸러내는 방법입니다.

'사분위' 란 전체 데이터를 정렬하여 이를 4등분합니다.

이 구간을 Q1(25%), Q2(50%), Q3(75%), Q4(100%) 라 하면

IQR는 Q3 - Q1 가 됩니다. 

이제 IQR에 가중치 w를 곱하여 일반적인 데이터의 최대와 최소 범위를 정해줍니다.

주로 w=1.5를 사용하며, 일반적인 최댓값을 Q3+IQR*w 까지로 간주하고 그 이상은 이상치로 봅니다.

마찬가지로 일반적인 최솟값을 Q1-IQR*w까지로 간주하고 그 이하는 이상치로 봅니다.

 

이상치를 제거하는 함수는 따로 sklearn에서 제공하지 않습니다. 함수를 간단하게 만들어봅시다.

 

def get_outlier(df=None, column=None, weight=1.5):
    fraud=df[df['Class']==1][column]
    q25=np.percentile(fraud.values, 25)
    q75=np.percentile(fraud.values, 75)
    IQR=q75-q25
    IQR_weight=IQR*weight
    lower, upper=q25-IQR_weight, q75+IQR_weight
    outlier_idx=fraud[fraud<lower|fraud>upper].index
    return outlier_idx

 

fraud라는 변수는 이상치를 알아볼 데이터입니다.

numpy의 percentile함수는 사분위 값을 제공합니다. 

IQR을 구하고 가중치를 곱하여 lower,upper을 만들어 이를 넘는 값들은 불리언 인덱싱으로

outlier_idx에 담아놓는 방식입니다.

이 함수의 리턴값을 axis=0으로 설정하여 drop하면 데이터에서 이 행들이 빠지게 됩니다.

 

 

 

댓글