본문 바로가기

배우기/복습노트[Python과 분석]

[복습] Python | 분석 | 교차검증(CV, Cross Validation)

728x90
반응형

교차검증 개념: 모델의 일반화 오차에 대한 신뢰할 만한 추정치를 구하기 위해 훈련, 평가 데이터를 기반으로 하는 검증 기법

 

교차 검증 목적: 평가 점수의 일반화( = 오차의 일반화 규칙), 평가 점수의 신뢰도 향상

 

 

분석 모형에 따른 평가 지표

 

교차 검증 종류

  - 홀드 아웃 교차 검증

  - 다중 교차 검증

    * 랜덤 서브 샘플링

    * K-Fold Cross Validation

    * Leave-One_Out Cross Validation(LOOCV)

    * Leave-p-Out Cross Validation(LpOCV)

    * RLT(Repeated Learning-Testing)

    * 부트스트랩

 

다중 교차 검증 방식의 장점은 데이터 셋이 늘어난 다는 것이지만, 시간이 오래 걸린다는 단점이 있다.

 

 

홀드 아웃 교차 검증

  - 전체 데이터 셋을 비복원 추출 방법을 이용하여 랜덤하게 학습 데이터와 평가 데이터로 나눔

  - 일반적으로 5:5, 7:3, 8:2 등의 비율로나눔

  - 계산량이 많지 않아 모형을 쉽게 평가할 수 있으나 전체 데이터에서 평가 데이터 만큼은 학습에 사용할 수 없으므로 데이터 손실 발생

  - 데이터를 어떻게 나누느냐에 따라 결과가 많이 달라질 수 있음

  - 훈련, 검증, 평가 셋으로 나누기도 함

 

우리가 이제까지 진행한 방식은 홀드아웃 교차 검증방식이다.

중요한 키워드는, 비복원 추출랜덤이다.

 

파이썬의 train/test의 기본 split은 75:25 

 

train data set의 비율을 높이면 평가가 안정적이지 못하다.

반대로 test data set의 비율이 높아지면 훈련이 부족해진다.

 

7:3, 75:25, 8:2 정도가 적절하다.

 

 

train data를 다시 7:3으로 나누면 validation data set을 만들 수 있다.

그러면 최종 train data는 약 50%가 된다.

validation은 20%, test는 30%가 된다.

 

최종적으로 50:20:30으로 나뉘게 되는 것이다.

 

쓰임

train data set: fitting 할 때 사용됨

validation data set: 튜닝할 때 사용됨

test data set: 마지막 모형을 평가할 때 사용됨

 

튜닝 수 마지막 모델 평가 시 train data + validation data 를 사용한다.

k를 결정했다면 검정 데이터의 쓰임은 끝난 것이기 때문이다.

그래서 부족한 train data set과 함쳐서 train_validation data를 사용하게 된다.

 

 

 

다중 교차 검증

  - 랜덤 서브 샘플링

    홀드 아웃을 반복하여 데이터 손실 방지를 해결

    각 샘플들이 학습과 평가에 얼마나 많이 사용할 것인지 횟수를 제한하지 않아 특정 데이터만 학습되는 경우가 발생할 수 있음. 

    랜덤하게 여러 번 반복해도 선택 못한 데이터가 있을 수 있다는 의미이다.

 

 

  - K-Fold Cross Validation

    가장 일반적인 교차 검증 방식

    데이터 집합을 무작위로 동일 크기를 갖는 K개 부분집합으로 나누고, 그 중 1개 집합을 평가 집합으로, 나머지를 학습 데이터로 선정

    모든 데이터를 학습과 평가에 사용(장점)

    K 값이 증가할 수록 수행 시간과 계산량이 증가(단점)

즉 , 이 방법은 선택하지 못하는 데이터가 발생하지 않도록 고안한 방법이다.

 

 

  - Leave-One-Out Cross Validation(LOOCV)

    전체 N개에서 1개 샘플만을 평가 데이터에 사용, 나머지는 학습 데이터로 사용하는 과정을 총 N번 반복

    K=N인 K-Fold CV와 같은 방식

    많은 데이터를 학습에 사용할 수 있는 장점

    수행 시간과 계산량이 많아 작은 데이터에 사용하기 좋음 

이 방법은 test data set이 1개가 되는 것이다. 예를 들어 iris가 150개이므로 150번 반복하게 되는 것이다. 이론적으로 알려진 방식이며, 사실상 일반화 시키기가 어렵다.

 

 

  - Leave-p-Out Cross Validation(LpOCV)

    LOOCV 에서 1개 샘플이 아닌 p개 샘플을 선택하여 평가 데이터에 사용

   nCp만큼 교차 검증 반복되므로 계산 시간에 대한 부담이 매우 큼

p를 결정할 수 있다. 1개가 아니라 개수를 선택할 수 있다는 의미이다. 반복 카운트가 커서 데용량 데이터에서 사용하기는 힘든 방식이다.

 

 

  - ALT(Aepeared Learning-Testing)

    랜덤하게 비복원추출하는 방법

 

 

  - 부스트스랩

    단순 랜덤 복원 추출 방법을 활용하여 동일한 크기의 표본을 여러 개 생성하여 검증

    부트스트랩으로 N개의 샘플을 생성, 한번도 선택되지 않은 36.8% 데이터를 평가에 사용

키워드는 복원 추출이다.

 

 

반응형

 

 

예제 - iris(knn) k-fold CV 적용

 

1. 데이터 불러오기

 

 

2. 스케일링

 

 

3. 데이터 분리

train_x, test_x, train_y, test_y = train_test_split(iris_x_sc, iris_y, random_state = 0)

 

 

4. (k-fold) 교차 검증을 포함한 모델링

1) cross_val_score

 

단점은 train score를 확인할 수 없다. only test score를 확인할 목적으로 계산된다.

 

 

2) K-Fold

 

어디까지가 train 이고 test 인지 index를 알려주는 것이다.

모든 test data set을 합치면 전체 데이터 셋이 된다. 즉 test set이 절대 중복되지 않는다.

 

위 index로 색인하여 데이터 셋을 추출하여야 한다.

 

 

장점: train score를 얻을 수 있다.

단점: 코드가 지저분하다(k-fold는 index만 알려주므로)

 

 

 

결과 확인

 

728x90

 

 

 

예제 - iris(knn) 홀드아웃 CV 적용(튜닝 시 검증데이터셋 사용)

 

1. 데이터 불러오기

 

 

 

2. 스케일링

 

 

3. 데이터 분리

trainval_x, test_x, trainval_y, test_y = train_test_split(iris_x_sc, iris_y, random_state = 0)
train_x, val_x, train_y, val_y = train_test_split(trainval_x, trainval_y, random_state = 0)

 

 

4. 튜닝

 

**  best parameter 확인

 

vscore 점수가 모두 같으므로 5가 베스트 스코어라고 가정하고 최종 모델링을 진행하도록 하겠다.

 

 

5. 최종 모델링

728x90
반응형