«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Recent Posts
Today
Total
관리 메뉴

짜리몽땅 매거진

[ML] train_test_validation 데이터와 교차검증(CV) 본문

Data/Machine Learning

[ML] train_test_validation 데이터와 교차검증(CV)

쿡국 2024. 5. 14. 19:01

  

보통 머신러닝 모델링 프로세스는 다음 사진과 같이 진행된다.

출처 : https://velog.io/@ddoddi/3.-%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-%EB%AA%A8%EB%8D%B8%EB%A7%81%EC%9D%84-%EC%9C%84%ED%95%9C-%EC%A0%84%EC%B2%B4%EC%A0%81%EC%9D%B8-%EA%B3%BC%EC%A0%95

 

문제 정의 후 데이터를 수집하고, 탐색적 데이터 분석(EDA)까지 진행했다면 중요 피처를 파악하는 피처 선택(Feature Selection)에 돌입한다. 중요 피처를 파악했다면 본격적인 모델링을 시작할텐데, 이때 우선적으로 진행해야하는 것이 바로 데이터셋 분리이다. 머신러닝 모델링을 마치고 모델의 정확한 성능 평가를 위해서는 train 세트와 test 세트가 필요하다. 우선 샘플 데이터셋을 활용해 train 데이터와 test 데이터로 나누는 방법을 알아보자.


샘플 데이터

1. 필요 모듈 import

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import pandas as pd
import numpy as np

 

2.  독립변수 / 종속변수 나누기

#train/test로 나누기 위해서는 독립변수 종속변수 나눠야 한다.

df_x = df[['RI', 'Na', 'Mg', 'Al', 'Si', 'K', 'Ca', 'Ba', 'Fe']] #독립변수
df_y = df['Type'] #종속변수

 

3. train, test 데이터로 나누기

#n_estimators 하이퍼파라미터를 200개의 결정 트리를 사용하도록 설정
rfc =RandomForestClassifier(n_estimators=200)

#random_state에서 111은 큰 의미x, 코드의 결과가 재현 가능하고 일관되게 유지하기 위함.다른 숫자여도 ok 
x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, test_size=0.3, random_state=111)

 

4. train 데이터 학습 및 모델 평가

rfc_model=rfc.fit(x_train, y_train) #모델에 train 데이터만 넣어서 학습

pred_y=rfc_model.predict(x_test) #train으로 학습해서 y값 예측

base_ac=accuracy_score(y_test, pred_y) #정확도 평가

우리는 일반적으로 전체 데이터를 7:3으로 나누고 train set을 학습하여 test set으로 평가한다. 이 경우 문제점은 우리가 학습한 모델이 제대로 학습되었는지, 또 모델을 학습하는 데에 있어서 train set에 과적합될 가능성이 굉장히 높다. 그래서 우리는 최종 평가 전에 모델을 학습하기 위해서 validation set을 지정한다.

 

위와 같이 데이터셋을 구성하면 더 이상 train set으로만 학습하는 것이 아니라 validation set으로 평가하면서 하이퍼파라미터를 튜닝하고 모델을 학습할 수 있다. 하지만 여전히 생기는 문제점이 있다. 앞선 방법이 train set에만 과적합되었다면 이번에는 validation set에만 과적합될 수 있다. 또한, 모델을 평가하는 데 있어서 특정 데이터셋에서만 성능이 잘 나와 test set에서는 성능이 잘 나오지 않는 경우가 생길 수 있다.

 

이렇듯 과적합을 피하고자 validation set 구성하더라도 하나의 validation set으로만 구성한다면 하나의 validation set 맞추는 파라미터를 튜닝하고 모델을 학습하게 있다. 그래서 하나의 검증이 아닌 여러번의 검증으로 일반적인 모델을 만들고 파라미터를 튜닝하기 위해서 교차검증이 등장하게 된다.

 

오늘은 교차검증 기법 중 가장 대중적으로 사용되는 K-Fold Cross Validation 기법을 소개해보고자 한다.

  1. 데이터를 K개의 폴드로 나눈다.
  2. 폴드를 번씩 선택하여 검증 세트로 사용하고, 나머지 폴드를 훈련 세트로 사용하여 모델을 학습한다.
  3. 폴드에 대해 모델을 평가한다.
  4. K번의 학습-평가 후에 얻은 성능 지표를 평균하여 모델의 최종 성능을 얻는다.

위와 같은 과정으로 교차 검증이 진행된다.

rfc =RandomForestClassifier(n_estimators=200)

x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, test_size=0.3, random_state=111)

#cross_val_score 함수로 k-fold 진행
#cross_val_score(사용할 모델, train_x, train_y, cv= 폴드를 몇 개 만들 것인가?)
kfold_score_1=cross_val_score(rfc, x_train,y_train, cv = 5)

 

cross_val_score 함수를 사용해 폴드 개수를 지정하면 된다.

 

k-fold에서 k는 직접 지정할 수 있다. 위에서는 k를 5로 지정하였고 전체 데이터를 임의로 1/5로 나누어서 validation set을 한 번씩 번갈아가면서 데이터셋을 구성하였다.각 데이터를 학습하고 validation으로 평가를 한 다음 5개의 결과에 대해 평균을 내어 최종 성능을 구하는 방식으로 데이터를 구성한다면 우선 모델 평가부분에서 고정된 validation set이 아니기 때문에 조금 더 신뢰성 있는 결과를 얻을 수 있다.

 

또한, CV를 사용하는 가장 큰 이유는 하이퍼파라미터 튜닝인데, 하나의 validation set을 잘 맞추기 위한 튜닝이 아니라 다른 validation set을 잘 맞추기 위한 튜닝을 하기 때문에 과적합을 피하는 학습을 할 수 있다.


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

 

각 세트의 목적을 요약하자면 위의 표와 같다. 모델링 시 train, test 데이터로 나누는 것은 필수 과정이고, 과적합 방지를 위해 검증 데이터셋을 사용하면 더 좋은 성능의 모델을 생성할 수 있다.

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

[ML] Kmeans 알고리즘 + DBSCAN  (0) 2024.06.23
[ML] KNN 알고리즘  (0) 2024.06.22
[ML] Feature Selection  (0) 2024.06.22
[ML] 데이터 스케일링  (0) 2024.06.05
[ML] 머신러닝에서의 거리기반 측정  (0) 2024.04.02