본문 바로가기

Machine Learning/검증(Validation)

Validation - OOF Ensemble (Out-of-Fold)

반응형

https://steadiness-193.tistory.com/286

 

Validation - KFold

www.kaggle.com/c/titanic/data Titanic: Machine Learning from Disaster Start here! Predict survival on the Titanic and get familiar with ML basics www.kaggle.com 캐글의 타이타닉으로 연습한다. 전처리..

steadiness-193.tistory.com

위 포스팅에서 만든 데이터셋과 함수를 이용한다.

 

 

 

필요 라이브러리 호출 및 데이터셋 설정

 

 

 

임시로 정답지가 있는 데이터 셋을 train_test_split으로 나눠놓자

 

 

 

 

 

 

Cross validation / OOF validation

 

 

 

간단히 그리면 위 도식과 같다.

 

 

 

 

oof_pred

 

 

 

사실 이번 포스팅의 핵심은 여기 있다.

 

oof_pred는 총 5번 더해진 값이다.

 

 

다시 말하면

 

각 fold별 X_train과 y_train으로 학습한 모델이, 실제 unseen data (X_test)를 predict_proba한 것이다.

(지금은 unseen data를 tmp_x_test라고 가정한다.)

 

 

이는 각 fold 별로 학습을 한 뒤 예측한 값들을 앙상블 하므로 모델 검증을 동시에 진행할 수 있고,

 

과적합을 방지하는 장점이 있다.

 

 

단순히 cv 값을 구하고 그 모델로 한번 예측하는 것보다 성능이 좋을 수 있다.

 

OOF 앙상블은 KFold 교차 검증에서 생성되는 각 Fold에 대한 예측 값을 앙상블하는 기법으로,

모델 검증과 함께 앙상블을 진행할 수 있음

 

 

 

predict_proba를 하면 각 클래스를 예측할 확률을 구하기 때문에

 

총 5겹이므로 각 행별 합은 5가 나온다.

(* regression일땐 5로 나눠줘야 한다.)

 

np.argmax와 axis=1을 이용해 각 행별 큰 값의 인덱스를 뽑아낸다.

 

이를 미리 정답지로 나눠놨던 tmp_y_test와 비교해서 scoring 하는 것이다.

 

 

 

 

하지만 실제로는 train_test_split을 하지 않고 바로 data를 train과 valid로 나눠서 진행한다.

 

 

즉, 이렇게 Cross Validation Score만 구하고 그 값이 잘 나온다면 oof_pred를 제출용으로 이용하면 된다.

 

 

 

 

 

함수 정의

 

 

 

함수를 정의한 뒤 여러 모델을 시험해보고

 

각 모델별로 CV(cross validation) 값이 제일 높은 oof_pred를 구해보자

 

 

 

 

결과에 의하면 CV값은 LGBMClassifier를 이용했을 때 제일 높게 나왔다.

 

 

 

다시 lgb를 model 자리에 넣고 리턴 되는 oof_pred array를 받아내면 된다.

 

이를 sample_submission의 label 값으로 대체해서 제출하는 것이다.

반응형