Machine Learning

[Machine Learning] imblearn 라이브러리 oversampling

heedy 2022. 11. 18. 14:10
728x90

imblearn라이브러리의 over_sampling 비교

- Import

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.datasets import make_classification
from imblearn.over_sampling import *

- Data 생성

X, y = make_classification(n_samples=5000, n_features=2, n_informative=2,
                           n_redundant=0, n_repeated=0, n_classes=3,
                           n_clusters_per_class=1,
                           weights=[0.01, 0.05, 0.94],
                           class_sep=0.8, random_state=0)
print(X.shape , y.shape)
(5000, 2) (5000,)

Data Frame으로 변경

df = pd.DataFrame(X, columns = ['f1', 'f2'])
df['target'] = y
print(df.target.value_counts())
df.head()
>>>
2    4674
1     262
0      64

      f1			f2	target
0	0.662420	-0.763477	2
1	-0.201381	-2.469794	2
2	1.208045	-0.332895	2
3	1.375456	0.974206	2
4	0.215885	-1.556261	2

생성한 데이터의 분포

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df, x = 'f1', y = 'f2', hue = 'target')


- RandomOverSampler

랜덤으로 마이너한 클래스 데이터를 생성
sampling strategy arg를 통해 어떤 클래스를 생성할지 선택 가능

  • 'minority': resample only the minority class(오직 마이너 클래스 생성)
  • 'not minority': resample all classes but the minority class(마이너 클래스를 제외한 클래스 모두 생성)
  • 'not majority': resample all classes but the majority class(메이저 클래스를 제외한 클래스 모두 생성)
  • 'all': resample all classes(모든 클래스 생성)
  • 'auto': equivalent to 'not majority'(적절한 클래스 자동으로 선정)
ros = RandomOverSampler(random_state = 10)
X_res, y_res = ros.fit_resample(X, y)
df1 = pd.DataFrame(X_res, columns = ['res1', 'res2'])
df1['y_res'] = y_res
print(df1.y_res.value_counts())

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df1, x = 'res1', y = 'res2', hue = 'y_res')


- SMOTE

낮은 비율로 존재하는 클래스의 데이터를 K-NN알고리즘(최근접 이웃)을 활용하여 새롭게 생성함.

SMOTE 작동방식

smt = SMOTE(random_state = 10)
X_smt, y_smt = smt.fit_resample(X, y)
df2 = pd.DataFrame(X_smt, columns = ['smt1', 'smt2'])
df2['y_smt'] = y_smt
print(df2.y_smt.value_counts())

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df2, x = 'smt1', y = 'smt2', hue = 'y_smt')
0    4674
1    4674
2    4674


- SMOTEN

categorical feature에 사용가능한 SMOTE

smtn = SMOTEN(random_state = 10)
X_smtn, y_smtn = smtn.fit_resample(X, y)
df3 = pd.DataFrame(X_smtn, columns = ['smtn1', 'smtn2'])
df3['y_smtn'] = y_smtn
print(df3.y_smtn.value_counts())

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df3, x = 'smtn1', y = 'smtn2', hue = 'y_smtn')
0    4674
1    4674
2    4674


- ADASYN

SMOTE와 유사한 방법이지만 sampling할 클래스의 분포에 따라 다른 수의 샘플을 생성

adasyn = ADASYN(random_state = 10)
X_adasyn, y_adasyn = adasyn.fit_resample(X, y)
df4 = pd.DataFrame(X_adasyn, columns = ['adasyn1', 'adasyn2'])
df4['y_adasyn'] = y_adasyn
print(df4.y_adasyn.value_counts())

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df4, x = 'adasyn1', y = 'adasyn2', hue = 'y_adasyn')
2    4674
0    4673
1    4662


- BorderlineSMOTE

SMOTE에서 변형된 알고리즘으로, borderline 부근에 있는 분류하기 어려운 샘플들을 생성함.

blsmt = BorderlineSMOTE(random_state = 10)
X_blsmt, y_blsmt = blsmt.fit_resample(X, y)
df5 = pd.DataFrame(X_blsmt, columns = ['blsmt1', 'blsmt2'])
df5['y_blsmt'] = y_blsmt
print(df5.y_blsmt.value_counts())

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df5, x = 'blsmt1', y = 'blsmt2', hue = 'y_blsmt')
0    4674
1    4674
2    4674


- SVMSMOTE

SVM 알고리즘을 사용하여 샘플을 생성할 때 사용할 샘플을 감지하는 SMOTE의 변형 알고리즘

svmsmt = SVMSMOTE(random_state = 10)
X_svmsmt, y_svmsmt = svmsmt.fit_resample(X, y)
df6 = pd.DataFrame(X_svmsmt, columns = ['svmsmt1', 'svmsmt2'])
df6['y_svmsmt'] = y_svmsmt
print(df6.y_svmsmt.value_counts())

plt.figure(figsize = (12, 8))
sns.scatterplot(data = df6, x = 'svmsmt1', y = 'svmsmt2', hue = 'y_svmsmt')
0    4674
1    4674
2    4674

 

- notebook ipynb file: https://github.com/heejvely/python-machine_learning-practice/blob/main/oversampling.ipynb

 

GitHub - heejvely/python-machine_learning-practice: practice for using python machine learning model

practice for using python machine learning model. Contribute to heejvely/python-machine_learning-practice development by creating an account on GitHub.

github.com

 

728x90