-
불균형 데이터의 문제와 해결 방법, 평가지표머신러닝 배우기 2023. 12. 28. 00:37
오늘은 "불균형 데이터"에 대해서 다뤄보려고 합니다. 불균형 데이터는 클래스별 개수가 크게 차이나는 분류 데이터를 의미합니다.
불균형 데이터는 참 골치 아픕니다. 왜 골치 아픈 친구들이며 어떻게 처리해야하는지 여러 기법들에 대해서 배워보도록 하겠습니다.
▶︎ 불균형 데이터가 왜 문제가 돼?
→ 다수 클래스 위주로 정답을 부르는 모델로 학습됩니다. 클래스가 불균형하면 모델은 다수의 클래스에 대해 높은 중요성을 부여하여 학습을 하게 됩니다. 그래서 소수 클래스에 대해서는 충분한 학습이 이루어지지 않아 이를 잘 분류해내지 못합니다.
→ 예를 들어, 1000개 카드 거래 중의 999개가 정상 거래, 1개가 사기 거래 일 때, 모델이 모든 클래스에 대해 정상 거래라고 예측을 해도 99.9% 정확도를 얻을 수 있습니다. 하지만 사기 거래, 암환자, 스팸문자를 분류하는데 모두 정상이라고 분류해서 높은 정확도를 얻었다한들 문제가 되지 않을까요? 이러한 상황에서는 거짓양성(false positive)과 거짓음성(false negative)이 서로 다른 cost를 가지고 있습니다. FP과 관련된 오류가 제 1종 오류, FN과 관련된 오류가 제 2종 오류라고 부릅니다. 소수 클래스를 정확히 분류하는 것이 중요한 문제일 때, 소수 클래스도 다수 클래스만큼 잘 분류할 수 있도록 데이터의 비율을 맞춰줄 필요가 있습니다.
▶︎ 소수 클래스를 정확히 분류해야할 때? 좀 더 예를 들어주세요
문제의 특성과 상황에 따라 단순하게 정답을 많이 맞추는 것이 아닌 틀리지 말아야할, 틀려도 상황에 따라 어떤 것을 틀리느냐에 따라 위험한 상황들이 많습니다. 암 진단과 스팸 메일 분류 두 가지 예를 들어보겠습니다.
→ 암 진단 위험도 : 암에 걸렸는데 안걸렸다고 하는 것 >> 암에 안걸렸는데 걸렸다고 하는 것 (FN을 줄여야 함)
→ 스팸 메일 분류 위험도 : 스팸메일인데 아니라고 하는 것 < 스팸메일이 아닌데 스팸메일이라고 분류하는 것 (FP을 줄여야 함)
→ 이렇게 사람의 생명과 관련있거나 대고객 서비스 등의 문제에서는 틀렸을 때의 민감도와 위험이 엄청납니다. 따라서 문제의 상황에 따라 성능 평가를 다르게 가지고 가야합니다.
▶︎ 그러면 불균형 데이터의 성능은 어떻게 측정해?
→ 따라서, 정확도와 더불어 Confusion Matrix를 활용하여 모델의 분류 성능을 다각도로 평가하고 비교하여 모델의 목적과 상황을 고려하여 적절한 평가 지표를 선택하고 임계값을 조절해야 합니다.
→ 또한 문제의 특성에 따라 Precision 과 Recall 중에 무엇을 더 중요하게 여겨야할지 고민해야합니다!
→ Recall 재현율 : 실제 맞는데 잘못 예측하는 것이 위험한 경우 (FN에 민감한 경우, 암 진단)
→ Precision 정밀도 : 실제 잘못됐는데 맞다고 예측하는 것이 위험한 경우 (FP에 민감한 경우, 스팸메일 분류)
▶︎ 그럼 불균형 데이터를 어떻게 처리해야해?
불균형 데이터를 처리하기 위한 다양한 샘플링 방법이 있습니다.
1. Over Sampling
- 개념 : 소수 클래스를 다수 클래스의 수만큼 랜덤 복원 추출하는 방법
- 단점 : 소수 클래스를 복제하는 것이기 때문에 다양성을 잃고 실제 데이터의 특징을 잘 반영하지 못할 수 있습니다. 즉 train data에 맞춰진 오버피팅이 발생할 수 있습니다. 또한 데이터가 늘어난 만큼 모델의 복잡도가 커집니다.
2. Under Sampling
- 개념 : 다수 클래스를 소수 클래스의 수만큼 랜덤 비추출하는 방법 (다수 클래스의 다양성을 위해 보통 비복원 추출 사용)
- 단점 : 다수 클래스의 유용한 정보를 손실시켜 데이터의 특징을 학습하는데 방해가 될 수 있습니다.
3. Over Under Sampling
- 개념 : 소수 클래스에는 Over Sampling을 적용하고 다수 클래스에는 Under Sampling을 적용해서 두 클래스의 비율을 맞추도록 샘플링하는 방법
- 단점 : 언더 샘플링과 오버 샘플링을 반반 섞는 만큼, 두 기법의 단점도 조금씩 가져오게 됩니다. 다수 클래스에서는 정보의 손실이 일어나고 소수 클래스에서는 다양성을 반영하지 못해 양 쪽 다 충분히 일반화하지 못한 train data 에 맞춘 오버피팅이 잃어날 수 있습니다
4. SMOTE (Synthetic Minority Over-sampling Technique)
- 개념 : KNN 기법을 사용하여 소수 클래스의 데이터를 조금씩 변형하여 새로운 소수 데이터를 만들어내는 방법.
- 작동 순서 :
1. 임의의 소수 클래스 선택
2. knn을 활용하여 유클리드 거리 기반 k개의 최근접 이웃 찾기
3. 보간법을 활용하여 (0,1) 사이의 값으로 내분하여 새로운 데이터 생성 (보통은 0.5 사용)
4. 새로 만든 데이터를 소수 데이터에 추가
5. 오버 샘플링 비율에 기반해 위 방법을 반복합니다
- 단점
1. SMOTE로 생성된 새로운 데이터는 기존 소수 클래스의 샘플을 기반으로 만들어졌기 때문에 결정 경계가 왜곡될 수 있습니다. 또한 다수 클래스와 소수 클래스의 결정 경계를 모호하게 할 수 있습니다.
2. 다수 클래스의 데이터 분포를 고려하지 않고 소수 클래스에 속하는 데이터들만 보간하므로 다수 클래스의 데이터들과 간섭하게 되는 overlapping이 발생합니다.
5. SMOTE-Tomek
- 개념 : SMOTE로 오버 샘플링한 후 소수클래스와 가까운 다수 클래스를 제외하여 결정 경계를 정리하고 구분하는 기법. 즉, SMOTE로 소수 클래스를 늘리고 Tomek line으로 다수 클래스는 줄이는 방식이 동시에 적용됐다고 볼 수 있습니다.
- 작동 방법 : SMOTE 후 서로 다른 클래스에 속하는 가장 가까운 두 점으로 쌍을 만듭니다. 그 후 다수 클래스에 속하는 데이터를 삭제함으로써 결정경계를 정리할 수 있습니다.
6. ADASYN
- 개념 : SMOTE의 다수 클래스 데이터 분포를 고려하지 않은 한계점을 해결하기 위해 데이터의 밀도 분포를 계산하여 합성 샘플들의 수를 동적으로 부여하는 기법
- 밀도가 낮은 곳에 더 많은 소수 데이터를 생성시키는 이유 : 불균형한 클래스의 분포를 효과적으로 맞추기 위함입니다. 소수 클래스의 밀도가 낮으면 소수 클래스가 무시될 확률이 더 크기 때문에 소수 클래스의 존재를 부각시키고 표현을 강화하여 학습을 더 잘할 수 있도록 합니다. 그러면 모델은 다수 클래스와 소스 클래스 간의 구분이 어려운 영역을 좀더 확실하게 구분할 수 있게 되어 학습 성능이 향상될 수 있습니다.
- 작동 방법 : knn 범위 안에 들어온 다수 클래스의 개수를 활용해 밀도에 비례하게 새로운 합성 데이터 갯수를 부여한다.
7. 그 외에도 Borderline-SMOTE도 있고 informed under sampling 기법 중에 Easy Ensemble 알고리즘, Balance Cascade 알고리즘, NearMiss, One-Sided Selection, Hard Negative Mining 등이 있습니다.
▶︎ 꼭 데이터를 늘리거나 줄여야해?
→ 꼭 그렇지 않습니다. 샘플링 기법 외에도 Weight Balancing을 하는 방법이 있습니다. 알고리즘에 기반하여 모델 훈련시 목적함수를 변환하여 해결할 수 있습니다. 예를 들어, 소수 클래스에서 cost의 가중치를 더 크게 하여 잘못 분류했을 때 손실이 치명적이게 만들 수 있습니다. train set 의 각 데이터에서 loss를 계산할 때 소수 클래스에 더 큰 loss 값을 갖도록 하는 방법입니다.
→ 예를 들어 클래스 비율이 1:9 이면 9:1의 가중치를 줌으로써 적은 샘플 수를 가진 클래스를 전체 loss 에 동일하게 기여하도록 할 수 있습니다.
→ 그 외에도 Focal loss 등을 사용하여 Weight Balancing을 하는 방법이 있습니다
참조 자료 :
https://givitallugot.github.io/articles/2021-07/Python-imbalanced-sampling-copy
https://housekdk.gitbook.io/ml/ml/tabular/imbalanced-learning/oversampling-basic-smote-variants
'머신러닝 배우기' 카테고리의 다른 글
[머신러닝] 전처리 및 모델 Pipeline 파이프라인 구축하기 (#파이썬) (0) 2024.01.02 불균형 데이터 SMOTE 코드 위주 실습과 결과 해석 (0) 2023.12.28 카테고리컬 변수 인코딩하는 세가지 방법 (원핫 인코딩, 라벨 인코딩, 바이너리 인코딩) (1) 2023.12.17 [머신러닝] PCA와 feature selection 과의 비교 (0) 2023.12.12 [머신러닝] 클러스터링의 대표, K-means Algorithm (1) 2023.12.12