logo

학습·검증·테스트 데이터 분할

데이터를 학습·검증·테스트로 나누어 모형 선택과 최종 평가를 분리

왜 데이터를 나누는가

  • 학습과 평가에 같은 사례를 쓰면 모형이 외운 답까지 성능에 반영되어 새 사례에서의 오차를 작게 추정할 수 있음
  • 학습 데이터로 학습을 하고, 학습에 사용하지 않은 테스트 데이터로 새로운 데이터에서 성능을 평가
  • 학습에 여러 가지 설정(예: 의사결정나무의 깊이)을 비교할 때, 테스트 데이터로 비교하면 테스트 데이터의 특성에 설정을 맞추게 되어 테스트 성능이 과대평가될 수 있음
  • 이를 방지하기 위해 별도의 검증 데이터를 사용하여 다양한 설정을 비교
  • 데이터의 구분:
    • 학습 데이터(train data): 모형의 규칙을 학습하는 데이터. 가장 높은 비중을 둠.
    • 검증 데이터(validation data): 여러 모형을 비교하고 설정을 선택하는 데이터
    • 테스트 데이터(test data): 선택이 끝난 모형의 최종 성능을 확인하는 데이터

이번 실습에서는 전체 데이터를 60%·20%·20%로 분할.

실습 준비

다운로드 명령

!wget -q -O reaction_time.xlsx "https://www.mindscale.kr/content-assets/24d730234f8d72bad3fb2f2ff9916b717797f485510adf57d80e556596de27d1/reaction_time.xlsx"
import pandas as pd
from sklearn.metrics import root_mean_squared_error
from sklearn.tree import DecisionTreeRegressor

df = pd.read_excel("reaction_time.xlsx", sheet_name="data")

X = df.drop(columns="reaction_time_ms")
y = df["reaction_time_ms"]

테스트 데이터 먼저 분리

전체 데이터의 20%를 테스트 데이터로 먼저 분리. 나머지 80%는 학습·검증 데이터로 사용.

from sklearn.model_selection import train_test_split
X_train_val, X_test, y_train_val, y_test = \
    train_test_split(X, y, test_size=0.2, random_state=42)
  • test_size=0.2: 전체의 20%를 테스트 데이터로 배정
  • random_state=42: 같은 무작위 분할을 다시 재현

학습 데이터와 검증 데이터 분리

남은 80%에서 25%를 검증 데이터로 분리. 전체의 80%에 25%를 곱하면 20%이므로 최종 비율은 60:20:20.

X_train, X_val, y_train, y_val = \
    train_test_split(
        X_train_val,
        y_train_val,
        test_size=0.25,
        random_state=42,
    )

학습 데이터의 형태:

X_train.shape  # 학습 데이터 형태
실행 결과
(192, 1)

검증 데이터의 형태:

X_val.shape  # 검증 데이터 형태
실행 결과
(64, 1)

테스트 데이터의 형태:

X_test.shape  # 테스트 데이터 형태
실행 결과
(64, 1)

검증 데이터로 모형 선택

학습 데이터로 깊이 3 나무를 학습하고 검증 데이터의 RMSE 계산.

tree3 = DecisionTreeRegressor(max_depth=3, random_state=42)
tree3.fit(X_train, y_train)
pred_val3 = tree3.predict(X_val)
root_mean_squared_error(y_val, pred_val3)
실행 결과
30.242785130077614

같은 방법으로 깊이 6 나무의 검증 RMSE 계산.

tree6 = DecisionTreeRegressor(max_depth=6, random_state=42)
tree6.fit(X_train, y_train)
pred_val6 = tree6.predict(X_val)
root_mean_squared_error(y_val, pred_val6)
실행 결과
32.02448001765233
  • 깊이 3: 검증 RMSE 약 30.2ms
  • 깊이 6: 검증 RMSE 약 32.0ms
  • 선택: 검증 RMSE가 더 작은 깊이 3

선택한 모형의 최종 테스트

깊이를 선택한 뒤 학습·검증 데이터 전체로 깊이 3 나무를 다시 학습. 마지막으로 테스트 데이터의 RMSE를 한 번 계산.

final_model = DecisionTreeRegressor(max_depth=3, random_state=42)
final_model.fit(X_train_val, y_train_val)
pred_test = final_model.predict(X_test)
root_mean_squared_error(y_test, pred_test)
실행 결과
32.33120494399417

퀴즈

다운로드 명령

!wget -q -O housing.xlsx "https://www.mindscale.kr/content-assets/98281ede1416a15670d419ced730f15ab08d51ff370771636544a1261bb3c53f/housing.xlsx"

housing.xlsx를 불러와 score를 예측할 만족도 점수로 분리하고, 자료를 학습·검증·테스트 데이터로 60:20:20 비율로 나눕니다.

house_df = pd.read_excel("housing.xlsx", sheet_name="data")
X_house = house_df.drop(columns="score")
y_house = house_df["score"]

X_house_train_val, X_house_test, y_house_train_val, y_house_test = \
    train_test_split(X_house, y_house, test_size=0.2, random_state=42)
X_house_train, X_house_val, y_house_train, y_house_val = \
    train_test_split(
        X_house_train_val, 
        y_house_train_val, 
        test_size=0.25, 
        random_state=42)
문제 1 / 7맞음: 0힌트: 0틀림: 0채점중: 0남음: 7

모형의 규칙을 학습하는 데 사용하는 데이터는?

  • ○학습 데이터
  • ○검증 데이터
  • ○테스트 데이터

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.

Previous
일반화와 과대적합