학습·검증·테스트 데이터 분할
데이터를 학습·검증·테스트로 나누어 모형 선택과 최종 평가를 분리
왜 데이터를 나누는가
- 학습과 평가에 같은 사례를 쓰면 모형이 외운 답까지 성능에 반영되어 새 사례에서의 오차를 작게 추정할 수 있음
- 학습 데이터로 학습을 하고, 학습에 사용하지 않은 테스트 데이터로 새로운 데이터에서 성능을 평가
- 학습에 여러 가지 설정(예: 의사결정나무의 깊이)을 비교할 때, 테스트 데이터로 비교하면 테스트 데이터의 특성에 설정을 맞추게 되어 테스트 성능이 과대평가될 수 있음
- 이를 방지하기 위해 별도의 검증 데이터를 사용하여 다양한 설정을 비교
- 데이터의 구분:
- 학습 데이터(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)
모형의 규칙을 학습하는 데 사용하는 데이터는?
퀴즈를 풀려면 대화형 기능을 불러와야 합니다.