Vertex AI 및 BigQuery ML을 사용한 시계열 예측

1. 개요

이 실습에서는 TensorFlow로 시계열 예측 모델을 빌드하는 방법과 Vertex AI로 이러한 모델을 배포하는 방법을 알아봅니다.

학습 내용

다음 작업을 수행하는 방법을 배우게 됩니다.

  • ML 모델에서 사용할 수 있도록 데이터 변환
  • 데이터 시각화 및 탐색
  • BigQuery ML을 사용하여 시계열 예측 모델 만들기
  • LSTM 및 CNN 아키텍처를 사용하여 TensorFlow로 시계열 예측 모델 빌드

2. 시계열 예측 소개

이 Codelab에서는 Google Cloud Platform을 사용하여 시계열 예측 기법을 적용 하는 방법을 중점적으로 다룹니다. 일반적인 시계열 예측 과정은 아니지만 개념을 간략하게 살펴보는 것이 사용자에게 도움이 될 수 있습니다.

시계열 데이터

먼저 시계열이란 무엇일까요? 일정한 시간 간격으로 기록된 데이터가 포함된 데이터 세트입니다. 시계열 데이터 세트에는 시간과 시간에 종속된 하나 이상의 변수가 모두 포함됩니다.

85af6a1ff05c69f2.png

구성요소

시계열은 다음과 같은 구성요소로 분해할 수 있습니다.

  • 추세: 비교적 예측 가능한 패턴으로 위 또는 아래로 이동
  • 계절성: 일, 주, 월, 계절 등 특정 기간에 반복
  • 무작위: 잔차 변동

계절성은 여러 계층으로 구성될 수 있습니다. 예를 들어 콜센터에서는 특정 요일과 특정 월의 통화량 패턴을 확인할 수 있습니다. 잔차는 시간 외 다른 변수로 설명할 수 있습니다.

6e8d45bbbbc388ec.png

정상성

예측에서 최상의 결과를 얻으려면 시계열 데이터를 정상 상태로 만들어야 합니다. 여기서 정상 상태란 평균 및 분산과 같은 통계적 속성이 시간에 따라 일정하다는 의미입니다. 차분 및 추세 제거와 같은 기법을 원시 데이터에 적용하여 더 정상 상태로 만들 수 있습니다.

예를 들어 아래의 CO2 농도 그래프는 상승 추세와 함께 반복되는 연간 패턴을 보여줍니다. ( 소스)

ab82857e2e7d0b89.png

선형 추세를 제거하면 이제 데이터의 평균이 일정하므로 예측에 더 적합합니다.

c936381ab1095528.png

머신러닝에 시계열 데이터 사용

머신러닝 문제에서 시계열 데이터를 사용하려면 이전 값을 사용하여 향후 값을 예측할 수 있도록 변환해야 합니다. 이 표는 지연된 변수를 만들어 타겟을 예측하는 데 도움이 되는 방법을 보여주는 예입니다.

d667a941dbd470f5.png

이제 몇 가지 기본사항을 다루었으므로 데이터 탐색 및 예측을 시작해 보겠습니다.

3. 노트북 환경 설정

이제 데이터에 대한 간략한 소개를 마쳤으므로 모델 개발 환경을 설정해 보겠습니다.

1단계: API 사용 설정

BigQuery 커넥터는 BigQuery Storage API를 사용합니다. 콘솔에서 BigQuery Storage API 를 검색하고 현재 사용 중지되어 있는 경우 API를 사용 설정합니다.

9895a2fd3cdf8f8c.png

2단계: Vertex AI Workbench 노트북 만들기

Cloud 콘솔의 Vertex AI Workbench 섹션으로 이동하여 새 노트북을 클릭합니다. 그런 다음 최신 TensorFlow Enterprise 2.x 노트북 유형 GPU 사용 안 함을 선택합니다.

4e7b73eabf2bc061.png

기본 옵션을 사용한 다음 만들기 를 클릭합니다. 인스턴스가 생성되면 JupyterLab 열기 를 선택합니다.

18c9f3c462aafaee.png

그런 다음 JupyterLab에서 Python 3 노트북을 만듭니다.

