데이터셋 나누기 & 교차 검증
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번 반복하여 모델을 학습시킨 뒤 나온 평가지표들을 평균내서 모델의 성능을 평가한다.
데이터양이 충분하지 않을 때 사용하며, 보통 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