Temporal Fusion Transformer: 딥 러닝을 사용한 시계열 예측 — 전체 자습서

정확하고 해석 가능한 예측 생성

DALLE [1]로 작성됨

[2]에 따르면, 시간 융합 변압기 시계열 예측을 위한 모든 주요 딥 러닝 모델보다 성능이 뛰어납니다.

특집 포함 그라디언트 부스팅 트리 표 형식의 시계열 데이터에 대한 모델입니다.

그러나 무엇 시간 융합 변압기(TFT)[3] 왜 그렇게 흥미로운가요?

이번 글에서는 신상품에 대해 간략하게 설명드리겠습니다. 시간 융합 변압기 그리고 엔드투엔드 프로젝트를 구축하세요. 에너지 수요 예측. 구체적으로 다음 내용을 다룰 것입니다.

  • TFT 형식에 맞게 데이터를 준비하는 방법.
  • TFT 모델을 구축, 훈련, 평가하는 방법.
  • 검증 데이터 및 샘플 외부 예측에 대한 예측을 얻는 방법.
  • 계산하는 방법 기능의 중요성, 계절성 패턴,극한 상황 견고성 내장 모델을 사용하여 해석 가능한 주의 기구.

안으로 들어가자!

Temporal Fusion Transformer 아키텍처에 대한 심층 분석을 보려면 이전 내용을 확인하세요. 기사.

T임시의 Fusion T변형자(TFT)는 self-attention을 활용하여 여러 시간 시퀀스의 복잡한 시간적 역학을 포착하는 Transformer 기반 모델입니다.

TFT는 다음을 지원합니다:

  • 다중 시계열: 수천 개의 일변량 또는 다변량 시계열에 대해 TFT 모델을 훈련할 수 있습니다.
  • 다단계 예측: 모델은 예측 구간을 포함하여 하나 이상의 목표 변수에 대한 다단계 예측을 출력합니다.
  • 이기종 기능: TFT는 시변 및 정적 외생 변수를 포함한 다양한 유형의 기능을 지원합니다.
  • 해석 가능한 예측: 예측은 변수 중요도와 계절성 측면에서 해석될 수 있습니다.

그 특성 중 하나는 독특한 것입니다. 시간 융합 변압기. 이에 대해서는 다음 섹션에서 다루겠습니다.

주목할만한 DL 시계열 모델 중에서(예: DeepAR[4]) TFT는 다양한 유형의 기능을 지원한다는 점에서 눈에 띕니다. 이것들은:

  • 시변 알려진
  • 시변 알 수없는
  • 시불변 현실
  • 시불변 범주 형

예를 들어, 매출 예측 사례:

3개 제품의 매출을 예측해야 한다고 가정해 보겠습니다. 그만큼 num sales 목표 변수입니다. 그만큼 CPI index 또는 number of visitors are 시간에 따라 변하는 알 수 없음 기능은 예측 시간까지만 알려져 있기 때문입니다. 하지만, holidaysspecial days are 시간에 따라 변하는 것으로 알려진 이벤트.

XNUMXD덴탈의 product id is 시불변(정적) 범주형 특징. 다음과 같이 수치적이고 시간 의존적이지 않은 기타 기능 yearly_revenue 로 분류될 수 있다 시불변 실수.

프로젝트로 이동하기 전에 먼저 데이터를 확장된 시계열 형식.

참고 : 이 글에 사용된 모든 이미지와 그림은 작성자가 제작한 것입니다.

이 튜토리얼에서는 TemporalFusionTransformer 에서 모델 PyTorch 예측 라이브러리 및 PyTorch Lightning:

pip 설치 토치 pytorch-lightning pytorch_forecasting

전체 프로세스에는 다음 세 가지가 포함됩니다.

  1. 시계열 데이터로 pandas 데이터 프레임을 만듭니다.
  2. 데이터프레임을 TimeSeries데이터세트 예.
  3. 우리의 통과 TimeSeries데이터세트 인스턴스 TemporalFusionTransformer.

XNUMXD덴탈의 TimeSeries데이터세트 기능이 시간에 따라 변하는지 아니면 정적인지 지정하는 데 도움이 되기 때문에 매우 유용합니다. 게다가 이는 유일한 형식입니다. TemporalFusionTransformer 수락합니다.

방법을 보여주기 위해 최소한의 훈련 데이터 세트를 만들어 보겠습니다. TimeSeries데이터세트 작품 :

다음과 같은 방식으로 데이터 형식을 지정해야 합니다. 각 색상 상자는 서로 다른 시계열을 나타냅니다. group 값.