58523671a252b95a.png

3단계: 실습 자료 다운로드

JupyterLab 인터페이스에서 새 터미널 창을 만듭니다. 파일 -> 새로 만들기 -> 터미널.

여기에서 다음 명령어를 사용하여 소스 자료를 클론합니다.

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. 데이터 탐색 및 시각화

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 데이터를 시계열로 그룹화하는 쿼리 만들기
  • 누락된 값 채우기
  • 데이터 시각화
  • 시계열을 추세 및 계절성 구성요소로 분해

1단계

Vertex AI Workbench에서 training-data-analyst/courses/ai-for-time-series/notebooks로 이동하여 01-explore.ipynb를 엽니다.

2단계

노트북의 셀을 모두 지우고 (수정 > 모든 출력 지우기) 처음 몇 개 셀 중 하나에서 리전, 프로젝트, 버킷 설정을 변경한 다음 셀을 하나씩 실행합니다.

3단계

이 섹션에서는 데이터를 가져오고 다양한 측정기준을 시각화했습니다. 이제 데이터를 더 명확하게 파악했으므로 이 데이터를 사용하여 머신러닝 모델링을 진행할 수 있습니다.

55839e7bc0427915.png

5. BigQuery 시계열 예측으로 모델 만들기

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 시계열 입력 데이터를 BigQuery 테이블로 가져오기
  • BQML 구문을 사용하여 시계열 모델 만들기
  • 모델 매개변수 및 정확성을 평가하는 방법 알아보기
  • 모델을 사용하여 예측

1단계

방금 살펴본 CSV의 원시 데이터로 BigQuery 테이블을 만들겠습니다. 먼저 노트북 환경에서 CSV를 다운로드해 보겠습니다.

training-data-analyst/courses/ai-for-time-series/notebooks/data 디렉터리에서 cta_ridership.csv를 마우스 오른쪽 버튼으로 클릭하고 로컬 환경에 다운로드 합니다.

2단계

다음으로 이 데이터를 BigQuery 테이블에 업로드합니다.

콘솔에서 BigQuery로 이동합니다 (검색 또는 이 링크 사용).

649e7ab1c44b75e8.png

관련 테이블을 그룹화하는 새 데이터 세트 또는 기존 데이터 세트에 테이블을 추가할 수 있습니다. 아직 데이터 세트를 만들지 않은 경우 왼쪽 하단에서 프로젝트를 클릭한 다음 오른쪽 하단에서 데이터 세트 만들기를 선택합니다.

281b97020cd52f29.png

demo와 같이 원하는 이름을 선택하고 기본값을 수락한 후 계속합니다.

데이터 세트를 선택한 상태에서 오른쪽 하단에 있는 테이블 만들기 를 선택하여 새 테이블을 만듭니다.

ad47810d44cfb289.png

테이블 만들기 옵션에서 다음을 선택합니다.

  • 다음 항목으로 테이블 만들기: 업로드
  • 파일 선택: cta_ridership.csv
  • 테이블 이름: cta_ridership
  • 스키마: 스키마 및 입력 매개변수 를 자동 감지하려면 체크박스를 선택합니다.

213e4177e9e79544.png

3단계

이제 모델을 만들 차례입니다. BigQuery ML은 다양한 모델 유형을 만들 수 있는 SQL과 유사한 간단한 구문을 제공합니다.

쿼리 편집기에서 이 쿼리를 붙여넣거나 입력하고 필요한 경우 위치에서 데이터 세트 이름으로 demo 를 바꿉니다.

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

구문을 이해하기 위해 주요 요소를 살펴보겠습니다.

CREATE OR REPLACE MODEL
demo.cta_ridership_model

이 문은 모델을 만듭니다. CREATE MODEL과 같은 이 문의 변형이 있지만 여기서는 동일한 이름의 기존 모델을 바꾸기로 했습니다.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

여기서는 모델 옵션을 정의합니다. 첫 번째 옵션은 모델 유형입니다. ARIMA를 선택하면 시계열 예측 모델이 생성됩니다.

TIME_SERIES_TIMESTAMP_COL=‘service_date'

날짜/시간 정보가 포함된 열

