공부일기/Machine-Learning

교차 검증(Cross Validation)

pipiiiiii 2024. 7. 25. 22:13

교차 검증

데이터를 여러 부분으로 나누고, 각 부분을 훈련과 테스트 용도로 번갈아 사용하여 모델을 평가하는 방법이다. 이를 통해 모델의 일반화 성능을 더 정확하게 측정할 수 있다. 조금 더 쉽게 설명하자면 학습 데이터를 학습 데이터와 검증 데이터로 나눠서 학습 데이터를 가지고 모델의 성능을 1차로 평가하는 검증 데이터를 만든다. 그 다음 테스트 데이터는 최종적으로 모델의 성능을 확인할 때 사용한다.  

 

 

교차 검증 특징

  • 훈련 데이터가 많지 않을 때 사용한다. 
  • 훈련 데이터로 학습하고 테스트 데이터로 평가하는 경우, 해당 테스트 데이터에만 과적합되는 모델이 생성되어 일반화 성능이 떨어진다. 
  • 훈련 데이터에서 검증 데이터를 떼어내어 모형을 검증하는 과정을 여러번 반복한다. 

 

 

교차 검증 장단점

장점

  • 모든 데이터 셋을 훈련에 활용 가능하다. 또한, 모든 데이터셋을 평가에 활용할 수 있다고도 볼 수 있다. 
  • 정확도가 향상된다.
  • 특정 데이터 셋에 대한 과적합을 방지한다.
  • 데이터셋 규모가 적어도 과소적합을 방지한다.  

단점

  • 모델 훈련 및 평가 소요 시간이 증가한다. 

 

 

교차 검증 종류

K-폴드 교차 검증

  • 대표적인 교차 검증 방법이다. 
  • K-폴드 교차 검증은 두 종류가 있다.
    • K-Fold
      • 순서대로 나열된 레이블에 적용한 교차 검증이다 
      • K개의 데이터 폴드 세트를 만들어서 K번만큼 각 폴드 세트에 학습과 검증 평가를 반복적으로 수행하는 방법이다. 예를 들어 K = 5로 설정하여 5 폴드 교차 검증을 수행하는 경우 5개의 폴드된 데이터 세트를 학습과 검증을 위한 데이터 세트로 변경하면서 5번의 평가를 수행한 뒤, 이 5개의 평가를 평균한 결과를 가지고 예측 성능을 평가한다. 
    • Stratified K-Fold
      • 불균형한 분포도를 가진 레이블 데이터 집합을 위한 K- Fold 방식으로, 클래스의 분포 비율에 맞게 Fold를 만드는 교차 검증이다. 
      • 불균형한 분포도를 가진 레이블 데이터 집합이란, 특정 레이블 값이 특이하게 많거나 매우 적어서 값의 분포가 한쪽으로 치우치는 경우를 말한다. 
      • K-Fold가 레이블 데이터 집합이 원본데이터 집합의 레이블 분포를 학습 및 테스트 세트에서 제대로 분배하지 못하는 경우의 문제를 해결해준다. 
      • 원본 데이터의 레이블 분포를 먼저 고려한 뒤 이 분포와 동일하게 학습과 검증 데이터 세트를 분배하여 학습 데이터와 검증 데이터 세트가 가지는 레이블 분포도가 유사하도록 검증 데이터를 추출한다.    
  • 교차 검증 사용하는 방법 
    1. 폴드 세트를 설정한다.
    2. for문에서 반복적으로 학습/검증 데이터 추출 및 학습과 예측을 수행한다. 
    3. 폴드 세트별로 예측 성능을 평균하여 최종 성능을 평가한다.
  • 교차 검증은 cross_val_score()함수로 폴드 세트 추출, 학습/예측, 평가를 한 번에 수행할 수 있다. 

 

LOOCV (Leave-one-out Cross-validation)

  • 폴드 하나에 샘플 하나만 들어있는 K-겹 교차 검증이다. 
  • 교차 검증을 극단적으로 사용하여, 사례 개수만큼 많은 버킷으로 교차 검증을 한다.  
  • N(샘플 수)번의 모델을 만들고, 각 모델을 만들 때 전체 훈련 데이터 중 하나의 데이터만 검증 데이터로 두고, 나머지는 모두 훈련 데이터로 사용한다. 그 과정을 샘플 수만큼 진행하고, 정확도를 평균 낸다. 
  • 데이터 셋이 클 때는 시간이 매우 오래 걸리지만, 작은 데이터 셋에서는 더 좋은 결과를 만들어낸다.
  • 결정론적인 평가 방법으로, 결정론적인 특성은 학습 알고리즘의 정확성을 비교하고 테스트할 때 유용하지만 비용이 많이 든다.  

 

임의 분할 교차 검증 (Shuffle Split)

  • train_size만큼의 포인트로 훈련 세트를 만들고, test_size만큼의 포인트로 테스트 세트를 만들도록 분할한다. 이 때 분할은 n_splits 횟수만큼 반복한다.
  • test_size만큼의 포인트로 테스트 세트를 만들 때 train_size와 중첩되지 않게 만들어야 한다.  
  • 특징
    • 반복 횟수를 훈련 세트나 테스트 세트의 크기와 독립적으로 조절해야할 때 유용하다. 
    • train_size와 test_size의 합을 전체와 다르게 함으로써 전체 데이터의 일부만 사용이 가능하다. 
    • 대규모 데이터를 작업할 때 부분 샘플링 할 수 있다.  

 

그룹별 교차 검증 (Group K-Fold)

  • 데이터 안에 매우 연관된 그룹이 있을 때 그룹별 교차 검증을 사용한다. 
  • 클래스는다르지만, 매우 연관된 데이터에 대해서 그룹을 먼저 만들고 같은 그룹의 데이터가 훈련과 테스트 데이터 모두에 들어가게 하지 않는 것이 중요하다. 

 

반복 교차 검증 (Repeated Stratified K-Fold)

  • cross_val_score()함수의 cv 매개변수에 전달하여 교차 검증을 반복할 수 있다.
  • 반복할 때마다 서로 다른 분할이 생성된다는 것이 특징이다.   

 

 

교차 검증 코드 공부

https://github.com/DIB-PP/Machine-Learning

 

GitHub - DIB-PP/Machine-Learning

Contribute to DIB-PP/Machine-Learning development by creating an account on GitHub.

github.com

 

 

 

 

 

참고 자료