News & Events
* 이 글은 medium에 작성된 Vered Shivapriya Kattad의 글을 번역하였습니다.
일반적으로 ARIMA, SARIMA 및 Holtz-winters와 같은 많은 시계열 예측 방법이 있지만 딥러닝의 등장으로 많은 사람들이 시계열 예측을 위해 LSTM을 사용하기 시작했다. 그렇다면 시계열적으로 Conv1D-LSTM/RNN이 필요한 이유는 무엇일까?
- Conv1D 레이어는 입력 시계열의 평활화를 통해 입력 피쳐에 이동 평균 또는 이동 표준 편차 값을 추가할 필요가 없다.
- LSTM은 여러 입력 변수로 문제를 모델링할 수 있다. LSTM의 입력 모양으로서 3D 입력 벡터를 제공해야 한다.
- 이는 시계열 예측에서 큰 이점을 추가하는데, 고전적인 선형 방법은 다변량 또는 다중 입력 예측 문제에 적응하기 어려울 수 있다(다변량 예측의 경우 여기서 참고 — 우리가 예측을 위해 다변량 데이터를 사용할 때는 미래를 예측하는 “미래 다변량” 입력 데이터도 필요하다는 것을 명심하자!…이러한 문제를 완화하기 위해 아래 두 가지 방법에 대해 논의한다.)
- seq2seq LSTM 모델의 여러 조합을 사용하여 시계열 예측을 할 수 있는 유연성 – 다대일 모델(이전 입력이 주어진 현재 시점에서 예측하고자 할 때 유용함), 다대다 모델(이전 입력이 주어진 여러 미래 시점들을 한 번에 예측하고자 할 때 유용함) 및 이러한 모델에 대한 몇 가지 다른 변형을 예측할 수 있다.
이 포스팅에서는 다대다 모델에 초점을 맞추고 싶다. 이 경우 우리는 두 가지 다른 방법으로 문제를 해결할 수 있다.
- 반복 예측 또는 자동 회귀 분석 방법: 이전 시점이 포함된 룩백 창을 만들어 현재 시점에서 값을 예측한 다음 예측한다. 이제 현재 예측을 창에 다시 추가하여 다음 단계 등에서 예측한다. 이 방법은 비교적 쉽지만 매 단계마다 누적 오차를 추가하며 예측이 매우 정확하지는 않다.
- 직접 예측 또는 싱글샷 예측: 이전 시점이 포함된 룩백 창을 만들어 미래의 값을 예측한다. 여기서는 “K” 단계 예측 방법을 사용한다.”K”의 값, 즉 미래에 예측하고자 하는 시간 단계 수가 미리 주어져야 한다.
K- step Forecast into the future.
핵심 아이디어와 수학 방정식은 이 연구 논문에서 따왔다. 필자는 30일 동안 글로벌 액티브 파워 값을 예측하기 위해 이 직접 예측 기법을 구현하려고 노력해왔다. 데이터 세트는 UCI 머신 러닝 리포지토리에서 가져와 여기서 액세스할 수 있다.
코딩을 시작해보자!
# Read the data
df = pd.read_csv(‘/content/sample_data/household_power_consumption.txt’,
parse_dates={‘dt’ : [‘Date’, ‘Time’]},
sep=”;”, infer_datetime_format=True,
low_memory=False, na_values=[‘nan’,’?’], index_col=’dt’)
# The first five lines of df is shown below
df.head()
# we use “dataset_train_actual” for plotting in the end.
dataset_train_actual = df.copy()
# create “dataset_train for further processing
dataset_train = df.copy()
First five lines of dataframe “df”.
2D numpy 어레이인 training_set을 생성한다.
# Select features (columns) to be involved intro training and predictions
dataset_train = dataset_train.reset_index()
cols = list(dataset_train)[1:8]
# Extract dates (will be used in visualization)
datelist_train = list(dataset_train[‘dt’])
datelist_train = [date for date in datelist_train]
training_set = dataset_train.values
입력 피쳐에 대해 두 개의 스케일러를 생성하고 예측해야 하는 대상에 대해 다른 두 개의 스케일러를 만든다. 입력 피쳐에도 “글로벌 액티브 파워” 열이 있다.
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
training_set_scaled = sc.fit_transform(training_set)
sc_predict = StandardScaler()
sc_predict.fit_transform(training_set[:, 0:1])
훈련을 위한 데이터 구조를 생성한다.
# Creating a data structure with 72 timestamps and 1 output
X_train = []
y_train = []
n_future = 30 # Number of days we want to predict into the future.
n_past = 72 # Number of past days we want to use to predict future.
for i in range(n_past, len(training_set_scaled) – n_future +1):
X_train.append(training_set_scaled[i – n_past:i,
0:dataset_train.shape[1]])
y_train.append(training_set_scaled[i+n_future-1:i+n_future, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
print(‘X_train shape == {}.’.format(X_train.shape))
print(‘y_train shape == {}.’.format(y_train.shape))
설명:
[0:72] 행의 입력 피쳐 값과 모든 입력 열의 경우 학습된 목표값은 [72+30–1:72+30] 행과 데이터의 목표 열 하나가 된다. 우리는 30개의 값을 직접 예측하기 때문에, 모든 입력 피쳐 블록에 대해(우리의 룩백 값이 72) 목표가 30 시점 앞에 있도록 우리의 모델을 학습시키고 있다.
이제 훈련을 위한 모델을 만들어 보자.
model = tf.keras.models.Sequential([
tf.keras.layers.Conv1D(filters=32, kernel_size=3,
strides=1, padding=”causal”,
activation=”relu”,
input_shape=[None, 7]),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32, return_sequences=True)),
tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(32, return_sequences=False)),
tf.keras.layers.Dense(1),
tf.keras.layers.Lambda(lambda x: x * 200)])
# lr_schedule = tf.keras.callbacks.LearningRateScheduler(
# lambda epoch: 1e-8 * 10**(epoch / 20))
optimizer = tf.keras.optimizers.SGD(lr=1e-5, momentum=0.9)
model.compile(loss=tf.keras.losses.Huber(),
optimizer=optimizer,
metrics=[“mse”])
lr_schedule를 사용하여 위의 모델을 실행하고 아래와 같이 플롯(learning_rate vs loss)을 플롯한 후 learning_rate=1e-5를 얻었다..
import matplotlib.pyplot as plt
plt.semilogx(history.history[“lr”], history.history[“loss”])
plt.axis([1e-8, 1e-4, 0, 30])
learning_rate vs loss plot.
예측하는 중이다.
# Perform predictions
predictions_future = model.predict(X_train[-n_future:])
# getting predictions for training data for plotting purpose
predictions_train = model.predict(X_train[n_past:])
y_pred_future = sc_predict.inverse_transform(predictions_future)
y_pred_train = sc_predict.inverse_transform(predictions_train)
# Construct two different dataframes for plotting.
PREDICTIONS_FUTURE = pd.DataFrame(y_pred_future, columns=[‘Global_active_power’]).set_index(pd.Series(datelist_future))
PREDICTION_TRAIN = pd.DataFrame(y_pred_train, columns=[‘Global_active_power’]).set_index(pd.Series(datelist_train[2 * n_past + n_future -1:]))
시각화 해보자.
# Set plot size
plt.rcParams[‘figure.figsize’] = 14, 5
# Plot parameters
START_DATE_FOR_PLOTTING = ‘2009-06-07’
# plot the target column in PREDICTIONS_FUTURE dataframe
plt.plot(PREDICTIONS_FUTURE.index, PREDICTIONS_FUTURE[‘Global_active_power’], color=’r’, label=’Predicted Global Active power’)
# plot the target column in PREDICTIONS_TRAIN dataframe
plt.plot(PREDICTION_TRAIN.loc[START_DATE_FOR_PLOTTING:].index, PREDICTION_TRAIN.loc[START_DATE_FOR_PLOTTING[‘Global_active_power’], color=’orange’, label=’Training predictions’)
# plot the target column in input dataframe
plt.plot(dataset_train_actual.loc[START_DATE_FOR_PLOTTING:].index, dataset_train_actual.loc[START_DATE_FOR_PLOTTING:][‘Global_active_power’], color=’b’, label=’Actual Global Active power’)
plt.axvline(x = min(PREDICTIONS_FUTURE.index), color=’green’, linewidth=2, linestyle=’–‘)
plt.grid(which=’major’, color=’#cccccc’, alpha=0.5)
plt.legend(shadow=True)
plt.title(‘Predcitions and Acutal Global Active power values’, family=’Arial’, fontsize=12)
plt.xlabel(‘Timeline’, family=’Arial’, fontsize=10)
plt.ylabel(‘Stock Price Value’, family=’Arial’, fontsize=10)
Actual and predicted values of Global Active power.
데이터 세트를 24시간 또는 하루의 빈도로 다시 샘플링했다. 데이터는 실제로 분당 하나의 데이터 포인트 주파수로 샘플링된다.
다음 Github link에서 완전한 코드를 볼 수 있다.
오늘 배운 딥러닝은 5월 29일(토)에 개설되는
[실시간 온라인/저자직강] 파이썬과 케라스를 이용한 딥러닝/강화학습 주식투자
강의를 통해 심화하여 학습할 수 있습니다.
번역 – 핀인사이트 인턴연구원 강지윤(shety0427@gmail.com)
원문 보러가기>
https://shivapriya-katta.medium.com/time-series-forecasting-using-conv1d-lstm-multiple-timesteps-into-future-acc684dcaaahttp://insightcampus.co.kr