TIME_SERIES_DATA_COL=‘total_rides'

데이터 열

HOLIDAY_REGION=‘us'

이 선택적 매개변수를 사용하면 모델에 공휴일을 포함할 수 있습니다. 이전 단계의 데이터 탐색에서 공휴일에는 승차량이 더 적었고 데이터가 미국 일리노이주 시카고에서 제공되므로 모델에 미국 공휴일을 포함합니다.

AS SELECT ... FROM ...

이 섹션에서는 모델 학습에 사용할 입력 데이터를 선택합니다.

여러 시계열이 있는 경우 열을 정의하거나 ARIMA 모델 매개변수를 자동으로 검색할지 선택하는 등 쿼리에 추가할 수 있는 여러 옵션이 있습니다. 자세한 내용은 시계열 모델 구문 참조의 CREATE MODEL 문을 참조하세요.

4단계

모델에 대해 자세히 알아보겠습니다. 학습이 완료되면 필요한 경우 demo 를 다시 바꿔서 다른 쿼리를 실행해 보겠습니다.

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

결과를 해석해 보겠습니다. 각 행에는 매개변수와 평가 통계가 포함된 후보 모델이 표시됩니다. 결과는 모델 품질의 상대적 지표를 제공하는 Akaike 정보 기준(AIC)의 오름차순으로 반환됩니다. 따라서 첫 번째 행의 모델은 AIC가 가장 낮으며 최적 모델로 간주됩니다.

ARIMA 이 경우 최상위 모델에는 주간 및 연간 계절성이 모두 포함됩니다.

5b5b1e129c70a340.png

5단계

이제 ML.FORECAST 함수로 예측할 준비가 되었습니다.

다음을 붙여넣거나 입력합니다 (필요한 경우 demo 를 바꿈).

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

이 쿼리는 모델을 사용하여 7일 동안 예측합니다. 아래에 반환된 7개의 행을 확인할 수 있습니다. 예측에는 신뢰 구간도 포함되어 있으며 기본값은 0.95이지만 쿼리에서 구성할 수 있습니다.

b8a7f22657dc2d27.png

수고하셨습니다. 몇 개의 BQML 쿼리만으로 시계열 모델을 만들었습니다.

6. 커스텀 예측 모델 빌드

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 데이터에서 이상점 삭제
  • 다단계 예측 수행
  • 시계열 모델에 추가 기능 포함
  • 시계열 예측을 위한 신경망 아키텍처(LSTM 및 CNN) 알아보기
  • Holt-Winters 지수 평활을 비롯한 통계 모델 알아보기
  • 앙상블 모델

1단계

Vertex AI Workbench에서 training-data-analyst/courses/ai-for-time-series/notebooks로 이동하여 02-model.ipynb를 엽니다.

2단계

노트북의 셀을 모두 지우고 (수정 > 모든 출력 지우기) 처음 몇 개 셀 중 하나에서 리전, 프로젝트, 버킷 설정을 변경한 다음 셀을 하나씩 실행합니다.

3단계

노트북에서 이제 여러 모델 아키텍처(LSTM, CNN, 통계 모델)를 살펴봤습니다. 각 모델에 대해 테스트 데이터에 대한 모델의 성능을 확인할 수 있습니다.

a528df58f4e6d372.png

7. 클라우드에서 학습 및 예측

이 섹션에서 수행할 작업은 다음과 같습니다.

  • 클라우드에서 학습할 데이터 및 모델 준비
  • AI Platform Training으로 모델을 학습시키고 작업 진행률 모니터링
  • AI Platform Predictions로 모델을 사용하여 예측

1단계

Vertex AI Workbench에서 training-data-analyst/courses/ai-for-time-series/notebooks로 이동하여 03-cloud-training.ipynb를 엽니다.

2단계

노트북의 셀을 모두 지우고 (수정 > 모든 출력 지우기) 처음 몇 개 셀 중 하나에서 리전, 프로젝트, 버킷 설정을 변경한 다음 셀을 하나씩 실행합니다.

3단계