그림 1 : Sample_data 팬더 데이터 프레임

데이터프레임의 가장 중요한 열은 time_idx - 샘플의 순서를 결정합니다. 누락된 관측치가 없으면 값은 다음과 같이 증가해야 합니다. +1 각 시계열마다.

다음으로 데이터프레임을 TimeSeries데이터세트 예:

모든 주장은 자명합니다. max_encoder_length 전환 확인 기간을 정의하고 max_prediction_length 예측할 데이터 포인트 수를 지정합니다. 우리의 경우 과거 3개의 시간 단계를 되돌아보고 2개의 예측을 출력합니다.

XNUMXD덴탈의 TimeSeries데이터세트 인스턴스는 이제 데이터로더 역할을 합니다. 배치를 인쇄하고 데이터가 TFT에 어떻게 전달되는지 확인해 보겠습니다.

이 배치에는 훈련 값이 포함되어 있습니다. [0,1] 첫 번째 시계열(group 0) 및 테스트 값[2,3,4]. 이 코드를 다시 실행하면 기본적으로 데이터가 섞이기 때문에 다른 값을 얻게 됩니다.

우리 프로젝트에서는 전기부하 다이어그램20112014 [5] UCI의 데이터 세트. 이 예제의 노트북은 다음에서 다운로드할 수 있습니다. 여기에서 지금 확인해 보세요.:

이 데이터 세트에는 370분 간격으로 15명의 클라이언트/소비자의 전력 사용량(KW)이 포함되어 있습니다. 데이터 범위는 4년(2011~2014)입니다.

일부 소비자는 2011년 이후에 생성되었으므로 초기 전력 사용량은 XNUMX입니다.

우리는 다음과 같이 데이터 전처리를 수행합니다. [3]:

  • 목표 변수를 집계합니다. power_usage 시간별로.
  • 검정력이 0이 아닌 모든 시계열의 가장 빠른 날짜를 찾습니다.
  • 새로운 기능 만들기: month, day, hourday_of_week.
  • 다음 사이의 모든 요일을 선택하세요. 2014–01–012014–09–07.

시작하자:

데이터 다운로드

wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!압축해제
LD2011_2014.txt.zip

데이터 전처리

각 열은 소비자를 나타냅니다. 가장 초기 power_usage 값은 0입니다.

다음으로 시간별 데이터를 집계합니다. 모델의 크기와 복잡성으로 인해 우리는 5명의 소비자에 대해서만 모델을 훈련합니다(XNUMX이 아닌 값을 가진 소비자의 경우).

이제 데이터 세트를 준비합니다. TimeSeries데이터세트 체재. 각 열은 서로 다른 시계열을 나타냅니다. 따라서 우리는 데이터프레임을 '용해'하여 모든 시계열이 수평이 아닌 수직으로 쌓이도록 합니다. 그 과정에서 우리는 새로운 기능을 만들어냅니다.

최종 전처리된 데이터프레임이 호출됩니다. time_df. 내용을 인쇄해 보겠습니다.

XNUMXD덴탈의 time_df 이제 올바른 형식으로 되어 있습니다. TimeSeries데이터세트. 지금쯤 짐작하셨겠지만, 세분성은 시간 단위이므로 hours_from_start 변수는 시간 지수.

탐색 적 데이터 분석

5명의 소비자/시계열 선택은 무작위가 아닙니다. 그만큼 power usage 각 시계열에는 평균값과 같은 서로 다른 속성이 있습니다.

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

모든 시계열의 첫 번째 달을 그려보겠습니다.

그림 2 : 5개 시계열/소비자의 첫 번째 달입니다.

눈에 띄는 추세는 없으나 시계열별로 계절성과 진폭이 조금씩 다릅니다. 정상성, 신호 분해 등을 추가로 실험하고 확인할 수 있지만 우리의 경우 모델 구축 측면에만 중점을 둡니다.

또한 다음과 같은 다른 시계열 예측 방법에 주목하세요. 아리마 몇 가지 요구 사항을 충족해야 합니다(예: 시계열이 먼저 고정되어야 함). TFT를 사용하면 데이터를 있는 그대로 둘 수 있습니다.

DataLoader 생성

이 단계에서 우리는 time_df ~로 TimeSeriesDataSet 다음과 같은 이유로 매우 유용한 형식입니다.

  • 이를 통해 자체 Dataloader를 작성할 필요가 없습니다.
  • TFT가 데이터 세트의 기능을 처리하는 방법을 지정할 수 있습니다.
  • 데이터 세트를 쉽게 정규화할 수 있습니다. 우리의 경우 모든 시간 순서의 크기가 다르기 때문에 정규화가 필수입니다. 따라서 우리는 그룹노멀라이저 각 시계열을 개별적으로 정규화합니다.

