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를 만들어야 한다.
'개발 공부 > 딥러닝' 카테고리의 다른 글
| [Deep Learning] PyTorch 신경망 모델 직접 만들기 (0) | 2026.09.26 |
|---|---|
| [Deep Learning] 시계열 Dataset에 MinMax Scaling 적용하기 (0) | 2026.09.26 |
| [Deep Learning] PyTorch Custom Dataset 만들기 (0) | 2026.09.25 |
| [Deep Learning] Hugging Face란? (0) | 2026.09.24 |
| [Deep Learning] PyTorch Dataset과 DataLoader (0) | 2026.09.24 |