오버샘플링을 통해 불균형 데이터를 처리, 앙상블 모델로 이진 분류 (오버피팅 문제 처리)

2023. 6. 20. 18:40DATA PROGRAMMING

이번 글에서는 과거에 다뤘던 데이터를 조금 더 발전된 방식으로 이진 분류를 해보고자 한다. 문제점에 대해서 짚어 보고 그 부분을 커버하는 모델을 만드는 과정을 설명한 생각이다.

 

 

 

[파이썬] 클래스가 불균형한 데이터 머신러닝 분류 모델 실습

오늘은 학교 실습 시간에 주어진 데이터를 분류하는 모형을 만들어 보려고 한다. 데이터에 대한 정보를 보고 분류 모델을 설정할 전략을 짜고 실제로 코드를 작성하여 실습하고 수정해 나가는

dd.honeyreviewer.com

 

윗글은 단순 오버샘플링을 통해 클래스 불균형을 해결한 이후에 각종 분류모델을 앙상블 하여 높은 f1-score를 얻은 과정을 담은 글이다.

위 모델의 문제점은 test 데이터를 통해서는 좋은 성능을 보였지만, 실제 데이터에서는 그 성능이 떨어지는 모습을 보인다는 것이었다. 이를 오버피팅 문제로 판단하였고, 몇 가지 조치를 통해 이 문제를 해결해 보려고 한다.

 

 

오버피팅 문제

 

1. 오버샘플링 과정

오버샘플링 과정에서 단순히 복제된 관측치를 트레이닝 데이터에 추가하는 방법을 선택하였기에 오버피팅이 생겼을 수 있다. 이에 ADASYN 오버샘플링 방법을 활용하려고 한다.

 

 

2. 앙상블 모델의 복잡도

앙상블 모델에 포함된 개별 모델의 복잡도가 높아 오버피팅이 발생할 수 있다. 이에 각 파라미터를 수정하여 오버피팅의 가능성을 낮춘다.

 

 

해결 과정

from imblearn.over_sampling import RandomOverSampler, SMOTE,ADASYN

분류모델을 위한 기본적인 라이브러리들을 불러와 주고(이전 글 참조) ADASYN을 import 해준다.

 

train = pd.read_csv('Train.csv')
test = pd.read_csv('Test.csv')

train = train.drop('Index',axis=1)
test = test.drop('Index',axis=1)

X = train.drop('target', axis=1)  # 'target' 열을 제외한 나머지 열들이 특징 데이터
y = train['target'] 

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) # 학습데이터와 평가데이터의 비율을 8:2 로 분할| 
print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)

strategy = {'negative':4564, 'positive':4564}
X_resampled, y_resampled = ADASYN(sampling_strategy=strategy).fit_resample(X, y)
X = X_resampled
y = y_resampled
Counter(y_resampled)

 

오버 샘플링을 하고 난 이후에 데이터가 늘어난 것을 확인할 수 있다.

 

X_train, X_test, Y_train, Y_test = train_test_split(X, y, test_size = 0.2, random_state = 42) # 학습데이터와 평가데이터의 비율을 8:2 로 분할| 

lr_clf_l1 = LogisticRegression(penalty='l1', solver='saga')
knn_clf = KNeighborsClassifier(n_neighbors=12)
rf_cf = RandomForestClassifier(n_estimators=300, max_depth=4,random_state=0 )
ada_clf = AdaBoostClassifier(n_estimators=130, random_state=10, learning_rate=0.15)
m1=SVC(kernel="rbf",C=0.1, gamma=0.01, probability=True)

vo_clf = VotingClassifier(estimators=[('LR',lr_clf_l1),('ADA', ada_clf),('RF', rf_cf),('SVC', m1),('KNN', knn_clf)], voting='soft')

각종 모델의 파라미터들을 조정해 주고, 그 모델들을 합친 앙상블 모델을 만든다.

 

print('Voting Classifier f1_score(Neg) : {0:.4f}'.format(f1_score(Y_test,Y_pred,pos_label='negative')))


print('Voting Classifier f1_score(Pos) : {0:.4f}'.format(f1_score(Y_test,Y_pred,pos_label='positive')))

print("Classificcation Report: \n{}".format(classification_report(Y_test, Y_pred)))

 

좋은 f1-score를 얻을 수 있었고, 지난번 모델과 비교해 실제 데이터에도 더 좋은 성능을 보이는 것을 확인했다.

이번 프로젝트를 통해 모델의 성능을 높이는 데에만 집중할 것이 아니라 일정 수준 이상의 성능을 확보하였다면 오버피팅을 방지하기 위한 방향성을 잡는 것이 중요하다고 느꼈다.