Chapter 5에서는
* feature engineering time series data의 이론적 근거와 목표
* basic date-time 기반으로 input feature을 개발하는 방법
* 더 정교한 지연(lag) 및 sliding window 요약 통계 기능을 개발하는 방법에 대해 배운다.
Feature Engineering for Time Series
* Time Series dataset은 supervised learning problem으로 변환되어야한다.
time | 1 | value | 1 |
time | 2 | value | 2 |
time | 3 | value | 3 |
input | 1 | output | 1 |
input | 2 | output | 2 |
input | 3 | output | 3 |
* 처음 표와 같이 표기된 Time Series는 두번 째 표처럼 변환해야 Supervised learning algorithm으로 train이 가능해진다.
* input은 머신 러닝에서 feature라고 한다.
* 우리가 원하는 것은 input과 output의 관계를 모델링 하는 것, 우리는 아래 3가지의 클래스를 배운다.
* 1. Date Time Features : 각 관찰에 대한 시간 단계 자체의 구성 요소
* 2. Lag Features : 이전 시간 단계의 값
* 3. Window Features : 이전 시간 단계의 window에 대한 값
Goal of Feature Engineering
* Feature Engineering의 목표 : Supervised Learning Algorithm이 모델링 할 수 있도록 새로운 input feature와 output 간의 이상적인 관계를 제공하는 것 (함수를 만드는 것)
* Time Series의 경우 input,output의 개념이 없다. 우리는 이것을 변환하여 Supervised Learning을 해야한다.
* 우리는 input, output간의 관계를 모르기에 머신러닝이 필요하고 만약 이를 안다면 필요 없을 것이다.
* 명확성을 위해 일변량 Time Series dataset을 사용하겠지만 이는 다변량 Time Series dataset에도 적용할 수 있다.
Mininum Daily Temperatures Dataset
* 호주 멜버린에서 10년 동안의 일일 최저 기온에 대한 정보가 담긴 dataset을 사용할 것이다.
* https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-min-temperatures.csv
Date Time Features
* Pandas를 사용하여 수업을 수행, Pandas Series로 Time Serise load > 변환된 dataset에 대한 pandas Dataframe생성 > 각 열에 하나씩 index 추가 > 상위 5개의 data 출력
# create date time features of a dataset
from pandas import read_csv
from pandas import DataFrame
series = read_csv('daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
dataframe = DataFrame()
dataframe['month'] = [series.index[i].month for i in range(len(series))]
dataframe['day'] = [series.index[i].day for i in range(len(series))]
dataframe['temperature'] = [series[i] for i in range(len(series))]
print(dataframe.head(5))
month day temperature
0 1 1 20.7
1 1 2 17.9
2 1 3 18.8
3 1 4 14.6
4 1 5 15.8
Lag Feature
* Lag Feature은 Time Series problem을 Supervised learning problem으로 변환하는 고전적인 방법
* 현재 시간 (t)가 주어지면 다음 시간 (t+1)에 값을 예측하는 것
* shift() 함수를 사용하면 dataset이 한 칸씩 이동 되며, t행에 nan값이 추가된다.
# create a lag feature
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
series = read_csv('daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
temps = DataFrame(series.values)
dataframe = concat([temps.shift(1), temps], axis=1)
dataframe.columns = ['t', 't+1']
print(dataframe.head(5))
t t+1
0 NaN 20.7
1 20.7 17.9
2 17.9 18.8
3 18.8 14.6
4 14.6 15.8
* concat()함수는 temp.shift(1)과 temps를 합칩니다. 기본적으로는 row로 합치지만, axis=1을 주어 column결합이다.
* 매칭되는 key가 없으면 nan으로 표시한다.
* 위의 방법은 sliding window에서 window size=1인 형태이다.
* 또한 학습단계에서는 nan에 대한 것은 삭제해야된다. (충분한 데이터가 포함되어 있지 않기 때문에)
# create lag features
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
series = read_csv('daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
temps = DataFrame(series.values)
dataframe = concat([temps.shift(3), temps.shift(2), temps.shift(1), temps], axis=1)
dataframe.columns = ['t-2', 't-1', 't', 't+1']
print(dataframe.head(5))
t-2 t-1 t t+1
0 NaN NaN NaN 20.7
1 NaN NaN 20.7 17.9
2 NaN 20.7 17.9 18.8
3 20.7 17.9 18.8 14.6
4 17.9 18.8 14.6 15.8
* 위는 window size=3인 형태이다.
* window size를 확장하는 것은 더 많은 feature를 포함시킬 수 있다.
* sliding window 접근 방식에서 window size를 설정하는 것에 어려움을 겪을 수 있다. 이는 window size를 바꿔가며 어떤 모델이 좋은 것인지 확인해야된다.
+Sliding Window Algorithm
* 알고리즘 설명 : n개의 원소를 갖는 배열과 w의 넓이를 갖는 창문이 있다고 생각 (n과 w는 고정된 상수)
ex) 8개의 원소를 갖는 배열과 3의 넓이를 갖는 창문의 형태
7 | 2 | 4 | 1 | 6 | 5 | 8 | 3 |
* 창문을 왼쪽부터 시작하여 한 칸씩 오른쪽으로 이동
* 3의 넓이를 갖는 창문일 경우 한 칸식 이동할 때 (3-1)의 값은 다시 사용, 따라서 창문을 옮길 때 3개를 전부 다시 사용하지 않고 이전의 결과를 쓰는 방향으로 접근 (여기서는 7,2,4 다음으로는 2,4,1인데 2,4가 중복이므로 다시 사용)
* 기존에는 모든 창문 위치마다 O(W)의 시간 복잡도를 가지고 이가 N개이므로 O(NW)의 시간 복잡도를 가지지만 sliding window의 형태일 경우 맨 처음 창문에 대해서만 O(W)이고 이후는 O(1)이므로 결국 전체 시간 복잡도는 O(N)
Rolling Window Statistics
* sliding window의 값에 대한 요약 통계를 계산하고 dataset의 feature로 포함할 수 있다. 이것은 Rolling mean이라는 것으로 유용하게 수행할 수 있다.
* DataFrame에 rolling()이라는 내장함수가 있고 window 값에 따라 그 크기의 mean을 저장
* 예를 들어 이전 두 값의 평균을 계산하고 이를 사용하여 다음 값을 예측
# create a rolling mean feature
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
series = read_csv('daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
temps = DataFrame(series.values)
shifted = temps.shift(1)
window = shifted.rolling(window=2)
means = window.mean()
dataframe = concat([means, temps], axis=1)
dataframe.columns = ['mean(t-1,t)', 't+1']
print(dataframe.head(5))
mean(t-1,t) t+1
0 NaN 20.7
1 NaN 17.9
2 19.30 18.8
3 18.35 14.6
4 16.70 15.8
* 이 예시에서는 온도 data를 concat함수로 이전 두 값의 평균 data와 이후 data를 결합한다.
* 따라서 첫 번재와 두 번째의 행은 사용할 수 없음을 알 수 있다 ( 첫 번째는 shift에 의해 nan, 두 번째는 두 개의 평균을 아직 못 구하기 때문에 nan)
* 세 번째 줄은 t+1의 값을 예측하기 위해 사용된 기대 값(mean(t-1,t))들을 볼 수 있다.
# create rolling statistics features
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
series = read_csv('daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
temps = DataFrame(series.values)
width = 3
shifted = temps.shift(width - 1)
window = shifted.rolling(window=width)
dataframe = concat([window.min(), window.mean(), window.max(), temps], axis=1)
dataframe.columns = ['min', 'mean', 'max', 't+1']
print(dataframe.head(5))
min mean max t+1
0 NaN NaN NaN 20.7
1 NaN NaN NaN 17.9
2 NaN NaN NaN 18.8
3 NaN NaN NaN 14.6
4 17.9 19.133333 20.7 15.8
* 위는 feature가 많아진(min,mean,max) 형태의 예시이다.
* feature가 많아짐에 따라 사용하지 못하는 행이 많아진다. 하지만 위의 예시에서는 5번째 행(4행)에서 의미있는 값들을 한 번에 볼 수 있다는 장점이 있다.
Expanding Window Statistics
* widow의 유용한 다른 type에는 series의 모든 이전 data를 포함한다. 이것은 Expanding Window라고 한다.
* DataFrame의 rolling()함수와 마찬가지로 expanding()함수가 제공된다.
# create expanding window features
from pandas import read_csv
from pandas import DataFrame
from pandas import concat
series = read_csv('daily-minimum-temperatures.csv', header=0, index_col=0,
parse_dates=True, squeeze=True)
temps = DataFrame(series.values)
window = temps.expanding()
dataframe = concat([window.min(), window.mean(), window.max(), temps.shift(-1)], axis=1)
dataframe.columns = ['min', 'mean', 'max', 't+1']
print(dataframe.head(5))
min mean max t+1
0 20.7 20.700000 20.7 17.9
1 17.9 19.300000 20.7 18.8
2 17.9 19.133333 20.7 14.6
3 14.6 18.000000 20.7 15.8
4 14.6 17.560000 20.7 15.8
* expanding()함수는 rolling()함수와 다르게 누적평균을 계산한다.
'Study > time series forecasting with python' 카테고리의 다른 글
Chapter 7. Resampling and Interpolation (0) | 2021.06.14 |
---|---|
Chapter 6. Data Visualization (0) | 2021.05.27 |
Chapter 4. Load and Explore Time Series Data (0) | 2021.05.19 |
Chapter 3. Time Series as Supervised Learning (0) | 2021.05.13 |
Chapter 2. What is Time Series Forecasting? (0) | 2021.05.13 |