티스토리 뷰
머신러닝에서 **이상치(Outlier)**는 데이터의 일반적인 패턴에서 크게 벗어난 값을 의미해요. 이상치는 모델 성능에 부정적인 영향을 줄 수 있기 때문에, 이를 적절히 처리하는 것은 중요한 단계입니다. 이 포스팅에서는 이상치의 정의와, 머신러닝 모델에서 이상치를 다루는 방법에 대해 설명하겠습니다.
1. 이상치란 무엇인가?
이상치는 데이터의 일반적인 분포에서 벗어난 값을 의미합니다. 이상치는 여러 가지 이유로 발생할 수 있습니다:
- 데이터 입력 오류: 잘못된 값이 입력되었거나 측정 오류로 인해 발생.
- 비정상적인 상황: 실제로 드물게 발생하는 극단적인 경우를 나타냄.
- 특정 이벤트나 패턴: 외부 요인에 의해 데이터가 비정상적으로 변동하는 경우.
이상치는 데이터 분석과 머신러닝 모델링에 부정적인 영향을 줄 수 있기 때문에, 적절한 방법으로 처리하는 것이 중요합니다.
2. 이상치 탐지 방법
먼저 이상치를 탐지해야 합니다. 다음과 같은 방법으로 이상치를 발견할 수 있습니다.
2.1 기술 통계 사용
- 평균, 표준편차, 사분위수 등을 통해 데이터의 분포를 파악할 수 있습니다.
- Z-점수(Z-score): 각 데이터가 평균으로부터 얼마나 떨어져 있는지 표준편차 단위로 나타냅니다.
- Z-점수가 ±3 이상이면 이상치로 간주할 수 있습니다.
2.2 IQR (Interquartile Range) 사용
- IQR은 데이터의 1사분위(Q1)와 3사분위(Q3) 사이의 범위를 말합니다.
- 이상치는 보통 Q1 - 1.5 * IQR보다 작거나 Q3 + 1.5 * IQR보다 큰 값으로 정의됩니다.
2.3 시각화 방법
- 박스 플롯(Box plot): 이상치가 상자 바깥의 점으로 표시되므로 시각적으로 이상치를 쉽게 확인할 수 있습니다.
- 산점도(Scatter plot): 두 변수 간의 관계에서 이상치를 시각적으로 탐지할 수 있습니다.
2.4 밀도 기반 방법 (DBSCAN)
- 밀도 기반 군집화 알고리즘인 DBSCAN을 사용하여 데이터에서 밀도가 낮은 영역의 점들을 이상치로 간주할 수 있습니다.
3. 이상치를 다루는 방법
이상치를 어떻게 처리하느냐에 따라 모델 성능이 크게 달라질 수 있습니다. 일반적으로 이상치를 처리하는 방법은 다음과 같습니다.
3.1 이상치 제거
- 설명: 극단적으로 벗어난 데이터를 제거하는 방법입니다.
- 장점: 모델에 부정적인 영향을 미칠 수 있는 데이터를 제거하여 성능을 향상시킬 수 있습니다.
- 단점: 데이터가 적을 경우, 유용한 정보를 포함한 데이터를 잃을 수 있습니다.
- 방법:
- Z-점수나 IQR을 사용하여 일정 기준을 초과하는 데이터를 제거합니다.
# IQR 기반으로 이상치 제거
Q1 = data['feature'].quantile(0.25)
Q3 = data['feature'].quantile(0.75)
IQR = Q3 - Q1
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
data_clean = data[(data['feature'] >= lower_bound) & (data['feature'] <= upper_bound)]
3.2 이상치 대체 (Imputation)
- 설명: 이상치를 다른 값으로 대체하는 방법입니다.
- 장점: 데이터를 유지하면서도 이상치의 영향을 줄일 수 있습니다.
- 단점: 대체할 값이 신중하게 선택되지 않으면, 데이터의 변동성을 왜곡할 수 있습니다.
- 방법:
- 평균, 중앙값, 최빈값으로 대체합니다.
- **KNN (K-Nearest Neighbors)**를 사용하여 유사한 이웃들의 값을 사용해 이상치를 대체합니다.
# 중앙값으로 이상치 대체
median = data['feature'].median()
data['feature'] = np.where((data['feature'] < lower_bound) | (data['feature'] > upper_bound), median, data['feature'])
3.3 로그 변환 (Log Transformation)
- 설명: 이상치가 양수일 경우, 로그 변환을 사용하여 데이터의 범위를 줄일 수 있습니다.
- 장점: 분포가 오른쪽으로 치우친 데이터(positive skew)를 정규 분포에 가깝게 변환할 수 있습니다.
- 단점: 데이터가 음수거나 0일 경우 로그 변환이 불가능하며, 로그 변환을 적용한 후에도 해석이 복잡할 수 있습니다.
# 로그 변환 적용
data['feature'] = np.log(data['feature'] + 1)
3.4 로버스트 스케일링 (Robust Scaling)
- 설명: 이상치의 영향을 줄이기 위해 중위수와 IQR을 사용하여 데이터를 스케일링하는 방법입니다.
- 장점: 일반적인 스케일링 방법보다 이상치의 영향을 덜 받습니다.
- 방법: scikit-learn의 RobustScaler를 사용하여 스케일링합니다.
from sklearn.preprocessing import RobustScaler
scaler = RobustScaler()
data_scaled = scaler.fit_transform(data[['feature']])
3.5 모델 기반 처리 (Tree-based Model)
- 설명: 트리 기반 모델(랜덤포레스트, XGBoost 등)은 이상치에 덜 민감합니다. 이상치를 제거하거나 변환하지 않고도 좋은 성능을 낼 수 있습니다.
- 장점: 이상치 처리를 따로 하지 않아도 성능이 잘 나오는 경우가 많습니다.
- 단점: 트리 기반 모델에만 해당하며, 다른 모델에서는 여전히 이상치 처리가 필요할 수 있습니다.
4. 머신러닝에서 이상치 제거가 필요하지 않은 상황
이상치(Outlier)는 데이터 분석에서 일반적으로 제거하거나 처리하는 것이 좋다고 여겨지지만, 모든 경우에 이상치를 제거하는 것이 최선은 아닙니다. 이상치 제거가 필요하지 않은 상황도 있으며, 이런 경우에는 이상치를 보존하거나 특별한 처리 없이 사용하는 것이 바람직할 수 있습니다.
4.1 이상치가 중요한 패턴을 나타낼 때
이상치는 때로 중요한 패턴이나 드문 사건을 나타낼 수 있으며, 이런 이상치를 제거하면 모델 성능이 오히려 나빠질 수 있습니다. 예측하려는 대상이 드문 이벤트나 극단적인 경우라면, 이상치를 보존하는 것이 모델 성능 향상에 기여할 수 있습니다.
- 사기 탐지(Fraud Detection): 사기 사건은 일반적으로 정상 거래와 다른 극단적인 패턴을 보입니다. 이러한 사기 데이터를 이상치로 간주하고 제거하면, 사기 탐지 모델이 정상 거래만 학습하게 되어 사기를 예측하지 못할 수 있습니다.
- 고가 상품 판매 예측: 대부분의 상품 가격이 중간 범위에 속하더라도, 고가 상품의 판매가 비정상적인 이상치로 보일 수 있습니다. 하지만 이러한 데이터를 포함하여 예측해야 고가 상품의 판매 트렌드를 제대로 반영할 수 있습니다.
4.2 트리 기반 모델을 사용할 때
트리 기반 모델(예: 랜덤 포레스트, XGBoost)은 이상치에 상대적으로 민감하지 않은 모델입니다. 트리 기반 모델은 데이터를 분할할 때 상대적인 순서를 사용하므로, 극단적인 값이 모델 성능에 큰 영향을 미치지 않습니다. 이 경우, 이상치를 굳이 제거하거나 변환할 필요가 없을 수 있습니다.
- 랜덤 포레스트, XGBoost: 트리 기반 알고리즘은 이상치가 있어도 성능에 큰 영향을 받지 않기 때문에, 별도의 이상치 제거 없이도 좋은 성능을 낼 수 있습니다. 트리 기반 모델은 분할 과정에서 이상치의 영향을 최소화하므로, 이상치를 그대로 둬도 성능 저하가 거의 없습니다.
4.3 이상치가 자연스러운 현상일 때
이상치가 자연스러운 현상일 경우, 이를 제거하는 것은 데이터의 본질을 훼손할 수 있습니다. 데이터에서 극단적인 값이 나오더라도, 그 값이 본래 그 도메인에서 자연스럽게 발생하는 경우라면 이상치를 제거하지 않아야 합니다.
- 자연재해 데이터: 기상 데이터에서 매우 극단적인 날씨(폭우, 폭설 등)가 발생하는 것은 자연스러운 현상입니다. 이러한 데이터를 이상치로 보고 제거하는 것은 모델이 자연재해를 예측하는 데 필요한 정보를 잃게 할 수 있습니다.
- 금융 시장 데이터: 주식 시장의 극단적인 상승 또는 하락은 자연스러운 현상일 수 있으며, 이를 이상치로 보고 제거하는 것은 모델이 시장의 급변동을 제대로 학습하지 못하게 할 수 있습니다.
4.4 작은 데이터셋일 때
데이터셋이 작을 때, 이상치를 제거하면 모델 학습에 사용할 데이터가 부족해질 수 있습니다. 작은 데이터셋에서는 최대한 많은 데이터를 활용하는 것이 중요하므로, 극단적인 값을 포함한 모든 데이터를 보존할 필요가 있습니다.
- 임상 연구 데이터: 환자 수가 적은 임상 연구에서는 데이터가 소중하기 때문에, 이상치를 제거하는 것보다는 다른 방식으로 처리하거나 그대로 사용하는 것이 중요할 수 있습니다. 이 경우 이상치를 제거하면 샘플 수가 너무 적어져 모델이 제대로 학습하지 못할 수 있습니다.
4.5 모델의 목적이 이상치를 예측하는 경우
머신러닝 모델의 목적 자체가 이상치나 비정상적인 값을 예측하는 것이라면, 이상치를 제거하는 것이 아니라 이를 모델 학습에 포함해야 합니다. 이상치는 이 경우 모델이 학습해야 할 중요한 데이터입니다.
- 부도 예측 모델: 부도는 드물게 발생하는 사건이지만, 이를 예측하는 것이 모델의 주된 목적입니다. 따라서 부도와 같은 이상치를 제거하면 모델이 중요한 패턴을 놓칠 수 있습니다.
- 의료 데이터에서 질병 예측: 일반적으로 건강한 사람들의 데이터가 많고, 질병이 있는 환자의 데이터는 적을 수 있습니다. 이 경우, 질병 데이터를 이상치로 보고 제거하면 질병 예측에 실패할 수 있습니다.
4.6 이상치 처리 비용이 높을 때
이상치를 처리하는 것은 때로는 상당한 시간과 비용이 소모될 수 있습니다. 특히, 이상치가 많지 않거나 모델 성능에 크게 영향을 미치지 않는다면, 이상치를 제거하거나 변환하는 대신 그대로 두고 모델링을 진행할 수 있습니다.
- 빠른 프로토타이핑: 초기 모델 개발 단계에서 이상치 처리에 많은 시간을 들이기보다는, 이상치를 그대로 둔 상태로 빠르게 프로토타이핑을 진행할 수 있습니다. 나중에 성능을 개선하는 단계에서 이상치를 처리할 수 있습니다.
5. 이상치와 극단값
5.1 이상치와 극단값의 주요 차이점
특징 | 이상치(Outlier) | 극단값(Extreme Value) |
정의 | 데이터의 전반적인 패턴에서 벗어난 값 | 데이터 범위에서 가장 크거나 작은 값 |
발생 이유 | 데이터 오류, 드문 사건, 특이 상황 | 데이터 분포 상 자연스럽게 발생하는 값 |
분포와의 관계 | 데이터 분포에서 비정상적으로 벗어난 값 | 데이터 분포의 끝에 있는 값 |
처리 방법 | 제거, 대체, 변환 등의 처리가 필요할 수 있음 | 대부분 제거하지 않으며, 자연스러운 데이터로 간주 |
예시 | 성인 체중이 200kg인 값 (입력 오류일 가능성 있음) | 키가 200cm인 사람 (자연스럽지만 극단적인 값) |
5.2 어떤 경우에 이상치와 극단값을 구분해야 하나요?
5.2.1 도메인 지식의 활용
- 도메인 지식을 바탕으로 이상치와 극단값을 구분하는 것이 중요합니다. 어떤 값이 비정상적인지, 또는 정상적이지만 극단적인 값인지 결정하는 것은 데이터가 속한 분야와 상황에 따라 달라질 수 있습니다.
- 예를 들어, 의료 데이터에서 특정 환자의 결과가 극단적인 경우, 이는 질병이나 상태를 설명하는 중요한 정보일 수 있습니다. 반면, 데이터 입력 오류로 인한 비정상적인 값일 수도 있습니다.
5.2.2 이상치일 가능성이 낮은 극단값
- 극단값은 대부분 자연스러운 값일 수 있습니다. 예를 들어, 평균보다 매우 큰 주택 가격이 있더라도 이는 시장에서 발생할 수 있는 정상적인 값일 수 있습니다. 그러나 이상치는 이러한 자연스러운 데이터 범위와는 명백히 다른 값을 나타냅니다.
- 이상치와 극단값을 혼동해서는 안 되며, 극단값이 모델에 포함되어야 할 중요한 데이터일 수 있습니다.
5.2.3 머신러닝에서의 처리
- 트리 기반 모델(예: 랜덤 포레스트, XGBoost)은 이상치와 극단값 모두에 비교적 둔감합니다. 이러한 모델은 데이터를 분할하는 방식으로 이상치나 극단값이 모델 성능에 크게 영향을 미치지 않습니다.
- 그러나 선형 회귀나 KNN 같은 모델은 이상치와 극단값에 민감하기 때문에 적절한 처리가 필요할 수 있습니다.
결론
이상치는 머신러닝 모델에 부정적인 영향을 미칠 수 있지만, 항상 제거하거나 변환해야 하는 것은 아닙니다. 이상치가 중요한 패턴을 나타내거나, 자연스러운 현상을 반영하거나, 트리 기반 모델을 사용할 때는 이상치를 그대로 두는 것이 더 나을 수 있습니다. 특히, 데이터의 양이 적거나 이상치 예측이 모델의 주요 목적일 경우, 이상치를 보존하는 것이 중요할 수 있습니다. 따라서, 각 상황에 맞게 이상치를 제거할지 혹은 유지할지 신중하게 결정해야 합니다.
이상치를 다루는 최선의 방법은 도메인 지식을 활용해 해당 이상치가 어떤 의미를 가지는지 분석한 후, 모델 성능에 미치는 영향을 고려해 적절한 처리를 선택하는 것입니다.
'AI > 머신러닝' 카테고리의 다른 글
[머신러닝] 로지스틱 회귀분석(오즈를 왜 쓸까?) (0) | 2024.12.04 |
---|---|
[머신러닝] 트리 모델, 배깅과 부스팅 (0) | 2024.12.01 |
[데이터분석] Feature Selection과 Feature Engineering 가이드 (1) | 2024.10.06 |
[데이터분석] 데이터 탐색, 시각화 및 전처리 가이드 (0) | 2024.10.06 |
[데이터분석] 데이터 수집 가이드 (1) | 2024.10.05 |
- Total
- Today
- Yesterday
- ChatGPT
- 실기
- 오블완
- Python
- opic
- 아침운동
- 빅데이터 분석기사
- Ai
- 다이어트
- 습관
- 프로그래머스
- 경제
- 스크랩
- 루틴
- 미라클모닝
- 고득점 Kit
- IH
- 갓생
- 아침
- 오픽
- 기초
- 운동
- 줄넘기
- 티스토리챌린지
- C언어
- llm
- 영어회화
- 30분
- 뉴스
- SQL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |