본문으로 바로가기

Sampling unbalanced data

category Data/Data preprocessing 2021. 2. 23. 17:07

Unbalance Data

1) 개요

    - 클래스 별 관측치의 수가 현저하게 차이나는 데이터

    - 정상 (다수), 이상 (소수)에서 이상(소수)를 정확히 분류하는 것이 중요하다. (ex 불량품, 카드사기)

 

2) 해결방안

    - 데이터를 조정 : under sampling, over sampling

    - 모델을 조정 : 비용기반학습 (cost sensitive learning), 단일 클래스 분류기법 (novelty detection)


Under sampling

1) 개요

    - 다수 범주를 줄여서 소수 범주와 비슷하게 맞춘다.

 

2) 장점

    - 다수 범주 관측치 제거로 계산 시간 감소

    - 클래스 오버랩 감소 가능

 

3) 단점

    - 데이터 제거로 인한 정보 손실 발생 가능성 증가

 

4) Random undersampling

    - 다수 범주에서 무작위로 샘플링

    - 무작위로 샘플링하기 때문에 결과가 항상 다르다.

from imblearn.under_sampling import RandomUnderSampler

rus = RandomUnderSampler(random_state = 123)
X_res, y_res = rus.fit_sample(X, y)

 

5) Tomek links

    - 아래의 수식에서 관측치 Xk가 없는 경우

$$x_{i} \in + \;, x_{j} \in -$$

$$d(x_{i}, x_{k}) < d(x_{i}, x_{j})\;or\;d(x_{j}, x_{k}) < d(x_{i}, x_{j})$$

    - 간단히 말해 두 샘플 사이에 기타 관측치가 없을 경우 이를 Tomek links라 한다.

 

    - 과정

        (1) 두 범주 사이를 탐지하고 정리를 통해 부정확한 분류경계선 방지

        (2) Tomek link 형성 후, 다수 범주에 속한 관측치 제거

from imblearn.under_sampling import TomekLinks

tl = TomekLinks(random_state = 42)
X_res, y_res = tl.fit_sample(X, y)

 

6) CNN (condensed nearest neighbor)

    - 과정

        (1) 소수 범주 전체와 다수 범주에서 무작위로 하나 선택하여 서브데이터 구성

        (2) I-NN(k-NN) 알고리즘으로 원데이터 분류 k는 1만 가능

             -> 정상 샘플들이 과하게 소수 범주에 포함될 수 있다.

        (3) 정상 분류된 다수 범주 관측치 제거

from imblearn.under_sampling import CondensedNearestNeighbour

undersample = CondensedNearestNeighbour(n_neighbors = 1)
X, y = undersample.fit_sample(X, y)

 

7) OSS (one-sided selection)

    - Tomek links + CNN

from imblearn.under_sampling import OneSidedSelection

undersample = OneSidedSelection(n_neighbors = 1, n_seeds_S = 1)
X, y = undersample.fit_sample(X, y)

 


over sampling

1) 개요

    - 소수 범주 관측치를 증폭시켜 다수 범주의 관측치와 비슷하게 만든다.

 

2) 장점

    - 정보 손실이 없음

    - undersampling에 비해 높은 정확도

 

3) 단점

    - 과적합 가능성이 있다.

    - 계산시간 증가

    - noise 또는 outlier에 민감

 

3) Resampling

    - 중복을 허용한 방식으로 소수 클래스의 샘플을 늘린다.

from sklearn.utils import resample

X_upsampled, y_upsampled = resample(X_imb[y_imb == 1], y_imb[y_imb == 1], replace = True,
                                    n_samples = X_imb[y_imb==0].shape[0], random_state = 123)

 

4) SMOTE (synthetic minority oversampling technique)

    - over sampling의 단점을 보완하고자 나온 방법

    - 소수 범주에서 가상의 데이터를 생성하는 방법

 

    - 과정

출처 : https://www.researchgate.net/figure/The-basic-principle-of-the-synthetic-minority-oversample-technique-SMOTE-algorithm_fig2_332279195

        (1) k-NN 방식으로 주변의 관측치를 k개 선택 (k가 1일 경우 일렬로 늘어설 수 있어 사용 x)

        (2) 랜덤하게 하나의 관측치 선택

        (3) 선택된 두 관측치에 대해 다음 식으로 가상의 관측치 생성

            - u : uniform(distribution) (0, 1) 사이의 랜덤한 값

            - X : selected sample

            - X(nn) : selected sample by k-NN method

$$Synthetic = X + u \dot (X(nn) - X)$$

        (4) 두 점 간의 간격 중간에 sample을 생성한다.

        (5) 소수 범주 내 모든 관측치에 반복하고 가상관측치 생성

from imblearn.over_sampling import SMOTE

sm = SMOTE(random_state=42)
X_res, y_res = sm.fit_sample(X, y)

 

5) Borderline-SMOTE

    - borderline 부분에만 샘플링한다. 

    - 소수 클래스 x 샘플에 대해 k개 주변을 탐색하고 k 개 중 다수 클래스의 수를 확인한다.

    - Danger 관측치에 대해서만 SMOTE 적용


n = k : Noise 관측치
n <= k/2 : safe 관측치
k/2 <= n <= k : Danger 관측치
from imblearn.over_sampling import SMOTE

sm = SMOTE(random_state=42, kind = 'borderline1')
X_res, y_res = sm.fit_sample(X, y)

 

6) ADASYN (adpative synthetic sampling approach)

    - 위치에 따라 다르게 SMOTE 적용

    - 사용 공식

        - 각 소수 클래스 주변에 얼만큼 많은 다수 클래스 관측치가 있는지 정량화 한 지표

        - triangle i : 소수 클래스 xi의 주변 k 개중 다수 클래스의 관측치 개수

    - m : 소수 클래스 내 관측치 총 개수

$$r_{i} = \triangle_{i}/K\;\;\; i= 1, ..., m$$

 

    - 과정

        (1) 모든 소수 클래스에 대해 주변의 k개 만큼 탐색하고 그 중 다수 클래스 관측치의 비율 계산 (ri)

        (2) 계산한 ri를 표준화

        (3) 표준화된 ri를 생성하고자 하는 개수(G = 다수클래스 개수 - 소수 클래스 개수) 만큼 곱한다.

            - ri의 정도에 따라 생성되는 샘플의 수가 다르다.

from imblearn.over_sampling import ADASYN

ada = ADASYN(random_state=42)
X_res, y_res = ada.fit_sample(X, y)

 

borderline SMOTE vs. ADASYN

borderline SMOTE : 경계선에 집중
ADASYN : 보더라인 뿐만아니라 다수 클래스 쪽에 있는 소수 클래스에 집중

 

7) GAN (Generative Adversarial Nets)을 통한 oversampling


참고

머신러닝 교과서 (길벗)

sklearn package

github.com/scikit-learn-contrib/imbalanced-learn#id25

machinelearningmastery.com/undersampling-algorithms-for-imbalanced-classification/

고려대 김성범 교수님 유튜브 www.youtube.com/channel/UCueLU1pCvFlM8Y8sth7a6RQ