ML · DL/Pytorch 공부

[파이토치 기초] 데이터세트 분리

dendya 2025. 1. 7. 14:24

 

 

데이터세트 분리

머신러닝에서 사용되는 전체 데이터세트는 훈련용 데이터와 테스트 데이터로 나누거나, 훈련용 데이터, 검증용 데이터, 테스트 데이터로 나누어 사용한다.

  • 훈련용 데이터(Training Dataset): 모델을 학습할 때 사용하는 데이터세트.
  • 검증용 데이터(Validation Dataset): 학습이 완료된 모델을 검증하기 위해 사용하는 데이터세트. 주로 구조가 다른 모델의 성능 비교를 위해 사용되는 데이터세트를 의미한다.
  • 테스트 데이터(Testing Dataset): 검증용 데이터를 통해 결정된 성능이 가장 우수한 모델을 최종 테스트하기 위해 사용하는 데이터세트. 검증용 데이터로 성능을 평가한 모델은 검증용 데이터에 과대적합되어 있을 수도 있기에 기존에 사용해 보지 않은 새로운 데이터로 모델의 최종 성능을 평가한다.

이전에 작성했던 비선형 회귀 코드를 수정해 데이터세트를 분리해 학습하고, 평가를 진행하겠다.

# 데이터세트 분리

import torch
import pandas as pd
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import Dataset, DataLoader, random_split

# (데이터세트, 모델 정의 생략)
    
dataset = CustomDataset("file_path")
dataset_size = len(dataset)
train_size = int(dataset_size * 0.8)
val_size = int(dataset_size * 0.1)
test_size = dataset_size - train_size - val_size

train_dataset, val_dataset, test_dataset = random_split(dataset, [train_size, val_size, test_size])
print(f"Training Data Size: {len(train_dataset)}")
print(f"Validation Data Size: {len(val_dataset)}")
print(f"Testing Data Size: {len(test_dataset)}")

train_dataloader = DataLoader(train_dataset, batch_size=16, shuffle=True, drop_last=True)
val_dataloader = DataLoader(val_dataset, batch_size=4, shuffle=True, drop_last=True)
test_dataloader = DataLoader(test_dataset, batch_size=4, shuffle=True, drop_last=True)

 

데이터세트를 분리하기 위해 torch.util.data 모듈에서 random_split() 함수를 사용한다.
random_split 함수는 데이터세트, 분리 길이, 생성자를 인자로 사용하는 함수이며, 분리 길이만큼 데이터세트의 서브셋을 생성한다.
예를 들어, 분리 길이 파라미터에 [70, 20, 10]을 입력하면, 순서대로 70개, 20개, 10개의 데이터를 가지는 데이터세트가 생성된다.
생성자는 서브셋에 무작위로 포함될 데이터의 난수 생성 시드를 의미한다.

위 코드는 전체 데이터세트에서 훈련용 데이터, 검증용 데이터, 테스트 데이터를 각각 8:1:1 비율로 분리한다.
데이터의 길이를 나눌 때 int형으로 변환하지 않으면, 실수 연산으로 인해 전체 데이터세트의 길이가 변할 수 있으니 유의해야 한다.

데이터세트를 나눴다면, 각각의 데이터세트 인스턴스에도 데이터로더를 적용해야 한다.
데이터세트는 모두 길이가 다를 수 있으므로, 데이터로더의 파라미터도 서로 다른 값을 할당할 수 있다.
훈련용 데이터로 학습을 완료했다면, 검증용 데이터(validation_dataloader)를 활용해 모델의 성능을 확인한다.

# 검증용 데이터세트를 이용한 모델 평가

# (학습 과정 생략)

with torch.no_grad():
    model.eval()

    for x, y in val_dataloader:
        x = x.to(device)
        y = y.to(device)

        outputs = model(x)
        print(f"X: {x}")
        print(f"Y: {y}")
        print(f"Outputs: {outputs}")
        print("----------------------")
Training Data Size: 160
Validation Data Size: 20
Testing Data Size: 20
X: tensor([[ 6.7600,  2.6000],
        [10.2400, -3.2000],
        [ 1.9600,  1.4000],
        [46.2400, -6.8000]], device='cuda:0')
Y: tensor([[ 17.1700],
        [ 37.7400],
        [  4.4900],
        [155.4300]], device='cuda:0')
Outputs: tensor([[ 17.0031],
        [ 37.6644],
        [  4.1712],
        [155.3596]], device='cuda:0')
----------------------
...