پیش‌بینی سری‌های زمانی با Vertex AI و BigQuery ML

۱. مرور کلی

در این آزمایشگاه، شما یاد خواهید گرفت که چگونه یک مدل پیش‌بینی سری زمانی را با TensorFlow بسازید و سپس یاد خواهید گرفت که چگونه این مدل‌ها را با Vertex AI مستقر کنید.

آنچه یاد می‌گیرید

شما یاد خواهید گرفت که چگونه:

  • تبدیل داده‌ها به گونه‌ای که بتوان از آنها در یک مدل یادگیری ماشینی استفاده کرد
  • تجسم و کاوش داده‌ها
  • استفاده از BigQuery ML برای ایجاد یک مدل پیش‌بینی سری زمانی
  • ساخت یک مدل پیش‌بینی سری زمانی با TensorFlow با استفاده از معماری‌های LSTM و CNN

۲. مقدمه‌ای بر پیش‌بینی سری‌های زمانی

تمرکز این آزمایشگاه کد بر نحوه‌ی به‌کارگیری تکنیک‌های پیش‌بینی سری‌های زمانی با استفاده از پلتفرم ابری گوگل است. این یک دوره‌ی عمومی پیش‌بینی سری‌های زمانی نیست، اما مرور مختصری از مفاهیم آن می‌تواند برای کاربران ما مفید باشد.

داده‌های سری زمانی

اول، سری زمانی چیست؟ مجموعه‌ای از داده‌ها است که در فواصل زمانی منظم ثبت شده‌اند. یک مجموعه داده سری زمانی شامل زمان و حداقل یک متغیر وابسته به زمان است.

85af6a1ff05c69f2.png

قطعات

یک سری زمانی را می‌توان به اجزای زیر تجزیه کرد:

  • روند : در یک الگوی نسبتاً قابل پیش‌بینی به سمت بالا یا پایین حرکت می‌کند
  • فصلی : در یک دوره خاص مانند روز، هفته، ماه، فصل و غیره تکرار می‌شود.
  • تصادفی : نوسانات باقیمانده

می‌تواند چندین لایه فصلی وجود داشته باشد. برای مثال، یک مرکز تماس ممکن است الگویی در حجم تماس در روزهای خاصی از هفته و همچنین در ماه‌های مشخص مشاهده کند. باقیمانده را می‌توان با متغیرهای دیگری علاوه بر زمان توضیح داد.

6e8d45bbbbc388ec.png

ایستایی

برای بهترین نتایج در پیش‌بینی، داده‌های سری زمانی باید ایستا شوند، که در آن ویژگی‌های آماری مانند میانگین و واریانس در طول زمان ثابت باشند. تکنیک‌هایی مانند تفاضل‌گیری و روندزدایی را می‌توان برای داده‌های خام به کار برد تا ایستاتر شوند.

برای مثال، نمودار زیر از غلظت CO2 یک الگوی سالانه تکرارشونده با روند صعودی را نشان می‌دهد. ( منبع )

ab82857e2e7d0b89.png

پس از حذف روند خطی، داده‌ها برای پیش‌بینی مناسب‌تر هستند، زیرا اکنون میانگین ثابتی دارند.

c936381ab1095528.png

استفاده از داده‌های سری زمانی برای یادگیری ماشین

برای استفاده از داده‌های سری زمانی در یک مسئله یادگیری ماشین، باید آنها را تغییر داد تا بتوان از مقادیر قبلی برای پیش‌بینی مقادیر آینده استفاده کرد. این جدول مثالی از نحوه ایجاد متغیرهای تأخیری برای کمک به پیش‌بینی هدف را نشان می‌دهد.

d667a941dbd470f5.png

حالا که برخی از اصول اولیه را پوشش داده‌ایم، بیایید با بررسی داده‌ها و پیش‌بینی شروع کنیم!

۳. محیط نوت‌بوک خود را راه‌اندازی کنید

حالا که مقدمه‌ای کوتاه در مورد داده‌ها ارائه دادیم، بیایید محیط توسعه مدل خود را راه‌اندازی کنیم.

مرحله ۱: فعال کردن APIها

رابط BigQuery از BigQuery Storage API استفاده می‌کند. در کنسول، BigQuery Storage API را جستجو کنید و اگر در حال حاضر غیرفعال است، آن را فعال کنید.

9895a2fd3cdf8f8c.png

مرحله ۲: یک دفترچه یادداشت Vertex AI Workbench ایجاد کنید

