-
LSTM(Long Short-Term Memory) 모델 학습을 위한 시계열 데이터 전처리IT/파이썬 2025. 4. 26. 20:11
import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler def preprocess_lstm_data(df, feature_col='close', sequence_length=60): """ LSTM 학습을 위한 시계열 데이터 전처리. Parameters: df (DataFrame): Bybit에서 받은 원본 데이터프레임 (timestamp index 포함) feature_col (str): 사용할 컬럼명 (예: 'close') sequence_length (int): LSTM 시퀀스 길이 (default: 60) Returns: X_train, y_train, X_test, y_test, scaler """ data = df[[feature_col]].values scaler = MinMaxScaler() scaled_data = scaler.fit_transform(data) X, y = [], [] for i in range(sequence_length, len(scaled_data)): X.append(scaled_data[i-sequence_length:i]) y.append(scaled_data[i]) X, y = np.array(X), np.array(y) # 80% train, 20% test 분리 split = int(0.8 * len(X)) X_train, X_test = X[:split], X[split:] y_train, y_test = y[:split], y[split:] # LSTM input: (samples, timesteps, features) return X_train, y_train, X_test, y_test, scaler각 소스의 상세한 설명
1. 라이브러리 임포트
import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler- numpy: 수학적 계산을 효율적으로 수행하며, 배열 기반 데이터의 처리를 돕습니다.
- 예를 들어, 데이터를 학습 가능한 형태로 변환하거나, 수치 계산을 빠르게 처리하는 데 사용됩니다.
- pandas: DataFrame을 사용해 데이터를 구조화하고 분석할 수 있습니다.
- 여기서는 Bybit에서 가져온 시계열 데이터를 다룰 때 활용됩니다.
- MinMaxScaler: scikit-learn 라이브러리에서 제공하는 정규화 도구로,
- 데이터의 최소값과 최대값을 기반으로 값을 0~1 사이로 스케일링합니다.
2. 함수 정의 및 매개변수
def preprocess_lstm_data(df, feature_col='close', sequence_length=60):- df: Bybit에서 가져온 시계열 데이터가 저장된 Pandas DataFrame.
- 여기에는 timestamp와 각종 가격 정보(예: close, open, high, low)가 포함되어 있을 가능성이 높습니다.
- feature_col: LSTM 모델 학습에 사용할 컬럼명. 기본값은 'close'(종가 데이터).
- sequence_length: LSTM 모델이 학습할 시퀀스 길이.
- 예를 들어, 최근 60개의 데이터를 기반으로 다음 값을 예측합니다.
3. 데이터 정규화
data = df[[feature_col]].values scaler = MinMaxScaler() scaled_data = scaler.fit_transform(data)- data: 지정된 컬럼(feature_col)만 선택하여 NumPy 배열 형태로 변환합니다. DataFrame에서 [[]]를 사용하면 2차원 배열로 변환됩니다.
- MinMaxScaler: 데이터를 0~1로 스케일링하여 모델 학습에 적합하게 만듭니다. 정규화의 목적은 각 특성의 스케일을 맞춰서 모델이 특정 값에 편향되지 않도록 하는 것입니다.
- 예시: close 값이 500MinMaxScaler1로 조정합니다.
4. LSTM 학습 데이터 생성
X, y = [], [] for i in range(sequence_length, len(scaled_data)): X.append(scaled_data[i-sequence_length:i]) y.append(scaled_data[i]) X, y = np.array(X), np.array(y)- for 루프:
- sequence_length 만큼의 데이터를 기준으로 입력 데이터(X)를 생성합니다.
- 각 루프에서 X는 과거 sequence_length 기간의 데이터(예: 마지막 60개의 종가 값)를 포함하고, y는 현재 시점의 값을 포함합니다.
- X와 y의 형태:
- X: 입력 데이터로서 LSTM 모델이 학습하는 시퀀스 배열입니다.
- y: 출력 값으로 예측해야 하는 목표 값입니다.
- NumPy 배열로 변환하여 모델 학습에 적합한 형태로 만듭니다.
5. Train-Test 데이터 분리
split = int(0.8 * len(X)) X_train, X_test = X[:split], X[split:] y_train, y_test = y[:split], y[split:]- Train-Test 분리 기준:
- 전체 데이터의 80%는 학습용 데이터(X_train, y_train)로 사용하고, 나머지 20%는 테스트 데이터(X_test, y_test)로 분리합니다.
- 데이터 분리의 이유는 모델의 성능을 독립적으로 평가하기 위함입니다.
- 샘플 분배:
- 예를 들어, 총 1000개의 샘플이 있다면:
- 학습 데이터: X_train과 y_train은 각각 800개의 샘플을 포함.
- 테스트 데이터: X_test와 y_test는 각각 200개의 샘플을 포함.
- 예를 들어, 총 1000개의 샘플이 있다면:
6. 반환값
return X_train, y_train, X_test, y_test, scaler- X_train, y_train: 학습 데이터.
- X_test, y_test: 테스트 데이터.
- scaler: 정규화된 데이터로 추후 예측 값을 복원하거나 새로운 데이터를 정규화할 때 사용됩니다.
결론
이 함수는 LSTM 모델 학습에 필요한 시계열 데이터를 준비하는 데 최적화되어 있으며,
데이터 정규화부터 Train-Test 분리까지의 모든 과정을 처리합니다.
정규화된 데이터는 일반적으로 딥러닝 모델에서 필수적이며,
입력 데이터의 시퀀스 길이를 고려해 훈련 데이터를 생성하는 방식은
LSTM 모델의 시간 종속성(time dependency)을 효과적으로 학습하게 만듭니다.
'IT > 파이썬' 카테고리의 다른 글
파이썬 venv 가상환경 만들기 — 프로젝트별 독립 개발환경 구축법 (0) 2025.07.14 파이썬 버전 어떤 걸 설치 해야 할까? (1) 2025.07.12 불용어 / tqdm 파이썬 진행률 프로그래스바 (0) 2025.01.21 파이썬 설치 경로 찾기 (0) 2025.01.20