본문 바로가기

Data-science/deep learning

[Coursera 강의] Sequences, Time Series and Prediction - 1주 차. 간단한 시계열 예측 방법 4가지 + autocorrelation (TensorFlow Developer 전문 자격증 강의)

728x90

이 자료는 Coursera 강의를 정리하여, 스스로 이해를 돕기 위해 작성한 자료입니다.

https://www.coursera.org/learn/tensorflow-sequences-time-series-and-prediction/home/welcome

 

Coursera | Online Courses & Credentials From Top Educators. Join for Free | Coursera

Learn online and earn valuable credentials from top universities like Yale, Michigan, Stanford, and leading companies like Google and IBM. Join Coursera for free and transform your career with degrees, certificates, Specializations, & MOOCs in data science

www.coursera.org

시계열 데이터가 주어졌다고 하자. 위 시계열 데이터로 미래의 데이터를 어떻게 예측할까? 

1 강에서는 머신러닝 방법이 아닌 statistical한 방법을 소개한다.

1. Naive forecasting

말그대로 Naive한 예측이다. 모든 -1 time step 상의 값을 예측값으로 하면 위 그래프처럼 나타난다.

확대해보면, 1 time step 간의 간격이 있기 때문에 두 그래프가 살짝 겹쳐져 보인다.

이때 에러값은 mse가 61.8, mae가 5.9 정도인데 이를 baseline으로 하고 아래 다른 예측 기법들의 성능도 확인해보자.

2. Moving Average

moving average는 특정 window 크기만큼 평균을 내고 그걸 전체 time step에 적용한다. 그래서 average가 moving 하는 것처럼 보이는데 아마 그래서 moving average라고 명명했는지도 모른다 (추측)

위에서 윈도우 크기를 30으로 잡아서, 30 time step 만큼의 예측값의 평균값들을 각 예측값으로 취하면 위와 같은 부드러운 주황색 곡선이 나온다. 이에 대한 error는 오히려 baseline보다 높게 나왔다. 이렇게 나온 이유는 본래 시계열 데이터의 seasonality, 주기성을 고려하지 않아서라고 보고, 다음 단계는 이를 고려한 average moving 방식으로 예측한다.

3. Moving Average of Difference

시계열 데이터에서 주기가 365일이므로 그다음 365일 만큼 오른쪽으로 이동한 데이터에서 원래 데이터를 빼면 위와 같은 차이만 남는다. 아이디어는 이 차이에 대해서만 moving average를 적용하고, 원래 데이터에 이를 더하는 것이다.

이 차이에 대해서 moving average는 주황색 선과 같다.

이 방법은 baseline보다 에러가 줄어들었다. 하지만 그래프상에 노이즈가 엄청 많아 보인다. 왜냐면, 원래 데이터 자체에 노이즈가 있는데, 거기에다가 차이의 moving average를 더했기 때문이다. 그러면 노이즈를 제거한 부드러운 곡선에다가 차이의 moving average를 더하면 이러한 노이즈가 줄어들어 오히려 결과가 더 좋게 나오지 않을까? 이 과정이 다음 단계이다.

4. Moving Average + Moving Average of Difference

윈도우 크기를 10으로 하여 moving average를 적용한 graph에, 차이에 대한 moving average를 더해주면 위 주황색 그래프가 나온다. 이 예측 값은 앞서 소개한 방법들보다 error가 훨씬 적다!

결론은, 딥러닝을 적용하기 앞서 이런 간단한 방법으로도 시계열 예측을 할 수 있다. 때론 더 잘 작동할 수도 있다!

quiz 몇가지

  • What is a trend?
    • An overall direction for data regardless of direction (trend는 시계열에선 기울기를 의미하기도 한다.)
  • In the context of time series, what is noise?
    • Unpredictable changes in time series data
  • What is autocorrelation?
    • Data that follows a predictable shape, even if the scale is different  (스케일이 다르더라도 예측가능한 형태를 따른다. )

auto correlation?

위키피디아

Autocorrelation, also known as serial correlation, is the correlation of a signal with a delayed copy of itself as a function of delay. Informally, it is the similarity between observations as a function of the time lag between them. The analysis of autocorrelation is a mathematical tool for finding repeating patterns, such as the presence of a periodic signal obscured by noise, or identifying the missing fundamental frequency in a signal implied by its harmonic frequencies. It is often used in signal processing for analyzing functions or series of values, such as time domain signals.

Different fields of study define autocorrelation differently, and not all of these definitions are equivalent. In some fields, the term is used interchangeably with autocovariance.

Unit root processes, trend-stationary processes, autoregressive processes, and moving average processes are specific forms of processes with autocorrelation.

그림을 보면 autocorrelation의 경우 f*f, g*g 즉 자기 자신과의 상관계수를 계산하는 방식임을 알 수 있다. x축에서 자기 자신의 모양과 가장 많이 겹칠때 autocorrelation의 값이 가장 높아진다. 

https://en.wikipedia.org/wiki/Autocorrelation

 

Autocorrelation - Wikipedia

From Wikipedia, the free encyclopedia Jump to navigation Jump to search correlation of a signal with a time-shifted copy of itself, as a function of shift Above: A plot of a series of 100 random numbers concealing a sine function. Below: The sine function

en.wikipedia.org

의문점

moving_avg + moving_avg_diff를 할 때

  • split_time-365-window_size:-365를 하지 않고 

  • split_time-370:-360을 하는 걸까??

내가 생각하는 답

  • moving_average_forecast함수의 출력은 [t_0, t_0 + window_size] 구간 만큼의 평균값을 처음 값으로 하고, [t_n - window_size, t_n] 구간 만큼의 평균값을 마지막 값으로 가진다.

  • 이 말은, t_0 출력값의 경우 미래의 window_size크기 만큼의 값만 평균으로 고려된다는 것이다.

  • 좌우의 패턴이 달라질 수 있으므로 이전(과거)과 이후(미래)의 값을 모두 반영하려면 t_0 시점의 평균값은 [t_0 - window_size // 2,  t_0 + window_size // 2]으로 해야한다.

  • split_time-370:-360이 moving_average 함수를 통해 나온 출력의 마지막 값은 [-370, -360]의 평균값을 가진다. 이 중간에 -365가 있다. 즉 이 구간이 -365 시점의 평균을 가장 잘 반영한다고 볼 수 있다. 

  • 그러므로 -365를 기준으로 window_size//2를 +_ 한 구간이 적절한 moving_average 산출 구간이 된다고 유추할 수 있다.
  • 가령 window_size가 8이면, -365기준으로 [split_time-365-4, -365+4]가 적절한 값이 된다.이렇게 할 경우, 에러가 더 작아진다.