به بخش Vertex AI Workbench در کنسول ابری خود بروید و روی New Notebook کلیک کنید. سپس جدیدترین نوع نوت‌بوک TensorFlow Enterprise 2.x را بدون GPU انتخاب کنید:

4e7b73eabf2bc061.png

از گزینه‌های پیش‌فرض استفاده کنید و سپس روی Create کلیک کنید. پس از ایجاد نمونه، Open JupyterLab را انتخاب کنید:

18c9f3c462aafaee.png

سپس، یک دفترچه یادداشت پایتون ۳ از JupyterLab ایجاد کنید:

58523671a252b95a.png

مرحله ۳: دانلود مواد آزمایشگاهی

یک پنجره ترمینال جدید از رابط JupyterLab ایجاد کنید: File -> New -> Terminal.

از آنجا، با استفاده از این دستور، منبع را کلون کنید:

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

۴. کاوش و تجسم داده‌ها

در این بخش، شما:

  • یک پرس‌وجو ایجاد کنید که داده‌ها را در یک سری زمانی گروه‌بندی کند
  • مقادیر گمشده را پر کنید
  • تجسم داده‌ها
  • تجزیه سری‌های زمانی به اجزای روند و فصلی

مرحله ۱

در محیط کاری Vertex AI، به مسیر training-data-analyst/courses/ai-for-time-series/notebooks بروید و 01-explore.ipynb را باز کنید.

مرحله ۲

تمام سلول‌های دفترچه یادداشت را پاک کنید (Edit > Clear All Outputs)، تنظیمات ناحیه، پروژه و باکت را در یکی از چند سلول اول تغییر دهید و سپس سلول‌ها را یکی یکی اجرا کنید.

مرحله ۳

در این بخش، داده‌ها را وارد کرده‌اید و ابعاد مختلف آن را تجسم کرده‌اید. اکنون که تصویر واضح‌تری از داده‌ها دارید، آماده خواهید بود تا با استفاده از این داده‌ها، به مدل‌سازی یادگیری ماشین بپردازید.

55839e7bc0427915.png

۵. ایجاد مدل با پیش‌بینی سری زمانی BigQuery

در این بخش، شما:

  • داده‌های ورودی سری زمانی خود را به جدول BigQuery وارد کنید
  • ایجاد مدل سری زمانی با استفاده از سینتکس BQML
  • یاد بگیرید چگونه پارامترها و دقت مدل خود را ارزیابی کنید
  • پیش‌بینی با استفاده از مدل

مرحله ۱

ما قصد داریم یک جدول BigQuery با داده‌های خام CSV که بررسی کردیم، ایجاد کنیم. بیایید با دانلود CSV از محیط notebook شروع کنیم.

از دایرکتوری training-data-analyst/courses/ai-for-time-series/notebooks/data ، روی cta_ridership.csv کلیک راست کرده و آن را در محیط محلی خود دانلود کنید .

مرحله ۲

در مرحله بعد، این داده‌ها را در یک جدول BigQuery بارگذاری خواهیم کرد.

در کنسول به BigQuery بروید (با جستجو یا استفاده از این لینک ):

649e7ab1c44b75e8.png

می‌توانید جدول را به یک مجموعه داده جدید یا موجود اضافه کنید، که جداول مرتبط را گروه‌بندی می‌کند. در صورتی که قبلاً مجموعه داده‌ای ایجاد نکرده‌اید، می‌توانید روی پروژه خود در گوشه پایین سمت چپ کلیک کنید و سپس در گوشه پایین سمت راست، ایجاد مجموعه داده را انتخاب کنید.

281b97020cd52f29.png

یک نام دلخواه مانند demo انتخاب کنید، مقادیر پیش‌فرض را بپذیرید و ادامه دهید.

با انتخاب آن مجموعه داده، برای ایجاد یک جدول جدید، گزینه Create Table را در گوشه پایین سمت راست انتخاب کنید.

ad47810d44cfb289.png

برای گزینه‌های ایجاد جدول، موارد زیر را انتخاب کنید:

  • ایجاد جدول از: آپلود
  • فایل را انتخاب کنید: cta_ridership.csv
  • نام جدول: cta_ridership
  • طرحواره: برای تشخیص خودکار طرحواره و پارامترهای ورودی، کادر را علامت بزنید

۲۱۳e۴۱۷۷e۹e۷۹۵۴۴.png

مرحله ۳

حالا وقتشه که مدلمون رو بسازیم! 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 برای مرجع سینتکس مدل‌های سری زمانی بیابید.

