ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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개의 샘플을 포함.

    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)을 효과적으로 학습하게 만듭니다.

Designed by Tistory.