불균형 데이터
- 클래스 분포를 예측해야 하는 분류문제에서 예측 라벨 값의 분포수가 현저히 차이나는 데이터로, 불균형한 분포를 가진 데이터로 학습하면 성능에 문제가 발생할 수 있습니다.
- 불균형한 데이터 셋은 이상 데이터를 정확히 찾아내지 못할 수 있다는 문제점이 존재합니다.
해결방법
- 소수 클래스에 속하는 데이터들을 추가로 수집합니다.
- 불균형 데이터 분류 모델에 적합한 성능평가의 지표를 선정합니다.
- 모델 학습 전, 데이터를 적절한 방식으로 Sampling 합니다. 아래와 같은 샘플링의 종류가 있습니다.
- UnderSampling: Random Sampling, Tomek Links 등
- OverSampling: Resampling, SMOTE, Borderline SMOTE, ADASYN 등
- 비용 또는 가중치를 조정합니다.
- Outlier detection 방법을 사용합니다.
- One-class SVM, Isolation Forest, DBSCAN clustering 등
Sampling
아래와 같이 Sampling에는 크게 2가지가 있습니다.
왼쪽 그림과 같이 데이터 수가 많은 클래스의 데이터를 데이터 수가 적은 클래스의 데이터 수에 맞게 줄이는 것이 Undersampling, 오른쪽 그림과 같이 데이터 수가 적은 클래스의 데이터를 데이터 수가 많은 클래스의 데이터 수에 맞게 늘리는 것이 Oversampling이라고 합니다.
머신러닝/딥러닝 분석을 위해서는 많은 데이터 확보가 효과적이기 때문에 통상적으로 Over Sampling 기법 적용을 추천합니다.
먼저 Under Sampling부터 자세히 알아보겠습니다.
1. Under Sampling
Under Sampling은 다수 범주의 데이터를 제거함으로써 모델 학습 계산시간이 감소한다는 장점이 있지만, 데이터 제거로 인한 정보 손실이 발생한다는 단점이 있습니다.
먼저 Random Sampling부터 학습해 보겠습니다.
1-1. Random Sampling
말 그대로 랜덤 하게 데이터로부터 일부만 선택하는 방법입니다. 데이터가 많은 클래스의 데이터를 무작위로 샘플링하기 때문에, 샘플링할 때마다 다른 결과를 얻는다는 단점이 있습니다.
1-2. Tomek Link
이 방법은 Random Sampling의 한계를 보완하는 방법으로 유의한 데이터만 남기는 방식이라고 합니다.
두 범주 사이를 탐지하고 정리를 통해 부정확한 분류경계선을 방지하는 방법입니다. Tomek Link는 아래의 경우에서 Xi, Xj 데이터 간의 링크를 의미합니다.
d(xi, xk) < d(xi, xj) 또는 d(xj, xk) < d(xi, xj)가 되는 관측치 Xk가 없는 경우
조금 더 부연 설명을 해 보자면, 먼저, 다른 클래스의 데이터 2개를 연결했을 때, 주변에 다른 임의의 데이터 Xk가 존재할 때 선택한 두 데이터(Xi, Xj)에서 Xk까지의 거리보다 선택한 두 데이터 사이의 거리가 짧을 때 그 두 데이터 간의 link를 Tomek Link라고 합니다.
위 그림에서 왼쪽의 경우 검은 선은 Tomek Link가 될 수 없는 반면, 오른쪽 경우의 검은 선은 Tomek Link라고 할 수 있습니다.
즉, 아래와 같은 데이터에서 보라색 묶음들이 Tomek Link를 형성합니다.
그리고 이렇게 생성된 Tomek Link들에서, 다수 범주에 속하는 관측치를 제거함으로써 Under Sampling을 할 수 있습니다.
1.3 CNN Rule
- Convolutional Neural Network Rule
CNN Rule은 아래와 같이 동작합니다.
- 소수 범주에 속하는 데이터 전체, 그리고 다수 범주에 속하는 데이터 중 임의로 선택한 데이터 한 개 A로 구성된 서브 데이터를 생성합니다.
- 그 후, 다수 범주에 속하는 A를 제외한 나머지 데이터들 중 하나씩 K=1인 1-NN 방식을 이용하여 해당 데이터가 처음에 선택한 다수 범주 데이터 A와 가까운지 소수 범주 데이터와 가까운지 확인하여 가까운 범주로 임시 분류시킵니다.
- 2번 과정이 끝나면 소수 범주로 분류된 다수 범주 관측치를 제외하고 나머지 다수 범주 관측치를 제거하여 Under Sampling 합니다.
즉 아래와 같이 데이터가 많은 클래스 분포에서 대표적인 데이터만 남기도록 하는 방법입니다.
1.4 One Sided Selection
OSS 방법이라고도 불리는 One Sided Selection은 Tomek Link와 CNN Rule을 합친 방법입니다.
먼저, 데이터가 많은 클래스에서 Tomek Link에 해당하는 데이터를 제거한 후, 나머지 데이터는 CNN을 통해 밀집된 데이터를 제거하는 방식입니다.
이번에는 Over Sampling 종류를 알아보겠습니다.
2. Over Sampling
Over Sampling은 데이터를 증가시키기 때문에 정보 손실이 없고, 대부분의 경우 Under Sampling에 비해 높은 분류 정확도를 보입니다.
하지만, 데이터 증가로 인해 계산 시간이 증가할 수 있고 과적합 가능성이 존재합니다. 또한 노이즈 또는 이상치에 민감하다는 단점이 있습니다.
먼저 Resampling부터 학습해 보겠습니다.
2.1. Resampling
Resampling 방법은 소수 범주의 데이터 수를 다수 범주의 데이터 수와 비슷해지도록 무작위로 복제하여 증가시키는 방법입니다. (Under Sampling의 Random Sampling과 유사합니다.)
무작위로 소수 데이터를 복제함으로써 정보가 손실되지 않지만, 소수 범주에 과적합이 발생할 수 있다는 단점이 있습니다.
2.2 SMOTE
- Synthetic Minority Over-Sampling Technique
이 방법은 Resampling 방법을 보완하기 위한 방법으로, 소수 범주에서 가상의 데이터를 생성하는 방법입니다.
알고리즘은 다음과 같이 동작합니다.
- K값을 고정한 후, 소수 범주에서 임의 데이터를 선택합니다.(K≥2)
- 선택한 데이터와 가장 가까운 K개의 데이터들 사이에 선을 그어 무작위 가상의 데이터(점)를 생성합니다.
- 이 과정을 소수 범주에 속하는 모든 데이터에 대해 수행하여 가상의 데이터를 생성합니다.
SMOTE를 이용하여 아래 초록색 데이터가 생성된 데이터입니다.
2.3 Borderline SMOTE
Borderline(경계) 부분에 대해서만 SMOTE 방식을 사용하는 방법입니다.
해당 데이터가 Borderline 인지 아닌지를 찾는 방법은 아래와 같습니다.
- 임의의 소수 범주의 데이터 한 개에 대해서 주변의 K개 데이터를 탐색합니다.
- 1번에서 탐색한 K개 데이터 중, 다수 범주의 데이터의 수를 확인합니다.
- 만약 2번에서 확인한 다수 범주 데이터의 수가 K와 같다면, 소수 범주의 데이터를 Noise 관측치라고 합니다. 그렇지 않고 만약 다수 범주 데이터 수가 k/2~k에 속할 경우 소수 범주의 데이터를 Danger 관측치, 다수 범주 데이터의 수가 0~K/2에 속할 경우 소수 범주의 데이터를 Safe 관측치라고 합니다.
- 3번의 데이터 종류 중, Danger 관측치가 Borderline이 되고, 이 관측치에 대해서만 SMOTE를 적용하여 Over Sampling을 진행합니다.
아래 그림에서, 검은색이 Danger 관측치, 초록색이 생성된 가상 데이터입니다.
2.4 ADASYN
이 방법은 Borderline SMOTE와 비슷하지만 샘플링 개수를 데이터 위치에 따라 다르게 설정한다는 점에서 차이가 있습니다. 아래와 같이 동작합니다.
- 모든 소수 범주 데이터에 대해 주변의 K개 데이터를 탐색합니다.
- 위에서 탐색한 K개 데이터 중, 다수 범주 데이터의 비율을 계산합니다.
- 계산된 각 비율들을 비율의 총합으로 나누어서 스케일링을 진행합니다.
- 그 후, (다수 범주 데이터 수 - 소수 범주데이터 수)를 스케일링이 진행된 3번 비율에 곱해주고, 반올림된 정수의 값만큼 각 소수 범주 데이터 주변에 SMOTE 방식으로 가상 데이터를 생성합니다.
이 방법은 소수 범주 데이터 주변의 다수 범주 데이터의 수에 따라 유동적으로 생성이 가능하다는 장점이 있습니다.
코드 예시
from imblearn.under_sampling import RandomUnderSampler, TomekLinks, CondensedNearestNeighbour, OneSidedSelection
from imblearn.over_sampling import RandomOverSampler, ADASYN, SMOTE
X_samp, y_samp = RandomUnderSampler().fit_resample(X,y)
X_samp, y_samp = TomekLinks().fit_resample(X,y)
X_samp, y_samp = CondensedNearestNeighbour().fit_resample(X,y)
X_samp, y_samp = OneSidedSelection().fit_resample(X,y)
X_samp, y_samp = RandomOverSampler().fit_resample(X,y)
X_samp, y_samp = ADASYN().fit_resample(X,y)
X_samp, y_samp = SMOTE().fit_resample(X,y)
참고
불균형 데이터 처리, 언더 샘플링, 오버 샘플링 (tistory.com)
'Data Science > Machine Learning' 카테고리의 다른 글
Feature Selection (0) | 2023.09.20 |
---|