مرحله ۴

بیایید درباره مدل خود بیشتر بدانیم. پس از پایان آموزش، یک پرس‌وجوی دیگر اجرا می‌کنیم و در صورت نیاز، دوباره demo را جایگزین می‌کنیم:

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

بیایید نتایج را تفسیر کنیم. در هر ردیف، یک مدل کاندید به همراه پارامترها و آماره‌های ارزیابی آن را مشاهده خواهید کرد. نتایج به ترتیب صعودی AIC یا معیار اطلاعات آکائیکه که شاخصی نسبی از کیفیت مدل ارائه می‌دهد، بازگردانده می‌شوند. بنابراین، مدل ردیف اول کمترین AIC را دارد و بهترین مدل در نظر گرفته می‌شود.

شما قادر خواهید بود پارامترهای p، d و q مدل ARIMA و همچنین فصلی بودن کشف شده در مدل را مشاهده کنید. در این حالت، مدل برتر شامل فصلی بودن هفتگی و سالانه است.

5b5b1e129c70a340.png

مرحله ۵

حالا، ما آماده‌ایم تا با تابع ML.FORECAST پیش‌بینی کنیم!

عبارت زیر را وارد/جایگزین کنید (در صورت نیاز، عبارت demo را جایگزین کنید):

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

این پرس‌وجو به سادگی با استفاده از مدل ما، ۷ روز آینده را پیش‌بینی می‌کند! می‌توانیم هفت ردیف برگردانده شده را در زیر ببینیم. این پیش‌بینی همچنین شامل یک فاصله اطمینان است که به طور پیش‌فرض ۰.۹۵ است اما در پرس‌وجو قابل تنظیم است.

b8a7f22657dc2d27.png

کار عالی: ما یک مدل سری زمانی را تنها با چند پرس‌وجوی BQML ایجاد کرده‌ایم.

۶. یک مدل پیش‌بینی سفارشی بسازید

در این بخش، شما:

  • حذف داده‌های پرت از داده‌ها
  • انجام پیش‌بینی چند مرحله‌ای
  • گنجاندن ویژگی‌های اضافی در یک مدل سری زمانی
  • آشنایی با معماری‌های شبکه عصبی برای پیش‌بینی سری‌های زمانی: LSTM و CNN
  • آشنایی با مدل‌های آماری، از جمله هموارسازی نمایی هولت-وینترز
  • مدل‌های گروهی

مرحله ۱

در محیط کاری Vertex AI، به مسیر training-data-analyst/courses/ai-for-time-series/notebooks بروید و 02-model.ipynb را باز کنید.

مرحله ۲

تمام سلول‌های دفترچه یادداشت را پاک کنید (Edit > Clear All Outputs)، تنظیمات ناحیه، پروژه و باکت را در یکی از چند سلول اول تغییر دهید و سپس سلول‌ها را یکی یکی اجرا کنید.

مرحله ۳

در دفترچه یادداشت، اکنون معماری‌های مدل متعددی را بررسی کرده‌اید: LSTM، CNN و مدل‌های آماری. برای هر مدل، می‌توانید ببینید که مدل در برابر داده‌های آزمایشی چگونه عمل می‌کند:

a528df58f4e6d372.png

۷. آموزش و پیش‌بینی در فضای ابری

در این بخش، شما:

  • آماده‌سازی داده‌ها و مدل‌ها برای آموزش در فضای ابری
  • مدل خود را آموزش دهید و پیشرفت کار را با آموزش پلتفرم هوش مصنوعی زیر نظر داشته باشید
  • پیش‌بینی با استفاده از مدل با پیش‌بینی‌های پلتفرم هوش مصنوعی

مرحله ۱

در محیط کاری Vertex AI، به مسیر training-data-analyst/courses/ai-for-time-series/notebooks بروید و 03-cloud-training.ipynb را باز کنید.

مرحله ۲

تمام سلول‌های دفترچه یادداشت را پاک کنید (Edit > Clear All Outputs)، تنظیمات ناحیه، پروژه و باکت را در یکی از چند سلول اول تغییر دهید و سپس سلول‌ها را یکی یکی اجرا کنید.

مرحله ۳

در بخش قبلی، ما یک مدل را آموزش دادیم و با آن پیش‌بینی کردیم، همه اینها در یک نوت‌بوک Workbench. در این بخش، ما نحوه استفاده از Python SDK برای Vertex AI را از نوت‌بوک خود برای استفاده از سرویس‌های Vertex AI برای آموزش و استقرار نشان دادیم.

