SMOTE( Synthetic Minority Oversampling Technique) 는 오버샘플링의 일종.
타겟변수의 범주별 비율이 맞지 않을 때? 사용했다.
y값
y.value_counts()
y.value_counts(normalize=True)
normalize=True 를 넣어주면 비율로 확인할 수 있다.
아 팀프로젝트로 파산데이터 분석을 진행했었는데 타겟변수가 파산했는가 에 대한 여부였다.
파산 한 경우 : 1, 파산하지 않은 경우 : 0
거의 96% 이상이 타겟변수 0으로 쏠려 있는 것을 볼 수 있다.
이런 경우에는 0으로 과적합 될 가능성이 있다.
음.. 그러니까 독립변수가 어떠하더라도 대부분의 예측 결과로 0이 나올수도 있다 이 말..!
임의로 8:2의 비율로 오버샘플링 하였다. 굳이 8:2로 한 이유는... 딱히 없다. 그냥그냥그냥~
추가적으로 전체 데이터의 개수를 10000개로 늘리고 싶었기 때문에 1만개 개수에 맞추어 8000개와 2000개로 증가시켰다.
# 낮은 비율 클래스(minority class)를 높은 비율 클래스 데이터 갯수로 맞춰주는 OverSampling
from imblearn.over_sampling import SMOTE
smote = SMOTE(sampling_strategy={0:8000, 1:2000}, random_state=9)
X_resampled, y_resampled = smote.fit_resample(X, y)
X_resampled.shape, y_resampled.shape
# (10000, 95) (10000, 1)
y_resampled.value_counts(normalize=True)
# 0 : 0.8
# 1 : 0.2
y_resampled.value_counts()
# 0 : 8000
# 1 : 2000
SMOTE 파라미터로 sampling_strategy를 넣는데, 보통 이 파라미터에 소수점형태의 수를 입력한다.
이는 소수 클래스의 샘플수를 전체 데이터의 얼만큼 비율로 증가 시킬건지를 정할 수 있다.
위에서 봤던 데이터를 토대로 설명하면 현저히 적은 1의 비율을 전체 데이터의 몇프로까지 늘리고 싶은지를 지정할 수 있는것이다.
나도 처음에는 0.4라고 입력했다가 전체 데이터의 개수까지 맞추면 좋을 것 같다고 생각하여 선택한 방법이
sampling_strategy 파라미터의 값을 딕셔너리 형태로 주는 것이었다.
원하는 클래스에 대해 각각 개수를 지정해주면 그 수에 맞추어 오버샘플링 된다.
아 혹시 imbalanced-learn 라이브러리가 설치되어있지 않은 로컬환경이라면
prompt 에 가서 imblearn 혹은 imbalanced-learn 을 pip install 해야한다.
pip install imblearn
'Machine Learning' 카테고리의 다른 글
[ML] 앙상블 기법 정리 (0) | 2024.10.30 |
---|---|
DevOps란? (1) | 2024.02.24 |
[Machine Learning] Hyper Parameter 하이퍼 파라미터 (0) | 2023.07.23 |
[Machine Learning] Grid Search 그리드 서치 (0) | 2023.07.22 |
ML - day1 (0) | 2023.07.18 |