훈련 세트와 테스트 세트 : 데이터 전처리부터 모델 평가까지
머신러닝 모델을 효과적으로 훈련시키기 위해서는 데이터를 어떻게 준비하고 처리하는지가 중요합니다. 이번 포스트에서는 훈련 세트와 테스트 세트를 나누는 방법부터 데이터 전처리까지, 데이터를 사용해 하나의 모델을 완성해보겠습니다.
1. 훈련 세트와 테스트 세트란?
- 훈련 세트 (Training Set) : 모델을 학습시키기 위한 데이터입니다. 이 데이터를 사용하여 모델이 다양한 패턴을 학습하게 됩니다.
- 테스트 세트 (Test Set) : 모델의 성능을 평가하기 위한 데이터입니다. 훈련에 사용되지 않은 데이터를 사용해 모델이 실제 환경에서 얼마나 잘 작동하는지 확인합니다.
모델을 훈련하고 평가하기 위해서는 데이터를 적절히 나눠야 하며, 이때 샘플링 편향이 발생하지 않도록 해야 합니다. 데이터가 한쪽으로 치우치지 않도록 무작위로 섞은 후 데이터를 분리합니다.
2. 데이터 준비
이번 예제에서는 물고기의 길이와 무게 데이터를 사용해 물고기의 종류를 구별하는 모델을 만들어보겠습니다. 먼저 데이터를 준비하고 훈련 세트와 테스트 세트를 나눕니다.
fish_length = [25.4, 26.3, 26.5, ...] # 물고기 길이
fish_weight = [242.0, 290.0, 340.0, ...] # 물고기 무게
# 두 데이터를 합쳐서 fish_data로 만듭니다.
fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1]*35 + [0]*14 # 1: 도미, 0: 빙어
fish_data는 각각의 물고기 샘플에 대한 길이와 무게 정보를 포함하며, fish_target은 그 물고기가 도미인지 빙어인지를 나타내는 타겟 데이터입니다.
3. 훈련 세트와 테스트 세트 나누기
모델을 훈련시키기 위해서는 데이터를 훈련 세트와 테스트 세트로 나눠야 합니다. 훈련 세트는 모델이 학습하는 데 사용되며, 테스트 세트는 모델의 성능을 평가하는 데 사용됩니다.
from sklearn.neighbors import KNeighborsClassifier
train_input = fish_data[:35]
train_target = fish_target[:35]
test_input = fish_data[35:]
test_target = fish_target[35:]
# K-최근접 이웃 모델을 사용하여 훈련
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
# 모델 성능 평가
print(kn.score(test_input, test_target)) # 테스트 세트에서 정확도 출력
여기서 사용된 K-최근접 이웃 (K-Nearest Neighbors, KNN) 알고리즘은 새로운 데이터를 분류할 때 가장 가까운 K개의 이웃 데이터를 참조하여 분류를 결정하는 방법입니다.
4. Numpy를 이용한 데이터 섞기
샘플링 편향을 방지하기 위해 데이터를 무작위로 섞습니다. 이를 위해 Numpy를 사용합니다.
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
# 데이터를 무작위로 섞기 위해 인덱스를 랜덤하게 생성
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)
# 훈련 세트와 테스트 세트를 나눔
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
이 과정에서는 Numpy를 이용해 인덱스를 무작위로 섞고, 해당 인덱스를 이용해 데이터를 나누었습니다. 무작위로 데이터를 나눔으로써 모델이 특정 데이터에 편향되지 않도록 합니다.
5. 데이터 시각화
훈련 세트와 테스트 세트를 시각화하여 데이터가 어떻게 나눠졌는지 확인합니다.
import matplotlib.pyplot as plt
plt.scatter(train_input[:, 0], train_input[:, 1], label='Train Set')
plt.scatter(test_input[:, 0], test_input[:, 1], label='Test Set', marker='^')
plt.xlabel('Length')
plt.ylabel('Weight')
plt.legend()
plt.show()
위 코드에서는 훈련 데이터와 테스트 데이터를 matplotlib을 사용하여 시각화해서 데이터가 적절히 나누어졌는지 한눈에 파악할 수 있습니다.
6. 데이터 전처리 : 표준화
표준화 (Standardization)는 각 데이터의 평균과 표준편차를 이용해 데이터를 정규화하는 과정입니다. 이는 서로 다른 단위를 가지는 특성 값들이 균등하게 비교될 수 있도록 합니다.
mean = np.mean(train_input, axis=0)
std = np.std(train_input, axis=0)
train_scaled = (train_input - mean) / std
test_scaled = (test_input - mean) / std
표준화를 통해 길이와 무게가 서로 다른 스케일로 인해 모델에 악영향을 주지 않도록 조정합니다. 여기서 axis=0은 각 열(특성)에 대해 평균과 표준편차를 계산한다는 의미입니다.
7. 모델 훈련 및 평가
표준화된 데이터를 사용해 모델을 다시 훈련시키고 성능을 평가합니다.
kn.fit(train_scaled, train_target)
print(kn.score(test_scaled, test_target)) # 표준화된 데이터로 평가
참고자료 : '혼자 공부하는 머신러닝 딥러닝' 인프런 강의
'Group Study (2024-2025) > Machine Learning 입문' 카테고리의 다른 글
[ML 입문] 6주차 스터디 (3) | 2024.11.10 |
---|---|
[ML 입문] 5주차 스터디 (1) | 2024.11.06 |
[ML 입문] 4주차 스터디 (0) | 2024.10.30 |
[ML 입문] 3주차 스터디 (1) | 2024.10.16 |
[ML 입문] 2주차 스터디 (0) | 2024.10.07 |