본문 바로가기

개발 공부/딥러닝

[Deep Learning] 표 데이터와 시계열 데이터도 Dataset으로 만들기

1. 데이터가 달라도 Dataset의 약속은 같다

이미지에서는 파일 경로를 열어 feature를 만들고 부모 폴더 이름에서 target을 찾았다.
표 데이터에서는 한 행을 feature와 target으로 나누면 된다.
원본을 읽는 방식은 달라도 `__len__`과 `__getitem__`이 반환해야 하는 결과는 같다.

데이터 feature target
이미지 분류 이미지 Tensor 클래스 번호
Titanic 한 승객의 입력 변수 survived
주식 시계열 과거 여러 날짜의 값 이후 날짜의 Close

⠀⠀⠀

2. Titanic DataFrame을 Custom Dataset으로 바꾸기

원본 Titanic은 891행 15열이지만 숫자형 컬럼만 선택하면 891행 6열이 된다.
target인 `survived` 한 열을 제외하면 한 샘플의 feature는 5개다.

⠀⠀⠀
표 데이터용 Dataset 클래스

DataFrame은 컬럼 이름이 있어 target을 고르기 편하지만 모델 계산에는 실제 숫자 배열만 필요하다.
따라서 생성할 때 feature와 target을 분리한 뒤 `to_numpy()`로 배열로 바꿔 저장한다.

⠀⠀⠀
왜 axis 1을 지정할까

`axis=1`은 열 방향에서 `survived` 컬럼을 제거하라는 뜻이다.
행을 지우는 것이 아니라 정답 열만 제외하고 나머지 5개 열을 feature로 남긴다.

📌 이해 보충 | `shape[0]`은 행 수다.
각 행이 승객 한 명이므로 `self.arr_feature.shape[0]`은 전체 샘플 수 891을 뜻한다.

⠀⠀⠀
Dataset 실행 결과

`torch.Size([5])`는 첫 번째 승객의 feature가 숫자 5개인 1차원 Vector라는 뜻이다.
target `0`은 해당 승객의 `survived` 값이다.

⠀⠀⠀

3. 시계열 데이터는 행 순서까지 feature가 된다

Titanic에서는 승객 행의 순서를 섞어도 각 승객의 정보 자체는 달라지지 않는다.
하지만 주식 가격은 오늘보다 어제가 먼저라는 시간 순서가 의미를 가진다.
따라서 시계열 데이터는 열만 feature와 target으로 나누면 안 되고, 과거 여러 행을 하나의 입력 묶음으로 만들어야 한다.

⠀⠀⠀
주식 데이터 불러오기

이 데이터는 거래일 20개와 변수 5개로 구성된다.
각 행은 날짜 하나이고, 각 열은 종가·고가·저가·시가·거래량이다.

Date Close High Low Open Volume
2026-08-03 373.270 376.448 363.117 365.215 38,669,700
2026-08-04 377.407 380.276 367.264 367.983 35,705,700

⠀⠀⠀
Close가 항상 target인 것은 아니다

다음 거래일의 종가를 예측하는 문제라면 미래 날짜의 `Close`가 target이다.
하지만 이미 지나간 날짜의 Close는 알고 있는 값이므로 과거 Window 안에서는 feature로도 들어갈 수 있다.

📌 이해 보충 | 같은 Close 열도 기준 시점보다 과거라면 feature, 앞으로 예측할 시점이라면 target이 된다.
시계열에서 target은 컬럼 이름만으로 결정되지 않고 시간 위치까지 함께 봐야 한다.

⠀⠀⠀

4. 과거 이틀로 다음 날을 예측하는 Window

`input_size=2`라면 연속된 과거 2일을 하나의 feature로 묶고, 바로 다음 날의 Close를 target으로 둔다.
Window가 한 행씩 오른쪽으로 이동하면서 여러 학습 샘플이 만들어진다.

샘플 feature에 들어가는 행 target
1 0번과 1번 행의 5개 변수 2번 행 Close
2 1번과 2번 행의 5개 변수 3번 행 Close
3 2번과 3번 행의 5개 변수 4번 행 Close

⠀⠀⠀
첫 번째 학습 샘플

feature의 `(2, 5)`는 2일치 데이터마다 Close, High, Low, Open, Volume 5개 변수가 있다는 뜻이다.
target은 그다음 행의 0번 열, 즉 다음 날짜의 Close 한 개다.

⠀⠀⠀
두 번째 학습 샘플

두 번째 샘플은 Window를 한 칸 이동한다.
첫 번째 샘플의 마지막 날이 두 번째 샘플의 첫날로 다시 사용된다.
이렇게 겹치는 Window를 만드는 이유는 제한된 시계열에서 가능한 연속 패턴을 여러 학습 샘플로 만들기 위해서다.

⠀⠀⠀

5. 반복문으로 Window를 만들기

반복 변수 `i`는 target이 위치한 행 번호다.
`i-input_size:i`는 target 바로 앞의 `input_size`개 행을 자르고,
`tmp[i, 0]`은 같은 i행의 Close를 target으로 가져온다.

i x 슬라이싱 y 인덱싱
2 tmp[0:2] tmp[2, 0]
3 tmp[1:3] tmp[3, 0]
4 tmp[2:4] tmp[4, 0]

📌 이해 보충 | 전체 행이 5개이고 input_size가 2이며 다음 1개 값만 예측한다면 만들 수 있는 샘플은 5 - 2 = 3개다.

⠀⠀⠀
여러 날짜를 예측하려면 pred_size가 필요하다

input_size = 2 # 과거 며칠을 볼지
pred_size = 2 # 미래 며칠을 예측할지

미래 하루가 아니라 이틀을 예측하려면 target도 한 개의 숫자가 아니라 연속된 두 날짜의 Close가 되어야 한다.
이때 가능한 Window 수는 다음과 같이 계산할 수 있다.

가능한 Window 수 = 전체 행 수 - input_size - pred_size + 1

예를 들어 전체 5행에서 과거 2일로 미래 2일을 예측하면 `5 - 2 - 2 + 1 = 2`개의 Window를 만들 수 있다.
입력 기간과 예측 기간을 별도 변수로 두면 원하는 문제에 맞게 Window 길이를 바꿀 수 있다.

⠀⠀⠀

6. 이미지 표 시계열 Dataset 비교

구분 한 샘플의 feature target을 찾는 방법 순서
이미지 이미지 한 장 부모 폴더 이름 대체로 무관
표 데이터 한 행의 여러 변수 target 컬럼 대체로 무관
시계열 연속된 여러 행 Window 다음 시점 반드시 유지

이번 글의 핵심은 데이터 형식이 달라질수록 `__getitem__` 안에서 한 샘플을 만드는 로직이 달라진다는 점이다.
특히 시계열은 과거와 미래의 경계를 정한 뒤 Window를 만들어야 한다.

반응형