우리 모델은 일주일(7*24)의 전환 확인 기간을 사용하여 다음 24시간의 전력 사용량을 예측합니다.

또한 hours_from_start 시간 인덱스이자 시변 기능입니다. 그만큼 power_usage 우리의 목표 변수입니다. 데모를 위해 검증 세트는 마지막 날입니다.

기준 모델

다음으로, 거의 모든 사람들이 잊어버리는 단계: 기준 모델. 특히 시계열 예측에서는 순진한 예측 변수가 더 멋진 모델보다 성능이 뛰어난 경우가 얼마나 자주 나타나는지 놀라게 될 것입니다!

단순한 기준으로 전날의 전력 사용량 곡선을 예측합니다.

시간 융합 변환기 모델 훈련

익숙한 방법을 사용하여 TFT 모델을 훈련할 수 있습니다. 훈련자 PyTorch Lightning의 인터페이스.

다음 사항에 유의하세요.

  • 우리는을 사용하여 조기중단 검증 손실을 모니터링하기 위한 콜백.
  • 우리는 사용 텐서 보드 훈련 및 검증 지표를 기록합니다.
  • 우리 모델은 분위수 손실 — 예측 구간을 출력하는 데 도움이 되는 특별한 유형의 손실입니다. Quantile Loss 함수에 대한 자세한 내용은 이 기사를 확인하십시오.
  • 우리는 4를 사용합니다 주의 머리, 원본 논문과 같습니다.

이제 모델을 구축하고 훈련할 준비가 되었습니다.

그게 다야! 6개의 에포크가 지나면 EarlyStopping이 시작되어 훈련을 중단합니다.

최상의 모델 로드 및 저장

모델을 저장하는 것을 잊지 마세요. 피클링할 수도 있지만 가장 안전한 옵션은 최고의 에포크를 직접 저장하는 것입니다.

