Cross Validation

2024. 2. 2. 17:51ML

Cross Validation (교차검증)

주어진 데이터셋에 학습된 알고리즘이 얼마나 잘 일반화되어있는지 평가하기 위한 방법 

일반적으로 train / test set으로 나눠 모델을 검증 (Holdout method)

 

-> 고정된 test set을 통해 모델의 성능을 검증하고 수정하는 과정을 반복하면 결국 test set에만 잘 동작하는 모델이 됨

 

즉, test set에 과적합하게 되므로 다른 데이터를 가져와 수행하면 결과가 나쁠 수 있음

 

>> 해결책 : Cross Validation  = train set을 train set + validation set으로 분리한 후 validation set을 사용해 검증하는 방법

 

▶ Validation set은 학습에 영향을 미치는가?

학습 모델은 가중치를 업데이트 하면서 학습한다.

validation set 은 한 epoch을 돈 뒤 학습이 잘 되었는지 확인하는 역할로, 가중치 업데이트에는 영향을 미치지 않음

 

  train set validation set test set
학습 과정에  참조할 수 있는가 O O X
모델의 가중치 설정에 이용되는가 O X X
모델의 성능 평가에 이용되는가 X O O

 

cross validation를 하는 이유 (필요성)

과적합을 피하서 파라미터를 튜닝하고 일반적인 모델을 만들고 더 신뢰성있는 모델 평가를 진행하기 위함

 

장점

모든 데이터셋을 훈련에 사용할 수 있음

  • 정확도를 향상시킬 수 있음
  • 데이터 부족으로 인한 과적합을 방지할 수 있음

모든 데이터셋을 평가에 활용할 수 있음

  • 평가에 사용되는 데이터 편중을 막을 수 있음
  • 평가 결과에 따라 좀 더 일반화된 모델을 만들 수 있음

 

단점

literation 횟수가 많아 모델 훈련/ 평가 시간이 오래 걸림

 

cross_val_score()

Cross Validation을 사용하는 가장 간단한 방법

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html#sklearn.model_selection.cross_val_score

 

parameter

  • estimator : 모델을 나타내는 객체, classifier 종류면 내부적으로 stratified k fold로 진행됨
  • X : 특징을 나타내는 데이터셋
  • y : 레이블을 나타내는 데이터셋
  • scoring : 예측 성능 평가 지표 , 
  • cv : fold의 수 결정, 교차 검증 폴드 

 

 

K - Flod Cross Validation

 

https://scikit-learn.org/stable/modules/cross_validation.html

 

가장 일반적으로 사용되는 교차검증 방법

보통 회귀모델에 사용되며 데이터가 독립적이고 동일한 분포를 가진 경우 사용

 

1. 전체 데이터셋을 train set과 test set으로 나눈다.
2. train set을 train set + validation set으로 사용하기 위해 K개의 폴드로 나눈다.
3. 첫번째 폴드를 validatio set으로 사용하고 나머지를 train set으로 사용한다.
4. 모델을 학습한 뒤 첫번째 폴드인 validation set으로 평가한다.
5. 차례대로 다음 폴드를 validation set으로 사용해 반복한다.
6. 총 K개의 성능 결과가 나오며, K개의 평균을 학습 모델의 성능이라 한다.

 

 

문제점 : 데이터 편향이 존재하는 경우 제대로된 학습,검증이 이뤄지지 않음

-> shuffle = True로 설정해 데이터셋을 섞어줌 or Stratified K - Fold Cross Validation 사용

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.KFold.html#sklearn.model_selection.KFold

 

parameter

  • n_splits : number of folds
  • shuffle : shuffle the data, default = False
  • random_state : when shffle is True, affects the ording of the indices

 

Repeated K - Fold

K -Fold를 n회 반복

 

Leave One Out (LOO)

 

https://velog.io/@kkamz/Leave-p-Out-Cross-Validation-Leave-One-Out-Cross-Validation-%EC%9D%B4%EB%9E%80

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.LeaveOneOut.html#sklearn.model_selection.LeaveOneOut

 

