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
'Machine Learning' 카테고리의 다른 글
[Machine Learning] SMOTETomek (0) | 2022.11.23 |
---|---|
[Machine Learning] imblearn 라이브러리 undersampling (0) | 2022.11.21 |
[Machine Learning]PCA로 cluster 그래프 그리기 (0) | 2022.11.11 |
[Machin Learning]변수 중요도를 기준으로 Kfold 교차검증 진행하기 (0) | 2022.11.01 |
[Machine Learning]변수 중요도 출력(feature importance) (0) | 2022.11.01 |