AI 개발 공부 공간

AI, 머신러닝, 딥러닝, Python & PyTorch, 실전 프로젝트

딥러닝/딥러닝: 시계열 데이터 12

심층(Stacked) & 양방향(Bidirectional) LSTM

1. 심층(Staked) LSTM1) 개요Stacked LSTM은 여러 개의 LSTM 층을 쌓아올린 심층 구조의 LSTM 모델입니다.기본적인 LSTM은 단일 층으로 이루어져 있지만, Stacked LSTM은 여러 개의 LSTM 층을 수직으로 쌓아 심층 구조를 형성합니다.각 LSTM 층의 출력이 다음 층의 입력으로 전달되며, 이를 통해 더욱 복잡하고 추상적인 특징을 학습할 수 있습니다.이는 모델이 입력 데이터를 더욱 효과적으로 처리하고, 다양한 패턴을 포착할 수 있게 해줍니다.※ Stacked LSTM의 구조Stacked LSTM의 구조는 다음과 같습니다.각 시점의 입력 데이터는 첫 번째 LSTM 층으로 전달됩니다.첫 번째 층의 출력은 두 번째 LSTM 층의 입력으로 사용되며, 이러한 방식으로 최종 LST..

시계열 교차검증 (TimeSeries Split & Sliding Window Split)

1. 시계열 교차 검증의 필요성 및 종류시계열 데이터는 시간 의존성, 계절성, 추세, 비정상성 등의 특성을 가지므로, 이러한 특성을 반영한 검증 방법이 필요합니다. 시계열 데이터에서는 시간 순서를 유지한면서 데이터를 분할하는 교차 검증 방법이 필요합니다. 이를 통해 모델이 시간 의존성, 계절성, 추세, 비정상성을 모두 반영하여 학습할 수 있습니다. 이는 모델의 예측 성능을 더 정확하게 평가하고, 실제 상황에서 더 잘 동작하는 모델을 만들기 위해 필수적입니다. ※ 시계열 교차 검증 방법의 종류1) 타임시리즈 분할 교차 검증 타임시리즈 분할 교차 검증은 초기의 작은 훈련 세트로 시작하여, 이후 각 단계마다 훈련 세트의 크기를 확장해나가는 방식입니다. 이 방법은 시간이 지남에 따라 점점 더 많은 과거 데이터를..

LSTM 종합 코드 정리

1. 모듈 임포트import numpy as npimport pandas as pdimport torchimport randomimport torch.nn as nnfrom torch.utils.data import TensorDataset, DataLoaderfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerimport matplotlib.pyplot as plt2. 함수 정의# device 설정device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 난수 시드 설정def set_seed(seed_value..

LSTM 학습과 추론, 모델 저장과 복원

1. 데이터 로드import numpy as npimport pandas as pd import random df_weather = pd.read_csv('sample_weather_data.csv')features = ['humidity','rainfall','wspeed','temperature'] df_weather = df_weather[features]print(df_weather.head())print(f"데이터 갯수 : {len(df_weather)}")2. 난수 시드 설정import torch# 난수 시드 설정def set_seed(seed_value): random.seed(seed_value) # 파이썬 난수 생성기 np.random.seed(seed_value)..

LSTM 모델 생성과 연속적 sequence 데이터 처리

