소소한 컴퓨터 이야기

데이터셋 나누기 & 교차 검증

by Cori

개요

Hold out, K-Fold Cross Validation, StratifiedKold 등 데이터 분리 방법과 교차 검증에 대해 알아본다.

 

내용 정리

0. Train, Validation, Test Dataset 

· Train Dataset: 모델을 학습시킬 때 사용할 데이터셋

· Validation Dataset: Train Dataset으로 학습한 모델의 성능을 측정하기 위한 데이터셋 

· Test Dataset: 모델의 성능을 최종적으로 측정하기 위한 데이터셋으로, 마지막에 모델의 성능을 측정하는 용도로 딱 한 번만 사용됨  

 

1. Hold out 데이터 분리

0) Hold out 방법

-> 데이터셋을 Train, Validation, Test set으로 나눈다. 

* sklearn.model_selection.train_test_split() 함수 사용 

 

1) Train <-> Test Dataset 분리

2) Train <-> Validation Dataset 분리

Validation dataset은 Train dataset으로부터 분리한다. 

 

3) Hold out 방식의 단점

· train/test 셋이 어떻게 나눠지냐에 따라 결과가 달라져서, 데이터가 수천건 정도로 적을 때는 문제가 발생할 수 있다. 

 

* 데이터셋의 양이 적을 경우 학습을 위한 데이터 양이 너무 적어 학습이 제대로 안 될 수 있으며, 다양한 패턴을 찾을 수 없기 때문에 

새로운 데이터에 대한 예측 성능이 떨어진다. 이에 Hold out 방식은 다양한 패턴을 가진 데이터의 양이 많을 경우에 사용한다. 

 

2. K-겹 교차검증 (K-Fold Cross Validation) 데이터 분리

0) K-겹 교차검증 방법

-> 데이터셋을 설정한 K개로 나눈다. K개 중 하나를 검증세트로 나머지를 훈련 세트로 하여 모델을 학습시키고 평가한다. 

K개 모두가 한번씩 검증세트가 되도록 K번 반복하여 모델을 학습시킨 뒤 나온 평가지표들을 평균내서 모델의 성능을 평가한다. 

 

K-Fold Cross Validaition

데이터양이 충분하지 않을 때 사용하며, 보통 Fold를 나눌 때 4개 (2.5:7.5) 또는 5개 (2:8) fold로 나눈다. 

 

* KFold (회귀 문제의 Dataset 분리), StratifiedKFold (분류 문제의 Dataset 분리)가 있다. 

 

1) KFold (회귀 문제의 Dataset 분리)

· 지정한 개수(K)만큼 분할한다.

· Raw Dataset의 순서를 유지하며 지정한 개수를 분할한다. 

· 회귀 문제를 사용한다.

더보기

· KFold(n_splits=K)

· KFold객체.split(데이터셋)

 

· KFold 모델 생성

· KFold 데이터 분리 

kfold의 split을 통해 얻어진 ex는 generator 객체 타입이다. K 값을 5로 설정하였기 때문에 150개의 데이터가 들어있는 Iris Dataset을 5묶음 (각 30개)으로 나누어 분리한다. 각각의 데이터셋은 next() 함수를 사용하여 조회할 수 있다.

 

* 출력 값에서 볼 수 있듯이, kfold.split() 함수는 Train set과 Test set의 index를 반환한다. 

 

· KFold 모델 학습

KFold로 데이터를 분리할 경우, 학습 <-> 평가 과정이 K번 이루어지기 때문에, 각 단계에서의 정확도를 저장할 배열이 필요하다. 해당 배열을 반복적으로 탐색하며 데이터셋 분리, Decision Tree 모델 생성, 모델 학습, 예측, 평가, 평가 과정을 수행하였다.

 

· KFold 모델 성능 측정

앞서 K번의 반복 과정을 통해 얻은 정확도들의 평균을 구함으로써 최종 성능을 구하였다.

 

2) StratifiedKold

· 나뉜 fold들의 label들이 같은 비율로 구성되도록 나눈다. 

· 각각의 클래스 별로 순서대로 나눈다.

· 분류 문제에서 사용한다. 

 

* 1~10번: 0번 클래스, 11 ~ 20번: 1번 클래스, 21 ~ 30번: 2번 클래스인 30개의 데이터셋이 있다고 하고, K = 9일 경우 KFold: 0번 클래스 9개를 가져오는 반면, StratifiedKold는 0번 클래스 3개, 1번 클래스 3개, 2번 클래스 3개를 가져온다.

더보기

· StratifiedKold(n_splits=K) 

· StratifiedKold객체.split(X, y)

 

· StratifiedKFold 모델 생성 

· StratifiedKFold 데이터 분리

split 값을 3으로 설정하였기 때문에 150개의 데이터가 들어있는 Iris Dataset을 3묶음 (각 50개)으로 나누어 분리한다. 각각의 데이터셋은 next() 함수를 사용하여 조회할 수 있으며, KFold와 다르게 각 클래스 별로 균등하게 분리된 것을 알 수 있다. 

* 출력 값에서 볼 수 있듯이, StratifiedKFold.split() 함수는 Train set과 Test set의 index를 반환한다. 

 

· StratifiedKFold 모델 학습 

KFold와 마찬가지로 데이터를 분리할 경우, 학습 <-> 평가 과정이 K번 이루어지기 때문에, 각 단계에서의 정확도를 저장할 배열이 필요하다. 해당 배열을 반복적으로 탐색하며 데이터셋 분리, Decision Tree 모델 생성, 모델 학습, 예측, 평가, 평가 과정을 수행하였다.

 

· StratifiedKFold 모델 성능 측정 

앞서 n번의 반복 과정을 통해 얻은 정확도들의 평균을 구함으로써 최종 성능을 구하였다.

 

3) Cross_val_score() 

-> 데이터셋을 K개로 나누고 K번 반복하면서 평가하는 작업을 처리해주는 함수 

더보기

· estimator: 학습할 평가모델 객체

· X: feature

· y: label

· scoring: 평가지표

· cv: 나눌 개수 (K)

 

* 반환값: array 형태로, 각 반복마다의 평가 점수 

 

K번 반복하면서 얻은 평가 결과 값을 scores 변수에 저장하였고, 이에 대한 평균 값을 구하였다.

'AI > Machine Learning' 카테고리의 다른 글

불균형 클래스 분류 다루기  (0) 2021.11.28
과적합과 일반화  (0) 2021.11.26
수치형 데이터 전처리  (0) 2021.11.25
One-Hot Encoding  (0) 2021.11.24
Label Encoding  (0) 2021.11.23

블로그의 정보

코딩하는 오리

Cori

활동하기