포스팅 개요
머신러닝(machine learning)과 딥러닝(deep learning)에서 사용되는 앙상블 중 스태킹 앙상블(stacking ensemble) 2번째 포스팅입니다.
지난 포스팅에서는 스태킹 앙상블의 기본적인 방법과 배경 지식을 소개했습니다.
https://lsjsj92.tistory.com/558
하지만, 지난 포스팅에서 소개해드린 스태킹 앙상블은 잘 사용하지 않습니다.
대신, CV 기반의 stacking ensemble을 많이 사용하는데요. 이번 포스팅은 이러한 CV 기반(Kfold, Stratified Kfold)의 스태킹 앙상블을 소개해드리고자 합니다.
참고 출처는 아래와 같습니다.
- https://www.kaggle.com/getting-started/18153
- https://towardsdatascience.com/ensemble-methods-bagging-boosting-and-stacking-c9214a10a205
- https://mlwave.com/kaggle-ensembling-guide/
- https://www.kaggle.com/arthurtok/introduction-to-ensembling-stacking-in-python
그 외 open 되어 있는 캐글 코드를 사용했습니다.
본문
기존 포스팅처럼 stacking을 하게 되면 동일 데이터로 계속 훈련하게 되니 과적합(overfitting) 문제가 발생하게 됩니다.
그래서 실제로 사용하는 stacking 방법은 CV 기반의 stacking 방법입니다.
스태킹 앙상블(stacking ensemble) 이론
CV 기반의 스태킹은 각 모델들이 교차 검증(KFold 등)으로 최종 모델을 위한 학습용 데이터를 생성합니다. 또한, 예측을 위한 테스트용 데이터도 생성하여 이를 기반으로 최종 모델이 학습을 진행하게 됩니다. 순서로 보면 아래와 같습니다.
- 데이터를 Fold로 나눔
- 각 모델 별로 Fold로 나누어진 데이터를 기반으로 훈련을 진행(X_train, y_train) 사용
- 이때 각 Fold마다 뽑아진 훈련 데이터로 모델을 훈련하고 검증 데이터를 활용해 예측 후 값을 저장
- 마찬가지로 각 Fold마다 나온 model을 기반으로 원본 X_test 데이터를 훈련하여 저장 (이것은 추후 Avarage됌)
- 2까지 진행해서 나온 각 모델별 예측 데이터(2-1)를 모두 stacking하여 최종 모델의 훈련 데이터로 사용
- label은 원본 y_train 값으로 진행
- 2-2에서 나온 데이터로 예측을 수행하여 pred 값을 뽑아냄
- 4에서 나온 pred와 y_test 값을 비교해서 최종 모델 평가
이 말로는 도대체 무슨 소리인지 이해가 잘 안될 것입니다. 그림으로 설명드리죠
위 그림은 하나의 모델 기준 3개의 fold로 진행하는 그림입니다.
즉, 모델이 3개이면 3개 모델에 대해서 위 그림이 각각 진행되는 것입니다.
- 각 fold 별로 X_train, y_train을 학습용, 검증용으로 나누고 fold 별 검증 결과 값을 넣어줌
- 각 fold 별로 1번을 진행하면서 동시에 X_test set에 대해서 예측을 수행해서 예측 결과를 저장
- fold가 전부 끝나면 1번의 결과로 하나의 모델의 KFold의 내부 수행 결과(예측 값)가 나오게 됌. 이를 모델별로 모아 new_X_train으로 사용
- 또한, 2의 결과로 나온 X_test set에 대해서 나온 결과를 Average로 한 뒤 합침. 이를 모델별로 모아 new_X_test로 사용
이제, 하나의 모델 기준으로 보는 것이 아니라 다른 machine learning model들까지 함께 보겠습니다.
위 그림이 이제 확대가 되면 아래 그림과 같습니다.
즉, 각 머신러닝 모델별로 KFold를 진행합니다. 그리고 각 Fold 별로 Validation set으로 예측한 결과를 모아놓습니다.(노란색)
또한, Fold 별로 예측을 수행한 원본 X_test set을 averate한 결과를 모아놓습니다.(초록색)
이것을 각 모델별로 모아 놓는 것입니다.
이제 아래 그림과 같이 Fold validation set으로 예측한 결과를 새로운 X_train set으로 한 데 모아줍니다.
그리고 X_test set으로 예측한 결과를 새로운 X_test으로 모아줍니다.
이렇게 모아주는 과정이 stacking 과정입니다. 그래서 stacking ensemble(스태킹 앙상블)이라고 불리우죠!
그리고 이렇게 stacking된 데이터를 가지고 마지막 최종 모델을 이용해 머신러닝 훈련을 진행합니다. 그래서 모델을 만들죠.
최종적으로 원본 X_test로 predict를 수행한 뒤 y_test와 비교해 평가를 진행합니다.
이게 바로 CV 기반의 stacking ensemble입니다.
대략적으로 이해가 되시나요?
그럼 이제 코드로 봐봅시다.
스태킹 앙상블 파이썬 코드로 구현하기 - stacking ensemble with Python
Python으로 CV 기반 스태킹 앙상블을 간단하게 구현해보겠습니다.
python에서 제공해주는 scikit learn, numpy를 이용하면 됩니다. scikit learn에서는 KFold, StratifiedKFold를 이용하시면 됩니다.
먼저 KFold 기반으로 구현해보죠
스태킹 앙상블 코드 설명은 아래와 같습니다.
1. KFold 객체를 생성하고 원하는 n_splits을 설정합니다.
2. KFold를 돌면서 나오는 train, validation 데이터가 나오는데, 이때 validation으로 예측한 결과를 저장할 train_fold_predict를 만들어줍니다.
2-1. 이때 shape는 (X_train.shape[0], 1)인데요. 이는 fold에서 나오는 예측은 한 번 loop에 idx가 지정되어 있기 떄문에 그렇습니다. 그리고 모든 loop를 돌면 X_train의 모든 index가 다 나옵니다.
(만약, 이 개념이 이해가 안가신다면 KFold를 다시 한 번 봐보세요~)
3. fold만큼 X_test를 predict해야 해서 그 값을 저장할 test_predict를 생성합니다.
3-1. 이때 shape는 X_test.shape[0]과 n_folds만큼 생성합니다. X_test를 fold만큼 예측해야 하기 때문이죠.
4. kfold를 돌면서 train과 validation set을 나눠줍니다.
5. X_train과 y_train을 이용해서 머신러닝 모델을 훈련해줍니다.
6. X_validation을 이용해서 예측을 수행합니다. 그리고 그 결과를 train_fold_predict에 넣어줍니다.
7. 원본 X_test 데이터를 이용해서 예측을 수행한 뒤 test_predict에 저장
8. test_predict는 np.mean(axis=1)을 기반으로 평균
9. train_fold_predict, test_predict를 return
자. 이제 위 함수를 사용해서 머신러닝 스태킹 앙상블을 수행하면 됩니다.
저는 머신러닝(machine learning) 모델 중 svm, random forest, logistic regression을 이용해 stacking ensemble을 먼저 수행합니다.
이렇게 svm, random forest, logistic regression 객체와 데이터를 넣어주면 알아서 수행 한 뒤 결과가 return 됩니다.
그럼 이제 저 return 된 kfold의 결과와 x_test의 결과를 stacking 해줘야겠죠?
np.concatenate를 이용해서 axis = 1을 기반으로 stacking 해줍니다. 그러면 기존에 30개였던 feature가 3개(모델 개수)만큼 줄어듭니다.
자! 이제 최종 결과만 남았습니다.
바로 최종 모델을 사용해서 저 new_X_train을 훈련해주면 됩니다.
그리고 new_X_test를 가지고 predict를 해준 뒤 그 결과와 원본 y_test와 비교해주면 됩니다.
이렇게요!
lgbm.fit(new_X_train, y_train)
stack_pred = lgbm.predict(new_X_test)
accuarcy_score(stack_pred, y_test)
이렇게 하면 최종적으로 스태킹 앙상블(stacking ensemble)의 결과가 나오게됩니다!
다음은 StratifiedKFold 기반 stacking ensemble을 Python으로 구현해보죠
함수만 바꾸면 되고 나머지는 똑같습니다.
여기까지가 머신러닝(machine learning)과 딥러닝(deep learning)에서 사용하는 stacking ensemble(스태킹 앙상블)에 대한 설명이었습니다.