a3f6b5dc895a24fb.png

۸. چالش

در این بخش، سعی خواهید کرد مفاهیمی را که آموخته‌اید، در یک مجموعه داده جدید به کار ببرید!

ما دستورالعمل‌های دقیقی ارائه نمی‌دهیم، فقط چند نکته (اگر مایل باشید!).

هدف، پیش‌بینی ۳۱۱ درخواست خدمات از شهر نیویورک است. این درخواست‌های غیر اضطراری شامل شکایات مربوط به سر و صدا، مشکلات چراغ‌های خیابان و غیره می‌شود.

مرحله ۱

بیایید با درک مجموعه داده‌ها شروع کنیم.

ابتدا، به مجموعه داده‌های درخواست‌های خدمات شهر نیویورک ۳۱۱ دسترسی پیدا کنید.

برای آشنایی بهتر با داده‌ها، چند نمونه از کوئری‌های ذکر شده در توضیحات مجموعه داده را امتحان کنید:

  • تعداد ۳۱۱ درخواست مربوط به کامیون‌های بستنی‌فروشی چقدر است؟
  • چه روزهایی بیشترین درخواست‌های ۳۱۱ مربوط به مهمانی‌ها را دریافت می‌کنند؟

در رابط کاربری BigQuery، گزینه Create Query را انتخاب کنید تا نحوه دسترسی به مجموعه داده‌ها را مشاهده کنید. توجه داشته باشید که دستور select از bigquery-public-data.new_york_311.311_service_requests کوئری می‌گیرد.

مرحله ۲

ما آماده شروع هستیم. در این بخش، اصلاحاتی را در دفترچه کاوش و تجسم ایجاد کنید تا با این داده‌ها کار کند.

نکات

  • دفترچه یادداشت 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)

مرحله ۳

حالا بیایید یک مدل سری زمانی با داده‌های ماهانه ایجاد کنیم.

نکات:

  • دفترچه یادداشت 02-model.ipynb را کپی کنید و کار را از روی آن شروع کنید.
  • پارامترهای مجموعه داده را به‌روزرسانی کنید:
  • پارامترهای target_col و ts_col را برای مطابقت با مجموعه داده جدید خود به‌روزرسانی کنید.
  • پارامترهای مدل را به‌روزرسانی کنید:
  • تناوب به صورت ماهانه (کد شروع ماه «MS» است)
  • مراحل ورودی: ۱۲ (بازه زمانی ۱۲ ماه است)
  • مراحل خروجی: ۳ (پیش‌بینی ۳ ماه آینده)
  • فصل‌ها: ۱۲ (فصلی بودن ۱۲ ماه است)
  • اگر نام فایل ورودی را در دفترچه یادداشت قبلی تغییر داده‌اید، آن را تغییر دهید.
  • اگر کوئری را در اواسط ماه اجرا کنید، مجموع ماهانه برای ماه آخر بسیار کمتر از حد انتظار خواهد بود. بنابراین، برای اهداف این آزمایش، بیایید ماه آخر را با استفاده از df = df[:-1] از مجموعه داده‌ها حذف کنیم.
  • به نظر نمی‌رسد هیچ داده پرت واضحی در داده‌ها وجود داشته باشد، بنابراین از آن سلول‌ها صرف نظر کنید یا آنها را در حالت کامنت قرار دهید.
  • واحدهای LSTM و فیلترهای CNN و اندازه هسته را برای این مدل جدید تنظیم کنید.

۹. پاکسازی

اگر می‌خواهید به استفاده از این نوت‌بوک ادامه دهید، توصیه می‌شود وقتی از آن استفاده نمی‌کنید، آن را خاموش کنید. از رابط کاربری Workbench در Cloud Console خود، نوت‌بوک را انتخاب کرده و سپس Stop را انتخاب کنید:

57213ef2edad9257.png

اگر می‌خواهید تمام منابعی را که در این آزمایشگاه ایجاد کرده‌اید حذف کنید، به جای متوقف کردن، کافیست دفترچه یادداشت میز کار را حذف کنید .

با استفاده از منوی ناوبری در کنسول ابری خود، به بخش ذخیره‌سازی (Storage) بروید و هر دو باکتی را که برای ذخیره دارایی‌های مدل خود ایجاد کرده‌اید، حذف کنید (هشدار: فقط در صورتی این کار را انجام دهید که باکت‌های جدیدی را فقط برای این آزمایش ایجاد کرده‌اید).