Cross validation (k-fold) + data augmentation

Cross validation 방식의 평가와 데이터 증강을 동시에 해야하는 문제에 부딪혔다. 데이터 셋 사이즈가 적고 불균형한, 특수한 경우다. Cross validation 을 통한 다양한 모델의 보다 정확한 검증이 필요한 동시에, 불균형한 데이터를 증강해서 샘플 수의 균형을 맞춰주어야 한다.

Validation, Test 데이터 건들지 말 것 ! 🚫

Validation 과 Test 에 사용될 데이터는 말 그대로 ‘검증’ ,’최종 성능 평가’ 용도이다. 그러니까 절대 증강된 샘플이 섞여서는 안 된다. 공부는 어떤 문제집으로 하든지, 얼마나 많은 문제를 풀어보든지 너의 자유야 ! 하지만 모의고사와 실제 시험은 딱 정해진 평가원의 시험지로 봐야 해 ! 느낌이다 ! 사실 이제 수능 본 지도 너무 오 ~~ 래됐지만 이런 고리타분한 비유밖에는 직관적으로 떠오르지 않는다 😓

그렇다면 how ?!

사실 너무 기본적인 부분이어서 그런지 비슷한 연구들을 읽어봤을 때 해당 방법론은 (~5 fold 방식을 사용해서 증강했다) 이런 식으로 k-fold 와 데이터 증강을 동시에 했다는 식으로만 나와있었다. 하지만 validation, test 데이터는 절대 건들지 않으면서 각 fold에서 train data 만 어떻게 증강할 수 있을지 기본적인 부분에서 나는 이해에 참 많은 어려움을 겪다가 캐글 코드의 도움을 받을 수 있었다 ! (사실 cross-validation,stack exchange 등 여러 커뮤니티도 참고했지만 역시 코드가 딱 나와있는게 이해에 제일 도움이 되었다) 캐글-데이터 증강&k-fold

레츠 기릿 ~!

  1. 데이터를 k-fold 로 나누어준다. K 가 5 라고 하면 for 문은 따라서 총 5번 돈다. (K=1) val = #1 (핑크색) , train = #2,3,4,5 (검은색) (K=2) val = #2 (핑크색) , train = #1,3,4,5 (검은색) … 03240A97-B470-4375-8072-9A8AACD45EB6
    kfold=KFold(n_splits=5,shuffle=True,random_state=42)
    for train,val in kfold.split(X_train_all,y_train_all): 
    
  2. 각 k 번째의 train,val 을 데이터 증강 메소드에 넣어준다. (이 때, 데이터 증강 메소드는 validation 은 건들지 않고, rescaling 정도만 하며 train 데이터는 증강해준다.
    X_train=X_train_all[train] #k-fold 는 인덱스를 return 하므로
    X_val=X_train_all[val]
    y_train=y_train_all[train]
    y_val=y_train_all[val]
    batch_size=16
    train_batch,val_batch=data_aug(X_train,X_val,y_train,y_val,batch_size,batch_size)
    

data augmentation 함수 내부 37A7BA66-4CC7-4BC0-87F5-243E1E331346 보면 train 데이터만 증강된다는 것을 알 수 있다.

  1. 증강된 train 데이터를 가지고 학습하고, 건들지 않은 (rescaling 만 된 채 반환된) validation 데이터를 가지고 평가해준다. 913D1DB3-8213-4C4C-93BD-31F2D7DF36F5 이 떄 오리지널 데이터 X_train_all, y_train_all 은 건들지 않은 채 각 k번째에서 증강한 데이터는 그 때,그 때 train_batch, val_batch 에 따로 할당하기 때문에 validation 데이터를 건들지 않은 제대로 된 평가가 이루어진다

  2. 일반 CV 과정이랑 이후부터는 똑같다. Cross-validation 성능 평가를 통해 최적의 하이퍼파라미터, 모델을 찾는다. 혹은 Cross-validation 으로 모델 성능을 평가할 경우, 해당 k개의 결과를 평균 낸 최종 성능을 구한다.
  3. Cross-validation 을 참고하여 정식으로 train-test split 한 후 평가할 것이라면 , best model 에 k-fold 로나누지 않은 오리지널 training 데이터 + 오리지널 training 데이터를 증강한 데이터를 넣은 후 final 학습을 시키고 오리지널 test 데이터로 final 성능 평가를 한다.