!zip -r model.zip Lightning_logs/lightning_logs/version_1/*

모델을 다시 로드하려면 압축을 푸세요. 모델.zip 그리고 다음을 실행하세요. 가장 좋은 모델 경로만 기억하세요.

텐서보드 확인

Tensorboard를 사용하여 훈련 및 검증 곡선을 자세히 살펴보세요.

모델 평가

검증 세트에 대한 예측을 얻고 평균을 계산합니다. P50 (분위 중앙값) 오프:

마지막 2개의 시계열은 상대 크기도 높기 때문에 손실이 약간 더 높습니다.

검증 데이터에 대한 예측 플롯

우리가 통과하면 mode=raw 를 시청하여 이에 대해 더 많은 정보를 얻을 수 있습니다. 예측 () 방법을 사용하면 7개 분위수 모두에 대한 예측을 포함하여 더 많은 정보를 얻을 수 있습니다. 우리는 또한 attention 값에 접근할 수 있습니다(자세한 내용은 나중에 설명).

자세히 살펴보세요. raw_predictions 변하기 쉬운:

우리는을 사용하여 플롯_예측() 우리의 플롯을 만드는 것입니다. 물론 자신만의 맞춤형 플롯을 만들 수도 있습니다. 플롯_예측() 주의 가치를 추가하면 추가적인 이점이 있습니다.

참고 : 우리 모델은 다음 24개의 데이터 포인트를 예측합니다. 한 번에. 이는 모델이 다음을 예측하는 롤링 예측 시나리오가 아닙니다. 단일 매번 가치를 부여하고 모든 예측을 '연결'합니다.

각 소비자에 대해 하나의 플롯(총 5개)을 생성합니다.

그림 3 : MT_002의 검증 데이터에 대한 예측
그림 4 : MT_004의 검증 데이터에 대한 예측
그림 5 : MT_005의 검증 데이터에 대한 예측
그림 6 : MT_006의 검증 데이터에 대한 예측
그림 7 : MT_008의 검증 데이터에 대한 예측

결과는 매우 인상적입니다.

당사의 시간 융합 변압기 모델은 계절성과 규모 측면에서 5개 시계열 모두의 동작을 포착할 수 있었습니다.

또한 다음 사항에 유의하세요.

  • 우리는 하이퍼파라미터 튜닝을 수행하지 않았습니다.
  • 우리는 멋진 기능 엔지니어링 기술을 구현하지 않았습니다.

다음 섹션에서는 하이퍼파라미터 최적화를 통해 모델을 개선하는 방법을 보여줍니다.

특정 시계열에 대한 예측 플롯

이전에는 다음을 사용하여 검증 데이터에 대한 예측을 그렸습니다. idx 데이터 세트의 모든 시계열을 반복하는 인수입니다. 특정 시계열에 대해 보다 구체적이고 예측을 출력할 수 있습니다.

그림 7 : 하루 전 예측 MT_004 트레이닝 세트에

In 그림 7, 우리는 하루 전날 계획을 세웁니다. MT_004 시간 인덱스=26512의 소비자.

시간 인덱싱 열을 기억하세요. hours_from_start 26304부터 시작하고 26388부터 예측을 얻을 수 있습니다. min_encoder_length=max_encoder_length // 2 어느 것이 26304 + 168//2=26388

표본 외 예측

검증 데이터의 최종 데이터 포인트를 넘어 샘플 외부 예측을 생성해 보겠습니다. 2014–09–07 23:00:00

우리가 해야 할 일은 다음을 포함하는 새로운 데이터 프레임을 만드는 것입니다.

  • 개수 N=max_encoder_length 전환 확인 기간 역할을 하는 과거 날짜 — 인코더 데이터 TFT 용어로.
  • 미래의 크기 날짜 max_prediction_length 우리가 예측을 계산하려는 대상은 디코더 데이터.

5개 시계열 모두에 대한 예측을 만들 수도 있고 하나만 예측할 수도 있습니다. 그림 7 소비자에 대한 표본 외 예측을 보여줍니다. MT_002:

그림 7 : MT_002의 하루 전 예측

정확한 예측도 중요하지만 요즘에는 설명 가능성도 매우 중요합니다.

그리고 블랙박스로 간주되는 딥러닝 모델의 경우 더욱 그렇습니다. 다음과 같은 방법 라임P 설명 가능성을 어느 정도 제공할 수 있지만 시계열에는 제대로 작동하지 않습니다. 게다가 이는 외부 사후 방법이며 특정 모델에 묶여 있지 않습니다.

시간 융합 변압기 세 가지 유형의 해석 가능성을 제공합니다.

  • 계절성: TFT는 새로운 것을 활용합니다 해석 가능한 다중 헤드 주의 과거 시간 단계의 중요성을 계산하는 메커니즘입니다.
  • 기능별: TFT는 변수 선택 네트워크 모든 기능의 중요성을 계산하는 모듈입니다.
  • 극한 상황 견고성: 드문 사건이 발생하는 동안 시계열이 어떻게 작동하는지 조사할 수 있습니다.

내부 동작에 대해 자세히 알고 싶다면 해석 가능한 다중 헤드 주의 변수 선택 네트워크, 내 이전 기사를 확인해 보세요.

계절성별 해석 가능성

TFT는 과거 시간 단계에 걸쳐 시간적 패턴을 이해하기 위해 주의 가중치를 탐색합니다.

이전의 모든 플롯의 회색 선은 주의 점수를 나타냅니다. 그 플롯을 다시 보십시오. 뭔가 눈치채셨나요? 그림 8 의 연구 결과를 보여줍니다. 그림 7 또한 주의 점수를 설명합니다.

그림 8 : 계절성이 표시된 MT_001의 하루 전 예측

Attention 점수는 모델이 예측을 출력할 때 해당 시간 단계가 얼마나 영향력이 있는지를 보여줍니다. 작은 피크는 일일 계절성을 반영하는 반면, 끝 부분의 높은 피크는 아마도 주간 계절성을 의미합니다.

모든 시간 단계와 시계열(이 튜토리얼에서 사용한 5개 항목뿐만 아니라)에 걸쳐 주의 곡선의 평균을 계산하면 대칭적으로 보이는 모양을 얻을 수 있습니다. 그림 9 TFT 논문에서:

그림 9 : 전기 데이터세트의 시간적 패턴(출처)

질문 : 이게 무슨 소용이야? ACF 플롯, 시간 신호 분해 등의 방법으로 계절성 패턴을 간단하게 추정할 수는 없나요?

답변 : 진실. 그러나 TFT의 주의 가중치를 연구하면 다음과 같은 추가 이점이 있습니다.

  1. 우리 모델이 시퀀스의 명백한 계절적 역학을 포착하는지 확인할 수 있습니다.
  2. 현재 입력 창의 주의 가중치가 모든 과거 입력을 고려하기 때문에 우리 모델은 숨겨진 패턴을 드러낼 수도 있습니다.
  3. 주의 가중치 플롯은 자기상관 플롯과 동일하지 않습니다. 자기상관 플롯은 특정 시퀀스를 참조하는 반면, 여기서 주의 가중치는 모든 공변량과 시계열을 살펴봄으로써 각 시간 단계의 영향에 중점을 둡니다.

기능별 해석성

XNUMXD덴탈의 변수 선택 네트워크 TFT의 구성요소는 쉽게 예측할 수 있습니다. 기능 중요성:

그림 10 : 검증 데이터의 중요성

In 그림 10, 우리는 다음을 발견합니다:

  • XNUMXD덴탈의 hourday_of_week 과거 관측치와 미래 공변량 모두에서 강력한 점수를 갖습니다. 원본 논문의 벤치마크도 동일한 결론을 공유합니다.
  • XNUMXD덴탈의 power_usage 분명히 가장 영향력 있는 관찰 공변량입니다.
  • XNUMXD덴탈의 consumer_id 여기서는 5개의 소비자만 사용하기 때문에 그다지 중요하지 않습니다. 저자가 370명의 소비자를 모두 사용하는 TFT 논문에서는 이 변수가 더 중요합니다.

참고 : 그룹화 정적 변수가 중요하지 않은 경우 데이터세트가 단일 분포 모델(예: ARIMA)을 통해 동일하게 모델링될 가능성이 매우 높습니다.

극단적인 사건 감지

시계열은 드문 사건(또는 충격).

더 나쁜 것은 그러한 사건이 매우 포착하기 어렵다는 것입니다. 공변량이 자동으로 동작을 변경하기 때문에 대상 변수가 짧은 기간 동안 변동성이 높아지는 경우를 상상해 보십시오.

이것은 무작위 노이즈인가요, 아니면 우리 모델에서 벗어나는 숨겨진 지속적인 패턴인가요?

TFT를 사용하면 값 범위에 걸쳐 각 개별 기능의 견고성을 분석할 수 있습니다. 불행하게도 현재 데이터 세트에는 변동성이나 희귀한 사건이 나타나지 않습니다. 이러한 현상은 금융, 판매 데이터 등에서 발견될 가능성이 더 높습니다. 그래도 계산 방법을 보여 드리겠습니다.

일부 기능에는 검증 데이터세트에 해당 값 중 일부가 포함되어 있지 않으므로 우리는 hourconsumer_id:

그림 11 : 시간별 예측 대 실제(정규화된 평균)
그림 12 : Consumer_id에 대한 예측과 실제(정규화된 평균)

두 그림 모두에서 결과는 고무적입니다. ~ 안에 그림 12, 우리는 소비자가 MT_004 다른 소비자에 비해 성능이 약간 낮습니다. 이전에 계산한 평균 전력 사용량으로 모든 소비자의 P50 손실을 정규화하면 이를 확인할 수 있습니다.

회색 막대는 각 변수의 분포를 나타냅니다. 제가 항상 하는 일 중 하나는 빈도가 낮은 값을 찾는 것입니다. 그런 다음 해당 영역에서 모델이 어떻게 작동하는지 확인합니다. 따라서 모델이 희귀 사건의 동작을 포착하는지 쉽게 감지할 수 있습니다.

일반적으로 이 TFT 기능을 사용하여 모델의 약점을 조사하고 추가 조사를 진행할 수 있습니다.

우리는 원활하게 사용할 수 있습니다 시간 융합 변압기 오투 나 초매개변수 조정을 수행하려면:

문제는 TFT가 Transformer 기반 모델이기 때문에 상당한 하드웨어 리소스가 필요하다는 것입니다!

시간 융합 변압기 의심할 여지 없이 시계열 커뮤니티의 이정표입니다.

모델은 SOTA 결과를 달성할 뿐만 아니라 예측 해석 가능성을 위한 프레임워크도 제공합니다. 해당 모델은 다음에서도 구매 가능합니다. 다트 PyTorch Forecasting 라이브러리를 기반으로 하는 Python 라이브러리입니다.

마지막으로, 건축에 대해 궁금하시다면 시간 융합 변압기 자세히 확인해보세요 동반 기사 원본 종이에.

Temporal Fusion Transformer: 딥 러닝을 통한 시계열 예측 — 원본 https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source=에서 다시 게시된 전체 튜토리얼 rss—-7f60cf5620c9—4(https://towardsdatascience.com/feed를 통해)

<!–

–>

타임 스탬프 :

더보기 블록 체인 컨설턴트