on
07) 시계열 데이터와 순환 신경망 - 파이썬으로 배우는 인공지능
07) 시계열 데이터와 순환 신경망 - 파이썬으로 배우는 인공지능
1 시계열 데이터의 이해
시계열 데이터 시간 축을 따라 신호가 변하는 동적 데이터
딥러닝에서는 시계열 특성을 십분 활용하는 순환 신경망 또는 LSTM을 사용한다.
시계열 데이터 예시
1.1 시계열 데이터의 특성
시계열 데이터에는 다음과 같은 독특한 특성이 있다.
요소의 순서가 중요하다
"세상에는 시계열 데이터가 참 많다"을 "데이터가 시계열 많다 참 세상에는"라는 문장으로 바꾸면 의미가 크게 훼손된다.
시간 정보가 없는 데이터는 특징의 순서를 바꿔 표현해도 일관성 있게 순서를 다루기만 한다면 아무 문제가 없다.
샘플의 길이가 다르다
'인공지능'이란 단어를 짧게 발음하는 사람도 있고 '인~공~지~능~~'으로 길게 발음하는 사람도 있다.
염기서열에서도 잡음이 섞이거나 중간에 빠지는 염기가 발생해 측정할 때마다 길이가 조금씩 다르다.
문맥 의존성이 다르다
"시계열은 앞에서 말한 바와 같이 데이터를 구성하는 요소의 순서, 즉 나타나는 순서가 중요하다는 특성이 있다"라는 문장에서 주어인 '시계열은'과 서술어인 '특성이 있다'는 밀접한 연관이 있다.
이 연관성을 문맥 의존성(context dependency)이라고 한다.
위 문장에선 주어와 서술어 사이의 단어 12개가 있는데, 이처럼 연관성이 깊은 요소가 멀리 떨어져서 나타나는 상황을 장기 문맥 의존성(long-term context dependency)이라고 한다.
계절성을 가지는 데이터가 많다
상추 판매량은 야외 바비큐에 적절한 계절에 매출이 치솟고, 수제 맥주 전문점은 금요일에 매출이 치솟는다.
미세먼지나 항공권 판매량도 계절성(seasonality)을 띤다.
시계열 데이터는 다음과 같이 정의할 수 있다.
식 1
정적 데이터와 두 가지 측면에서 다름
벡터의 길이가 가변적
벡터의 요소가 벡터
1.2 미래 예측을 위한 데이터 준비
기계학습에서는 새로운 숫자 패턴이 입력되면 어떤 숫자인지 부류하는 일도, 판매 시계열 데이터를 보고 미래의 판매량을 추정하는 일도 예측이라 부른다.
따라서 분류인지, 미래를 추정하는 일인지 문맥을 잘 보고 분간해야 한다.
시계열 패턴 하나로 미래를 예측하는 신경망을 어떻게 학습할까?
먼저 (a)와 같이 일정한 길이로 패턴을 잘라 샘플을 만든다.
이때 윈도우 크기 $w$는 이전 요소 몇개를 볼것인지 나타낸다.
위에선 $w=3$이므로 1,2,3 순간을 보고 4순간을 예측, 2,3,4순간을 보고 5순간을 예측한다.
얼마나 먼 미래를 예측할 것인지 지정하는 요인을 수평선 계수(horizon factor)라고 한다.
위처럼 2개 이상의 품목을 동시에 처리해야 하는 다중 채널인 경우도 있다.
1.3 시계열 데이터 사례 : 비트코인 가격
코인테스크(https://www.coindesk.com)에서 비트코인 데이터를 다운로드하고 확인해보자.
책에서 나온 데이터 다운방법과 현재 홈피의 구성이 바뀌어서 책에서 제공한 예제 데이터를 사용하였다.
BTC_USD_2019-02-28_2020-02-27-CoinDesk.csv 0.03MB
파일을 열어 확인해보면 다음과 같이 데이터가 구성되어 있다.
import numpy as np import pandas as pd import matplotlib.pyplot as plt #비트코인 가격 데이터 읽기 f=open("/content/BTC_USD_2019-02-28_2020-02-27-CoinDesk.csv", 'r') coindesk = pd.read_csv(f, header =0) seq= coindesk[['Closing Price (USD)']].to_numpy() print("데이터 길이:",len(seq),'
앞쪽 5개 값',seq[0:5]) #그래프 그리기 plt.plot(seq,color='red') plt.title('Bitcoin Price(1 year from 2019-02-28') plt.xlabel('Days');plt.ylabel('Price in USD') plt.show()
그래프를 보면 심한 등락이 자주 발생하는 현상을 볼 수 있다.
코드를 자세히 살펴보자.
f=open("/content/BTC_USD_2019-02-28_2020-02-27-CoinDesk.csv", 'r') coindesk = pd.read_csv(f, header =0)
파일을 오픈한다. 지정된 경로에 파일이 있어야 한다.
그 다음, 오픈한 파일에서 실제로 데이터를 읽어온다 ▶ 데이터프레임 형식의 데이터
header=0은 첫번째 행을 열 이름으로 해석하라는 지시이다.
seq= coindesk[['Closing Price (USD)']].to_numpy()
'Closing Price (USD)'열만 취해 numpy배열 형식으로 바꾸어 seq객체에 저장한다.
이제 시계열 데이터를 윈도우 단위로 잘라 샘플링한다.
#시계열 데이터를 윈도우 단위로 자르는 함수 def seq2dataset(seq, window, horizon): X=[]; Y=[] for i in range(len(seq)-(window+horizon)+1): x=seq[i:(i+window)] y=(seq[i+window+horizon-1]) X.append(x); Y.append(y) return np.array(X), np.array(Y) w=7 #window h=1 #horizon X,Y= seq2dataset(seq,w,h) print(X.shape, Y.shape) print(X[0], Y[0]); print(X[-1], Y[-1])
$w=7, h=1$으로 설정하였으므로 일주일 가격 정보를 참조해 다음날 가격 예측
seq2dataset함수는 샘플링을 수행하면서 데이터를 생성한다.
반환 결과를 보면 샘플이 358개 만들어졌음을 확인할 수 있다 (shape 함수)
데이터프레임 관련 다루는 함수들은 자주사용하는 것들을 모아 아래 게시물에 정리했다.
2 순환 신경망
시계열 데이터를 처리하는 신경망을 설계할 때는 시간에 따라 값이 하나씩 순차적으로 들어온다 는 사실을 고려해야 함.
2.1 구조와 동작, 학습 알고리즘
다층 퍼셉트론을 잘 생각해보자.
순환신경망(RNN-Recurrent Neural Network)은 다층 퍼셉트론과 한 가지만 빼고 같다.
순환 신경망에서 볼 수 있듯이 은닉층에 있는 노드끼리 에지로 연결되어 있다.
은닉층 내에서 정보를 순환하므로 순환 에지(recurrent edge)라고 한다.
순환신경망이 다층 퍼셉트론과 두드러지게 다른 점은 가중치 집합
다층 퍼셉트론
입력층과 은닉층을 연결하는 가중치 집합 $\mathbf{U}$
은닉층과 출력층을 연결하는 가중치 집합 $\mathbf{V}$
순환 신경망
은닉층과 은닉층을 연결하는 가중치 집합 $\mathbf{W}$가 추가됨
시간 정보를 어떻게 처리할까? 어떻게 순차적으로 입력할 수 있을까?
위는 순환 신경망을 펼친 그림이다.
여기는 1이라는 순간, 2라는 순간, $\cdots$, $t$라는 순간이 있다.
from http://haystar.tistory.com/38 by ccl(A) rewrite - 2021-12-27 17:00:13