이 튜토리얼에서는 TensorFlow를 사용한 시계열 예측을 소개합니다. Convolutional/Recurrent Neural Network(CNN 및 RNN)를 포함하여 몇 가지 다른 스타일의 모델을 빌드합니다. Show 이 내용은 각각 하위 항목이 있는 두 부분으로 나누어 생각합니다.
설정
날씨 데이터세트이 튜토리얼은 막스 플랑크 생물 지구화학 연구소에서 기록한 날씨 시계열 데이터세트를 사용합니다. 이 데이터세트에는 온도, 대기압 및 습도와 같은 14가지 특성이 있습니다. 이러한 데이터는 2003년부터 시작해 10분 간격으로 수집되었습니다. 효율성을 위해 2009년과 2016년 사이에 수집된 데이터만 사용하겠습니다. 이 데이터세트 부분은 François Chollet이 자신이 저술한 책 Deep Learning with Python을 위해 준비했습니다.
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip 13574144/13568290 [==============================] - 0s 0us/step 이 튜토리얼은 시간별 예측만 다루므로 10분 간격부터 1시간까지 데이터를 서브 샘플링하는 것으로 시작합니다.
데이터를 살펴보겠습니다. 다음은 처음 몇 개의 행입니다.
시간이 지남에 따라 몇 가지 특성이 전개됩니다.
검사 및 정리하기다음으로 데이터세트의 통계를 살펴봅니다.
풍속한 가지 주목할 점은 풍속의
0.0 특성 엔지니어링모델을 본격적으로 빌드하기 전에 데이터를 이해하고 모델에 적절한 형식의 데이터를 전달하는 것이 중요합니다. 바람데이터의 마지막 열인 현재, 바람 데이터의 분포는 다음과 같습니다.
Text(0, 0.5, 'Wind Velocity [m/s]') 그러나 풍향과 속도 열을 바람 벡터로 변환하면 모델이 해석하기가 더 쉽습니다.
바람 벡터의 분포는 모델이 올바르게 해석하기에 훨씬 더 간단합니다.
(-11.305513973134667, 8.24469928549079, -8.27438540335515, 7.7338312955467785) 시간마찬가지로
풍향과 유사하게 초 단위의 시간은 유용한 모델 입력이 아닙니다. 날씨 데이터이므로 하루 및 연 단위의 주기성이 명확합니다. 주기성을 처리할 수 있는 방법에는 여러 가지가 있습니다. 사용 가능한 신호로 변환하는 간단한 방법은
Text(0.5, 1.0, 'Time of day signal') 그러면 모델이 가장 중요한 빈도 특성에 액세스할 수 있습니다. 이 경우 어떤 빈도가 중요한지 미리 알고 있었습니다. 모르는 경우
데이터 분할훈련, 검증 및 테스트 세트에
데이터 정규화신경망을 훈련하기 전에 특성의 크기를 정하는 것이 중요합니다. 정규화는 이 크기 조정을 수행하는 일반적인 방법입니다. 평균을 빼고 각 특성의 표준 편차로 나눕니다. 모델이 검증 및 테스트 세트의 값에 액세스할 수 없도록 훈련 데이터를 사용해서만 평균 및 표준 편차를 계산해야 합니다. 또한 모델이 훈련할 때 훈련 세트의 미래 값에 액세스할 수 없어야 하고 이 정규화가 이동 평균을 사용하여 수행되어야 한다고 말할 수도 있습니다. 이 내용은 본 튜토리얼의 중점 사항이 아니며, 검증 및 테스트 세트가 있기 때문에 (다소) 정직한 메트릭을 얻을 수 있습니다. 따라서 단순화를 위해 이 튜토리얼에서는 단순 평균을 사용합니다.
이제 특성의 분포를 살펴봅니다. 일부 특성은 꼬리가 길지만
데이터 창 작업이 튜토리얼의 모델은 데이터의 연속된 샘플 창을 기반으로 일련의 예측을 수행합니다. 입력 창의 주요 특성은 다음과 같습니다.
이 튜토리얼은 다양한 모델(선형, DNN, CNN 및 RNN 모델 포함)을 빌드하고 다음 두 가지 목적으로 이 모델을 사용합니다.
이 섹션에서는 모든 모델에 재사용할 수 있도록 데이터 창 작업을 구현하는 부분에 중점을 둡니다. 작업 및 모델 유형에 따라 다양한 데이터 창을 생성할 수 있습니다. 다음은 몇 가지 예입니다.
이 섹션의 나머지 부분에서는
1. 인덱스 및 오프셋우선 또한 train, eval 및 test 데이터 프레임을 입력으로 사용합니다. 이러한 데이터 프레임은 나중에 창의
이 섹션의 시작 부분에서 다이어그램에 나타낸 두 개의 창을 만드는 코드는 다음과 같습니다.
Total window size: 48 Input indices: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] Label indices: [47] Label column name(s): ['T (degC)']
Total window size: 7 Input indices: [0 1 2 3 4 5] Label indices: [6] Label column name(s): ['T (degC)'] 2. 분할연속적인
입력 목록이 주어지면 위의 예제 이 다이어그램에는 데이터의
다음을 사용해 보세요.
All shapes are: (batch, time, features) Window shape: (3, 7, 19) Inputs shape: (3, 6, 19) labels shape: (3, 1, 1) 일반적으로 TensorFlow의 데이터는 가장 바깥 쪽 인덱스가 여러 예제("배치" 차원)에 걸쳐 있는 배열로 구성됩니다. 중간 인덱스는 "시간" 또는 "공간"(너비, 높이) 차원입니다. 가장 안쪽 인덱스는 특성입니다. 위의 코드는 두 배치의 7-타임스텝 창을 사용하며 각 타임스텝에는 19개의 특성이 있습니다. 그러면 이것을 한 배치의 6-타임스텝과 19개의 특성 입력 및 1-타임스텝 1-특성 레이블로 분할합니다. 레이블에는 하나의 특성만 있는데, 3. 플롯하기다음은 분할 창을 간단하게 시각화할 수 있는 플롯 메서드입니다.
이 플롯은 항목이 참조하는 시간을 기준으로 입력, 레이블 및 (나중에) 예측값을 정렬합니다.
다른 열을 플롯할 수 있지만 예제 창
4. tf.data.Dataset 만들기마지막으로, 이
이제
(TensorSpec(shape=(None, 6, 19), dtype=tf.float32, name=None), TensorSpec(shape=(None, 1, 1), dtype=tf.float32, name=None))
Inputs shape (batch, time, features): (32, 6, 19) Labels shape (batch, time, features): (32, 1, 1) 단일 스텝 모델이러한 종류의 데이터를 기반으로 빌드할 수 있는 가장 간단한 모델은 현재 조건에만 기초하여 미래로 1 타임스텝(1시간) 진행된 단일 특성 값을 예측하는 모델입니다. 따라서 1시간 미래의 다음과 같은 단일 스텝
Total window size: 2 Input indices: [0] Label indices: [1] Label column name(s): ['T (degC)']
Inputs shape (batch, time, features): (32, 1, 19) Labels shape (batch, time, features): (32, 1, 1) 기준훈련 가능한 모델을 빌드하기 전에 나중에 더 복잡한 모델과 비교하기 위한 포인트로 성능 기준을 갖는 것이 좋습니다. 첫 번째 작업은 모든 특성의 현재 값을 고려하여 1시간 미래의 온도를 예측하는 것입니다. 현재 값에는 현재 온도가 포함됩니다. 따라서 예측으로 현재 온도를 반환하여 "변화 없음"을 예측하는 모델로 시작하겠습니다. 온도는 천천히 변하기 때문에 이것은 합리적인 기준입니다. 물론, 더 미래로 들어가면 이 기준의 예측 효과는 떨어질 것입니다.
이 모델을 인스턴스화하고 평가합니다.
439/439 [==============================] - 1s 2ms/step - loss: 0.0128 - mean_absolute_error: 0.0785 몇 가지 성능 메트릭을 출력했지만 모델이 얼마나 잘 동작하는지에 대한 느낌은 주지 않습니다.
Total window size: 25 Input indices: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] Label indices: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24] Label column name(s): ['T (degC)'] 이 확장된 창은 어떠한 코드 변경 없이 동일한
Input shape: (32, 1, 19) Output shape: (32, 1, 1) 기준 모델의 예측값을 플롯하면 1시간씩 오른쪽으로 이동한 단순한 레이블임을 알 수 있습니다.
위의 세 가지 예제 플롯에서 단일 스텝 모델은 24시간 동안 실행됩니다. 이에 관해 몇 가지 설명이 필요합니다.
선형 모델이 작업에 적용할 수 있는 가장 간단한 훈련 가능한 모델은 입력과 출력 사이에 선형 변환을 삽입하는 것입니다. 이 경우 타임스텝의 출력은 해당 스텝에만 의존합니다.
Input shape: (32, 1, 19) Output shape: (32, 1, 1) 이 튜토리얼은 많은 모델을 훈련하므로 훈련 절차를 하나의 함수 패키지로 만듭니다.
모델을 훈련하고 성능을 평가합니다.
Epoch 1/20 1534/1534 [==============================] - 5s 4ms/step - loss: 0.2465 - mean_absolute_error: 0.2807 - val_loss: 0.0103 - val_mean_absolute_error: 0.0754 Epoch 2/20 1534/1534 [==============================] - 5s 3ms/step - loss: 0.0097 - mean_absolute_error: 0.0721 - val_loss: 0.0090 - val_mean_absolute_error: 0.0701 Epoch 3/20 1534/1534 [==============================] - 5s 3ms/step - loss: 0.0092 - mean_absolute_error: 0.0701 - val_loss: 0.0089 - val_mean_absolute_error: 0.0698 Epoch 4/20 1534/1534 [==============================] - 5s 3ms/step - loss: 0.0092 - mean_absolute_error: 0.0701 - val_loss: 0.0088 - val_mean_absolute_error: 0.0692 Epoch 5/20 1534/1534 [==============================] - 5s 3ms/step - loss: 0.0091 - mean_absolute_error: 0.0700 - val_loss: 0.0091 - val_mean_absolute_error: 0.0707 Epoch 6/20 1534/1534 [==============================] - 5s 3ms/step - loss: 0.0092 - mean_absolute_error: 0.0700 - val_loss: 0.0089 - val_mean_absolute_error: 0.0693 439/439 [==============================] - 1s 2ms/step - loss: 0.0089 - mean_absolute_error: 0.0693
Input shape: (32, 24, 19) Output shape: (32, 24, 1) 다음은
선형 모델의 한 가지 장점은 해석하기가 상대적으로 간단하다는 것입니다. 레이어의 가중치를 가져와 각 입력에 할당된 가중치를 볼 수 있습니다.
때로 모델은 입력 밀집실제로 여러 타임스텝에서 동작하는 모델을 적용하기 전에 더 깊고 강력한 단일 입력 스텝 모델의 성능을 확인하는 것이 좋습니다. 다음 모델은 입력과 출력 사이에 몇 개의
Epoch 1/20 1534/1534 [==============================] - 7s 4ms/step - loss: 0.0119 - mean_absolute_error: 0.0754 - val_loss: 0.0076 - val_mean_absolute_error: 0.0631 Epoch 2/20 1534/1534 [==============================] - 8s 5ms/step - loss: 0.0077 - mean_absolute_error: 0.0633 - val_loss: 0.0070 - val_mean_absolute_error: 0.0603 Epoch 3/20 1534/1534 [==============================] - 6s 4ms/step - loss: 0.0074 - mean_absolute_error: 0.0619 - val_loss: 0.0071 - val_mean_absolute_error: 0.0605 Epoch 4/20 1534/1534 [==============================] - 6s 4ms/step - loss: 0.0071 - mean_absolute_error: 0.0602 - val_loss: 0.0069 - val_mean_absolute_error: 0.0603 Epoch 5/20 1534/1534 [==============================] - 6s 4ms/step - loss: 0.0069 - mean_absolute_error: 0.0592 - val_loss: 0.0069 - val_mean_absolute_error: 0.0600 Epoch 6/20 1534/1534 [==============================] - 6s 4ms/step - loss: 0.0069 - mean_absolute_error: 0.0591 - val_loss: 0.0073 - val_mean_absolute_error: 0.0622 439/439 [==============================] - 1s 3ms/step - loss: 0.0073 - mean_absolute_error: 0.0622 다중 스텝 밀집단일 타임스텝 모델에는 입력의 현재 값에 대한 컨텍스트가 없습니다. 시간에 따라 입력 특성이 어떻게 변하는지 볼 수 없습니다. 이 문제를 해결하려면 모델이 예측을 수행할 때 여러 타임스텝에 액세스해야 합니다.
3시간의 입력과 1시간의 레이블 배치를 생성하는
Total window size: 4 Input indices: [0 1 2] Label indices: [3] Label column name(s): ['T (degC)']
Text(0.5, 1.0, 'Given 3h as input, predict 1h into the future.')
Input shape: (32, 3, 19) Output shape: (32, 1, 1)
438/438 [==============================] - 1s 2ms/step - loss: 0.0062 - mean_absolute_error: 0.0555
이 접근법의 주된 단점은 결과적인 모델이 정확히 이 형상의 입력 창에서만 실행될 수 있다는 것입니다.
Input shape: (32, 24, 19) InvalidArgumentError:Matrix size-incompatible: In[0]: [32,456], In[1]: [57,32] [Op:MatMul] 다음 섹션의 컨볼루셔널 모델은 이 문제를 해결합니다. 컨볼루션 신경망컨볼루션 레이어( 다음은 컨볼루션으로 다시 작성한 다음 변경 사항에 주목하세요.
예제 배치에서 실행하여 모델이 예상된 형상으로 출력을 생성하는지 확인합니다.
Conv model on `conv_window` Input shape: (32, 3, 19) Output shape: (32, 1, 1)
438/438 [==============================] - 1s 3ms/step - loss: 0.0065 - mean_absolute_error: 0.0571 이 더 넓은 입력에서 실행하면 더 넓은 출력이 생성됩니다.
Wide window Input shape: (32, 24, 19) Labels shape: (32, 24, 1) Output shape: (32, 22, 1) 출력은 입력보다 짧습니다. 훈련 또는 플롯 작업을 수행하려면 레이블과 예상의 길이가 동일해야 합니다. 따라서 레이블과 예측 길이가 일치하도록 몇 개의 추가 입력 타임스텝으로 넓은 창을 생성하는
Total window size: 27 Input indices: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25] Label indices: [ 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26] Label column name(s): ['T (degC)']
Wide conv window Input shape: (32, 26, 19) Labels shape: (32, 24, 1) Output shape: (32, 24, 1) 이제 더 넓은 창에 모델의 예측값을 플롯할 수 있습니다. 첫 번째 예측 전 3개의 입력 타임스텝에 주목하세요. 여기서 모든 예측은 이전 3개의 타임스텝에 기초합니다.
순환 신경망Recurrent Neural Network(RNN)는 시계열 데이터에 적합한 신경망 유형입니다. RNN은 시계열을 단계별로 처리하여 타임스텝 사이에서 내부 상태를 유지합니다. 자세한 내용은 텍스트 생성 튜토리얼 또는 RNN 가이드를 읽어보세요. 이 튜토리얼에서는 Long Short Term Memory(LSTM)이라는 RNN 레이어를 사용합니다. 모든 keras
RNN 레이어에 대한 중요한 생성자 인수는
참고: 이 경우에는 모델 성능의 관점에서 기대할 것이 없습니다. 첫 번째 타임스텝에서 모델이 이전 스텝에 액세스할 수 없으므로 이전에 표시한 단순한
Input shape: (32, 24, 19) Output shape: (32, 24, 1)
438/438 [==============================] - 1s 3ms/step - loss: 0.0056 - mean_absolute_error: 0.0513
성능이 데이터세트를 사용하면 일반적으로 각 모델의 성능이 이전 모델보다 약간 더 좋습니다.
Baseline : 0.0852 Linear : 0.0685 Dense : 0.0623 Multi step dense: 0.0553 Conv : 0.0552 LSTM : 0.0520 다중 출력 모델지금까지 모델은 모두 단일 타임스텝에 대해 단일 출력 특성 이러한 모든 모델은
간단히 출력 레이어의 단위 수를 변경하고
Inputs shape (batch, time, features): (32, 24, 19) Labels shape (batch, time, features): (32, 24, 19) 레이블의 기준여기서는 동일한 기준 모델을 사용할 수 있지만 이번에는 특정
438/438 [==============================] - 1s 2ms/step - loss: 0.0886 - mean_absolute_error: 0.1589 밀집
439/439 [==============================] - 1s 3ms/step - loss: 0.0694 - mean_absolute_error: 0.1345 RNN
438/438 [==============================] - 1s 3ms/step - loss: 0.0618 - mean_absolute_error: 0.1205 CPU times: user 3min 26s, sys: 52.4 s, total: 4min 18s Wall time: 1min 35s 고급: 잔여 연결이전의 신중한 초기화로 이 문제를 해결할 수 있지만 모델 구조로 빌드하는 것이 더 간단합니다. 시계열 분석에서는 다음 값을 예측하는 대신 다음 타임스텝에서 값이 어떻게 달라지는 지를 예측하는 모델을 빌드하는 것이 일반적입니다. 마찬가지로 딥러닝에서 "잔여 네트워크(Residual networks)" 또는 "ResNets"는 각 레이어가 모델의 누적 결과에 추가되는 아키텍처를 나타냅니다. 이것은 변화가 작아야 한다는 사실을 이용하는 방법입니다. 기본적으로,
이 접근 방식은 이 튜토리얼에서 설명하는 모든 모델과 연계하여 사용할 수 있습니다. 여기서는 LSTM 모델에 적용합니다.
438/438 [==============================] - 1s 3ms/step - loss: 0.0620 - mean_absolute_error: 0.1181 CPU times: user 1min 53s, sys: 28.1 s, total: 2min 22s Wall time: 52.8 s 성능다음은 이러한 다중 출력 모델의 전반적인 성능입니다.
Baseline : 0.1638 Dense : 0.1355 LSTM : 0.1216 Residual LSTM : 0.1194 위의 성능은 모든 모델 출력에 대한 평균입니다. 다중 스텝 모델이전 섹션의 단일 출력 및 다중 출력 모델은 모두 미래 1시간의 단일 타임스텝 예측을 수행했습니다. 이 섹션에서는 이러한 모델을 확장하여 다중 타임스텝 예측을 수행하는 방법을 살펴봅니다. 다중 스텝 예측에서 모델은 일정 범위의 미래 값을 예측하는 방법을 학습해야 합니다. 따라서 한 미래 시점만 예측하는 단일 스텝 모델과 달리 다중 스텝 모델은 미래 값의 시퀀스를 예측합니다. 대략적으로 두 가지 접근 방식이 있습니다.
이 섹션에서는 모든 모델이 모든 출력 타임스텝에 걸쳐 모든 특성을 예측합니다. 다중 스텝 모델의 경우, 훈련 데이터는 다시 시간별 샘플로 구성됩니다. 그러나 여기에서 모델은 과거의 24시간을 고려하여 미래 24시간을 예측하는 방법을 학습합니다. 다음은 데이터세트로부터 이러한 조각을 생성하는
Total window size: 48 Input indices: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23] Label indices: [24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47] Label column name(s): None 기준이 작업의 간단한 기준은 필요한 출력 타임스텝 수에 대해 마지막 입력 타임스텝을 반복하는 것입니다.
437/437 [==============================] - 1s 2ms/step - loss: 0.6285 - mean_absolute_error: 0.5007 이 작업은 24시간이 주어졌을 때 24시간을 예측하는 것이므로 또 다른 간단한 접근 방법은 내일도 비슷하다는 가정 하에 전날을 반복하는 것입니다.
437/437 [==============================] - 1s 2ms/step - loss: 0.4270 - mean_absolute_error: 0.3959 싱글샷 모델이 문제에 대한 한 가지 높은 수준의 접근 방법은 모델이 한 번에 전체 시퀀스 예측을 수행하는 "싱글샷" 모델을 사용하는 것입니다. 이 모델은 선형마지막 입력 타임스텝을 기반으로 하는 단순한 선형 모델은 기준 모델보다 성능이 더 좋지만 강력하지 못합니다. 이 모델은 선형 프로젝션을 이용해 단일 입력 타임스텝으로부터
437/437 [==============================] - 1s 2ms/step - loss: 0.2563 - mean_absolute_error: 0.3057 밀집입력과 출력 사이에
437/437 [==============================] - 1s 3ms/step - loss: 0.2185 - mean_absolute_error: 0.2808 CNN컨볼루션 모델은 고정 너비 기록을 기반으로 예측을 수행하므로 시간에 따라 상황이 어떻게 변하는지 볼 수 있어 밀집 모델보다 성능을 높일 수 있습니다.
437/437 [==============================] - 1s 3ms/step - loss: 0.2168 - mean_absolute_error: 0.2840 RNN반복 모델은 모델이 수행하는 예측과 관련이 있는 경우 긴 입력 기록을 사용하는 방법을 학습할 수 있습니다. 여기서 모델은 다음 24시간에 대한 단일 예측을 수행하기 전에 24시간 동안 내부 상태를 축적합니다. 이
싱글샷 형식에서 LSTM은 마지막 타임스텝에서만 출력을 생성하면 되므로
437/437 [==============================] - 1s 3ms/step - loss: 0.2150 - mean_absolute_error: 0.2858 고급: 자기 회귀 모델위의 모델은 모두 한 번에 전체 출력 시퀀스를 예측합니다. 경우에 따라 모델이 이 예측을 여러 타임스텝으로 분해하는 것이 도움이 될 수 있습니다. 그러면 이전의 RNN(Recurrent Neural Networks)을 이용한 시퀀스 생성에서와 같이 각 모델의 출력을 각 스텝에서 자체 피드백할 수 있어 이전 예측을 조건부로 예측을 수행할 수 있습니다. 이 형태의 모델이 갖는 한 가지 분명한 장점은 다양한 길이의 출력을 생성하도록 설정할 수 있다는 것입니다. 이 튜토리얼의 전반부에서 훈련한 단일 스텝 다중 출력 모델 중 하나를 가져와 자기 회귀 피드백 루프에서 실행할 수 있지만 여기서는 이를 수행하도록 명시적으로 훈련된 모델을 빌드하는 데 중점을 둘 것입니다. RNN이 튜토리얼에서는 자기 회귀 RNN 모델만 빌드하지만 이 패턴은 단일 타임스텝을 출력하도록 설계된 모든 모델에 적용할 수 있습니다. 이 모델은 단일 스텝
이 경우 모델은 각 스텝에 대한 입력을 수동으로 관리해야 하므로 더 낮은 수준의 단일 타임스텝 인터페이스에 대해
이 모델에 필요한 첫 번째 메서드는 입력을 기반으로 내부 상태를 초기화하는
이 메서드는 단일 타임스텝 예측과 LSTM의 내부 상태를 반환합니다.
TensorShape([32, 19])
출력 예측을 수집하는
가장 간단한 방법은 Python 목록을 사용하고 루프 후에 참고: 이와 같이 Python 목록을 쌓는 것은 훈련을 위해
예제 입력에서 이 모델을 테스트 실행합니다.
Output shape (batch, time, features): (32, 24, 19) 이제 모델을 훈련합니다.
437/437 [==============================] - 3s 7ms/step - loss: 0.2302 - mean_absolute_error: 0.3062 성능이 문제에 대해 모델 복잡성이 증가함에 따라 분명히 이득이 감소합니다.
이 튜토리얼의 전반부에서 소개한 다중 출력 모델에 대한 메트릭은 모든 출력 특성에 평균화된 성능을 보여줍니다. 이러한 성능은 유사하지만 출력 타임스텝에서도 평균화됩니다.
Last : 0.5007 Repeat : 0.3774 Linear : 0.2986 Dense : 0.2771 Conv : 0.2749 LSTM : 0.2773 AR LSTM : 0.2990 밀집 모델에서 컨볼루션 및 반복 모델로 이동하여 얻은 이득은 몇 퍼센트(있다고 하더라도)에 불과하며 자기 회귀 모델의 성능은 분명히 더 나빴습니다. 따라서 이러한 더 복잡한 접근 방법은 이 문제에서는 가치가 없을 수도 있지만 시도해 보기 전에는 알 수 있는 방법이 없었으며 이러한 모델은 다른 특정 문제에 도움이 될 수 있습니다. 다음 단계이 튜토리얼에서는 TensorFlow를 사용한 시계열 예측에 대해 간단히 소개했습니다.
|