1. 연속적 시퀀스 데이터  LSTM네트워크는 개별 LSTM셀들이 연결된 구조로, 시퀀스 데이터의 각 요소를 순차적으로 처리하면서 정보를 전달합니다.LSTM 네트워크는 각 시점의 입력 데이터와 이전 셀의 출력을 받아 상태를 업데이트하고, 업데이트된 상태를 다음 셀로 전달하면서 데이터의 흐름을 조절합니다. 1) 데이터 로드( 서울시 평균 기온 예측 대회 데이터)import numpy as npimport pandas as pd import random df_weather = pd.read_csv('sample_weather_data.csv')features = ['humidity','rainfall','wspeed','temperature'] print(df_weather.head())print(f"데이..

LSTM 원리와 구조 및 LSTMcell 구현

1. RNN의 기술적 한계와 LSTM의 등장1) RNN의 기술적 한계순환 신경망(RNN)은 시퀀스 데이터를 처리하는데 있어 초기 모델로서 의미 있는 진보를 이루었지만, 긴 시퀀스 데이터를 다룰 때는 몇 가지 중요한 한계점을 가지고 있습니다.이 중 장기 의존성 문제가 가장 큰 문제 중 하나입니다. 이를 확장하면 아래와 같습니다. 시퀀스가 길어짐에 따라 두 가지 측면의 문제를 발견할 수 있습니다. 1.1)출력값 범위의 제한과 정보 소실tanh 함수는 그 출력값이 -1에서 1 사이로 제한됩니다.이 함수가 연속적으로 적용되면서 결과값들이 점차 작아지는 경향이 있습니다.이는 각 단계에서 tanh 함수의 출력이 이전 단계의 출력에 곱해지기 때문입니다.이 과정에서 -1과 1 사이의 작은 값들이 반복적으로 곱해지면서,..

RNN 구현

1. 파이토치 통한 RNNcell 구현위의 이미지에서 보는 바와 같이 현재 입력 xt​ 와 이전 타임 스텝의 은닉 상태 ht−1​ 을 받아들여 새로운 은닉 상태 ht​ 를 계산하고, 이를 통해 최종 출력 Yt​ 을 생성합니다.최종 출력은 RNN 셀이 처리한 현상태의 은닉상태 정보를 기반으로 만들어진 결과로, 각 타임 스텝에서 얻어진 이 은닉상태에 추가적인 가중치를 적용하여 구체적인 출력 값을 도출합니다.이 출력은 특정 작업, 예를 들어 다음 단어 예측, 감정 분석의 결과, 또는 다음 시점의 수치 예측 등에 사용됩니다.여기서 Wx​ 와 Wh​ 는 입력과 은닉상태에 적용되는 가중치를 의미합니다.가중치는 신경망이 입력 데이터의 특성을 분석하고 이해하는 데 중요한 역할을 하는 파라미터로 행렬 형태로 표현됩니다...

RNN 원리와 구조

1. RNN 기본 이론전통적인 인공 신경망은 각 입력이 서로 독립적인 사건이라고 가정하는 상황에서 효과적으로 작동합니다.예를 들어 이미지를 분류하는 작업에서, 각 이미지는 독립적으로 처리되며 이전 이미지와의 연결성이 없습니다. 위 이미지에서 보듯이, 전통적인 머신러닝 모델은 레이블이 지정된 데이터(고양이, 개, 개구리)를 사용하여 모델을 학습시킵니다.이러한 학습된 모델은 새로운 테스트 데이터(고양이와 개의 이미지)에 대해 예측을 수행하고 각 이미지가 어떤 레이블(고양이 또는 개)에 속하는지를 결정합니다.여기서 중요한 점은, 각 이미지가 독립적으로 이루어진다는 것입니다.예를 들어, 이미지를 분류하는 작업에서 하나의 이미지가 개라고 판단하는 과정은 이전에 보았던 개의 이미지나 다른 어떤 이미지와도 무관합니다..

시계열 데이터 분석과 파생 변수 생성

1. 데이터 로드import pandas as pd import numpy as nptrain_building = pd.read_csv("building_mart87_power_processed.csv")train_building['date_time'] = pd.to_datetime(train_building['date_time'])display(train_building.head())display(f"{train_building['date_time'].min()}~ {train_building['date_time'].max()}") 2. 시간별, 요일별 평균 전력 소비량 분석import matplotlib.pyplot as pltdf = train_building.copy()# 시간별 power의 평균..

시계열 데이터 분석 및 전처리

1. 데이터 로드데이터셋을 불러오고 date_time 열을 시계열로 변환합니다. (문자열 형식의 날짜 데이터를 datetime 객체로 변환)import pandas as pd import numpy as nptrain_building_org = pd.read_csv("building_mart87_power_org.csv")train_building_org['date_time'] = pd.to_datetime(train_building_org['date_time'])display(train_building_org.head())display(f"{train_building_org['date_time'].min().date()} ~ {train_building_org['date_time'].max().date..