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의 단점을 보완하고자 나온 방법
- 소수 범주에서 가상의 데이터를 생성하는 방법
- 과정
(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
'Data > Data preprocessing' 카테고리의 다른 글
Kernel method (0) | 2021.02.22 |
---|---|
Feature Extraction (PCA, LDA) (0) | 2021.02.21 |
Data Scaling (normalization, standardization) (0) | 2021.02.19 |
Categorical variables encoding / mean, one-hot, label (0) | 2021.01.22 |
Feature selection (변수 선택) (0) | 2021.01.17 |