이전 섹션에서는 Workbench 노트북 내에서 모델을 학습시키고 예측했습니다. 이 섹션에서는 노트북에서 Vertex AI용 Python SDK를 사용하여 학습 및 배포를 위해 Vertex AI 서비스를 사용하는 방법을 보여줍니다.

a3f6b5dc895a24fb.png

8. 도전과제

이 섹션에서는 학습한 개념을 새 데이터 세트에 적용해 봅니다.

자세한 안내는 제공하지 않으며 몇 가지 힌트만 제공합니다 (원하는 경우).

목표는 뉴욕시의 311 서비스 요청을 예측하는 것입니다. 이러한 비긴급 요청에는 소음 신고, 가로등 문제 등이 포함됩니다.

1단계

먼저 데이터 세트를 이해해 보겠습니다.

먼저 뉴욕시 311 서비스 요청 데이터 세트에 액세스합니다.

데이터를 더 잘 파악하려면 데이터 세트 설명에 나열된 샘플 쿼리 몇 개를 사용해 보세요.

  • 아이스크림 트럭과 관련한 311 요청 건수는 얼마나 되나요?
  • 파티와 관련하여 311 요청이 가장 많은 날은 언제인가요?

BigQuery UI에서 쿼리 만들기 를 선택하여 데이터 세트에 액세스하는 방법을 확인합니다. 선택 문이 bigquery-public-data.new_york_311.311_service_requests에서 쿼리하고 있습니다.

2단계

시작할 준비가 되었습니다. 이 섹션에서는 이 데이터로 작업할 수 있도록 탐색 및 시각화 노트북을 수정합니다.

힌트

  • 01-explore.ipynb 노트북을 복제 하고 여기서부터 작업을 시작합니다.
  • 데이터를 탐색하려면 다음 쿼리를 사용해 보세요.
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • 월별 사건 수를 가져오려면 다음 쿼리를 사용합니다.
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • 상수 섹션에서 열 변수를 업데이트합니다. 위 쿼리에서 타겟 열은 y 이고 날짜 열은 ds 입니다. 추가 기능은 없습니다.
  • 다음 실습을 위해 데이터를 내보내는 파일 이름을 변경해 보세요.
  • df.to_csv(YOUR-EXPORT-FILENAME, index=False)를 사용하여 데이터를 내보냅니다.

3단계

이제 월별 데이터로 시계열 모델을 만들어 보겠습니다.

힌트:

  • 02-model.ipynb 노트북을 복제 하고 여기서부터 작업을 시작합니다.
  • 데이터 세트 매개변수를 업데이트합니다.
  • 새 데이터 세트와 일치하도록 target_colts_col 매개변수를 업데이트합니다.
  • 모델 매개변수를 업데이트합니다.
  • 월별 빈도 (월 시작 코드: 'MS')
  • 입력 단계: 12 (과거 조사 기간은 12개월)
  • 출력 단계: 3 (3개월 후 예측)
  • 시즌: 12 (계절성은 12개월)
  • 이전 노트북에서 입력 파일 이름을 변경한 경우 변경합니다.
  • 월중에 쿼리를 실행하면 최종 월의 월별 총계가 예상보다 훨씬 낮아집니다. 따라서 이 실습에서는 df = df[:-1]을 사용하여 데이터 세트에서 최종 월을 삭제해 보겠습니다.
  • 데이터에 명백한 이상점이 없는 것 같으므로 이러한 셀을 건너뛰거나 주석 처리합니다.
  • 이 새 모델의 LSTM 단위와 CNN 필터 및 커널 크기를 조정합니다.

9. 삭제

이 노트북을 계속 사용하려면 사용하지 않을 때 노트북을 끄는 것이 좋습니다. Cloud 콘솔의 Workbench UI에서 노트북을 선택한 다음 중지를 선택합니다.

57213ef2edad9257.png

이 실습에서 만든 모든 리소스를 삭제하려면 중지하는 대신 Workbench 노트북을 삭제 하면 됩니다.

Cloud 콘솔의 탐색 메뉴를 사용하여 스토리지로 이동하고 모델 애셋을 저장하기 위해 만든 두 버킷을 모두 삭제합니다 (경고: 이 실습을 위해서만 새 버킷을 만든 경우에만 이렇게 하세요).