validation set을 한개로 하고 나머지를 train set으로 해서 하나씩 모두 검증하는 방법

n개의 데이터에서 1개를 test set으로 정하고 나머지 n-1개의 데이터로 모델링

-> 데이터 수 n이 크다면 n번의 모델링을 진행해 시간이 오래 걸림

 

Leave P Out (LPO)

 

https://velog.io/@kkamz/Leave-p-Out-Cross-Validation-Leave-One-Out-Cross-Validation-%EC%9D%B4%EB%9E%80

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.LeavePOut.html#sklearn.model_selection.LeavePOut

 

Leave One Out과 비슷, p를 parameter로 넣어줘야

p개의 데이터를 선택해 모델 검증에 사용

nCp : test set을 구성할 수 있는 경우의 수

데이터가 많을수록 오래 걸림 

 

Random permutations cross validation ( Shffle & Split)

 

https://scikit-learn.org/stable/modules/cross_validation.html

 

데이터셋 인덱스를 무작위로 사전에 설정한 비율로 분할

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.ShuffleSplit.html#sklearn.model_selection.ShuffleSplit

 

parameter

  • n_splits : number of folds
  • test _size : 0.0 ~ 1.0 사이 값, test set 비율
  • train_size : 0.0 ~ 1.0 사이 값, train set 비율
  • random_state : affects the ording of the indices

반복횟수와 각 샘플비율을 세밀하게 제어할 수 있어 k-fold cross validation의 좋은 대안

 

Stratified Sampling (계층적 샘플링)

모집단의 데이터 분포 비율을 유지하면서 데이터를 샘플링하는 것

모집단을 여러개의 층으로 구분하여 각 층에서 n개씩 랜덤하게 추출하는 방법

-> 단순한 무작위 샘플링 방식은 편향 발생 가능성 있음

train / test / validation data를 일정한 비율로 나눠 구분할 때 적용 

 

필요한 이유 : 데이터가 편향되어 있을 경우 학습의 일반화가 제대로 진행되지않기 때문

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedShuffleSplit.html#sklearn.model_selection.StratifiedShuffleSplit

 

parameter

  • n_splits : number of folds
  • test _size : 0.0 ~ 1.0 사이 값, test set 비율
  • train_size : 0.0 ~ 1.0 사이 값, train set 비율
  • random_state : affects the ording of the indices

 

Stratified K - Fold Cross Validation (계층별 K겹 교차검증)

 

https://scikit-learn.org/stable/modules/cross_validation.html

 

원본 데이터의 전체 레이블 분포를 학습 및 검증 데이터셋에 반영해줌 - 레이블 분포도가 유사하도록 validation set을 추출

데이터가 편향되어있을 경우 사용 

-> 특정 레이블값이 특이하게 많거나 적어서 값의 분포가 한쪽으로 치우치는 

 

https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.StratifiedKFold.html#sklearn.model_selection.StratifiedKFold

 

parameter

  • n_splits : number of folds
  • shuffle : shuffle the data, default = False
  • random_state : when shffle is True, affects the ording of the indices

 


참고 및 출처 : https://kyhh1229.tistory.com/entry/%EA%B5%90%EC%B0%A8%EA%B2%80%EC%A6%9D-crossvalscore , https://blog.naver.com/PostView.nhn?blogId=winddori2002&logNo=221850530979 , https://scikit-learn.org/stable/modules/cross_validation.html , https://wooono.tistory.com/105 , https://huidea.tistory.com/30

'ML' 카테고리의 다른 글

Bagging  (0) 2024.02.10
Voting  (0) 2024.02.10
Hyper Parameter  (0) 2024.01.28
Tuning The Hyper Parameter - RandomizedSearchCV  (0) 2024.01.28
Tuning The Hyper Parameter - GridSearchCV  (0) 2024.01.28