AI & DS/머신러닝
[머신러닝] Train set/Test set/Features/Target 이란?
hhongyeahh
2025. 2. 27. 20:01
훈련(Train)데이터, 테스트(Test)데이터,
입력데이터(Features), 타겟데이터(Target)의 의미를 정확히 이해하고 넘어가자
왜 데이터를 훈련(train)과 테스트(test)로 나눌까?
머신러닝 모델을 만들 때 가장 중요한 목표는 새로운 데이터(보지 않은 데이터)에서도 잘 예측하는 모델을 만드는 것이다.
이를 위해, 주어진 데이터를 학습용(train)과 평가용(test)으로 나눠야 한다.
훈련 데이터 (Train set) → 모델을 훈련시키는 데 사용
테스트 데이터 (Test set) → 훈련된 모델을 평가하는 데 사용
- 모델을 학습한 데이터로 그대로 평가하면?
- 모델이 학습 데이터에 너무 과적합(overfitting)될 위험이 있다.
- 새로운 데이터에서는 성능이 낮아질 수 있음 → 그래서 테스트 데이터가 필요하다.
- 모델이 훈련 데이터에 과적합(overfitting)되지 않도록 평가(test)용 데이터를 따로 준비하기 위해
- 새로운 데이터에서도 좋은 성능을 내는 모델을 만들기 위해
train_test_split() 함수
from sklearn.model_selection import train_test_split
# 타겟 데이터 추가 (없을 경우)
if 'target' not in df.columns:
df['target'] = cancer.target
# 입력 데이터 (X)와 정답 데이터 (y) 분리
X = df.drop(columns=['target']) # 특성(Feature) 데이터
y = df['target'] # 타겟(Target) 데이터
# 데이터 분할 (훈련: 70%, 테스트: 30%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
변수 | 설명 |
X | 입력 데이터(특성, feature) |
y | 타겟 데이터(정답, label) |
X_train | 훈련용 입력 데이터 (70%) |
X_test | 테스트용 입력 데이터 (30%) |
y_train | 훈련용 타겟 데이터 (70%) |
y_test | 테스트용 타겟 데이터 (30%) |
train_test_split(X, y, test_size=0.3, random_state=42)
- X: 입력(Feature) 데이터
- y: 타겟(Target) 데이터
- test_size=0.3 → 테스트 데이터의 비율을 30%로 설정
- 0.3이면 전체 데이터의 30%를 테스트 데이터로 사용
- 즉, 70%는 훈련 데이터, 30%는 테스트 데이터로 나눔
✔ 훈련 데이터가 많으면 모델이 더 잘 학습할 가능성이 있지만, 테스트 데이터가 적어 평가가 어려울 수도 있음
✔ 테스트 데이터가 너무 많아지면 훈련 데이터가 부족하여 모델이 충분히 학습하지 못할 수도 있음.
- random_state=42 → 실행할 때마다 같은 방식으로 데이터를 나누도록 설정
- random_state를 고정하지 않으면 실행할 때마다 랜덤하게 데이터가 나뉨
✔ random_state=42
데이터를 나눌 때 항상 같은 방식으로 나누도록 보장하는 역할
42 자체는 특별한 의미 없으며 그냥 사람들이 많이 사용하는 값임
random_state=0, random_state=1, random_state=100 등 다른 숫자를 써도 됨
입력 데이터(X)와 타겟 데이터(y)란?
머신러닝에서는 예측하고 싶은 값(정답, 목표)을 타겟 데이터(y)라고 하고, 이를 예측하기 위해 사용되는 데이터를 입력 데이터(X)라고 한다.
X → 문제(입력값, Features)
y → 정답(출력값, Target)
- 예를 들어,
- 입력 데이터(X) → 집의 특성(feature)들 (예: 크기, 방 개수, 위치 등)
- 타겟 데이터(y) → 집값 (예: 5억, 7억, 10억 등)
집값 예측 데이터
우리가 집값을 예측하는 모델을 만든다고 가정해봅시다.
이때, 집의 다양한 특성(feature)이 주어졌을 때, 집의 가격을 예측하는 것이 목표입니다.
import pandas as pd
# 집값 예측 데이터 생성
data = {
"square_feet": [850, 900, 1200, 1500, 1850, 2100, 2500, 2800, 3200, 3500], # 집 크기 (제곱피트)
"num_bedrooms": [2, 2, 3, 3, 4, 4, 5, 5, 6, 6], # 침실 개수
"num_bathrooms": [1, 1, 2, 2, 3, 3, 3, 4, 4, 5], # 욕실 개수
"location_score": [6, 7, 7, 8, 9, 9, 9, 10, 10, 10], # 위치 점수 (1~10)
"price": [2.5, 2.7, 3.5, 4.2, 5.5, 6.0, 7.2, 8.5, 9.8, 11.0] # 집값 (억 원)
}
# DataFrame으로 변환
df = pd.DataFrame(data)
# 데이터 확인
print(df)
square_feet num_bedrooms num_bathrooms location_score price
0 850 2 1 6 2.5
1 900 2 1 7 2.7
2 1200 3 2 7 3.5
3 1500 3 2 8 4.2
4 1850 4 3 9 5.5
5 2100 4 3 9 6.0
6 2500 5 3 9 7.2
7 2800 5 4 10 8.5
8 3200 6 4 10 9.8
9 3500 6 5 10 11.0
Feature(입력 데이터 X) | 의미 | Target(정답 데이터 y) |
square_feet | 집의 크기 (제곱피트) | 집값 (price) |
num_bedrooms | 침실 개수 | 집값 (price) |
num_bathrooms | 욕실 개수 | 집값 (price) |
location_score | 위치 점수 (1~10) | 집값 (price) |
X (입력 데이터)와 y (타겟 데이터) 분리
우리는 집의 가격(price)을 예측하고 싶으므로, price는 정답(label, target)이고, 나머지 특성들은 입력 데이터(features)가 된다.
X (입력 데이터)
X = df.drop(columns=['price']) # 집값(price)을 제외한 나머지 특성을 입력 데이터로 사용
print(X)
- 여기에는 집의 크기, 침실 개수, 욕실 개수, 위치 점수만 포함됨
- 머신러닝 모델이 이 데이터를 보고 집값을 예측하도록 학습함
square_feet num_bedrooms num_bathrooms location_score
0 850 2 1 6
1 900 2 1 7
2 1200 3 2 7
3 1500 3 2 8
4 1850 4 3 9
5 2100 4 3 9
6 2500 5 3 9
7 2800 5 4 10
8 3200 6 4 10
9 3500 6 5 10
y (타겟 데이터)
y = df['price'] # 집값(price)만 타겟 데이터로 설정
print(y)
- 여기에는 집값만 포함 -> 모델이 X를 보고 y 값을 예측하는 것이 목표
0 2.5
1 2.7
2 3.5
3 4.2
4 5.5
5 6.0
6 7.2
7 8.5
8 9.8
9 11.0
Name: price, dtype: float64