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