Menskalakan model deret waktu univariat ke jutaan deret waktu


Dalam tutorial ini, Anda akan mempelajari cara mempercepat pelatihan kumpulan model deret waktu secara signifikan untuk melakukan beberapa perkiraan deret waktu dengan satu kueri. Anda juga akan mempelajari cara mengevaluasi akurasi perkiraan.

Tutorial ini mengajarkan cara mempercepat pelatihan model deret waktu univariat secara signifikan untuk membuat perkiraan.

Tutorial ini memperkirakan beberapa deret waktu. Nilai perkiraan dihitung untuk setiap titik waktu, untuk setiap nilai dalam satu atau beberapa kolom yang ditentukan. Misalnya, jika Anda ingin memperkirakan cuaca dan menentukan kolom yang berisi data kota, data yang diprediksi akan berisi perkiraan untuk semua titik waktu untuk Kota A, lalu nilai yang diprediksi untuk semua titik waktu untuk Kota B, dan seterusnya.

Tutorial ini menggunakan data dari tabel publik bigquery-public-data.new_york.citibike_trips dan iowa_liquor_sales.sales. Data perjalanan sepeda hanya berisi beberapa ratus deret waktu, sehingga digunakan untuk mengilustrasikan berbagai strategi untuk mempercepat pelatihan model. Data penjualan minuman keras memiliki lebih dari 1 juta deret waktu, sehingga digunakan untuk menampilkan perkiraan deret waktu dalam skala besar.

Sebelum membaca tutorial ini, Anda harus membaca Membuat perkiraan beberapa deret waktu dengan model univariat dan Praktik terbaik perkiraan deret waktu skala besar.

Tujuan

Dalam tutorial ini, Anda akan menggunakan:

Untuk memudahkan, tutorial ini tidak membahas cara menggunakan fungsi ML.FORECAST atau ML.EXPLAIN_FORECAST untuk membuat perkiraan. Untuk mempelajari cara menggunakan fungsi tersebut, lihat Membuat perkiraan beberapa deret waktu dengan model univariat.

Biaya

Tutorial ini menggunakan komponen Google Cloud yang dapat ditagih, termasuk:

  • BigQuery
  • BigQuery ML

Untuk mengetahui informasi selengkapnya tentang biaya, lihat halaman Harga BigQuery dan halaman Harga BigQuery ML.

Sebelum memulai

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Di konsol Google Cloud, pada halaman pemilih project, pilih atau buat project Google Cloud.

    Buka pemilih project

  5. Make sure that billing is enabled for your Google Cloud project.

  6. BigQuery secara otomatis diaktifkan dalam project baru. Untuk mengaktifkan BigQuery dalam project yang sudah ada, buka

    Aktifkan API BigQuery.

    Mengaktifkan API

Izin yang Diperlukan

  • Untuk membuat set data, Anda memerlukan izin IAM bigquery.datasets.create.
  • Untuk membuat resource koneksi, Anda memerlukan izin berikut:

    • bigquery.connections.create
    • bigquery.connections.get
  • Untuk membuat model, Anda memerlukan izin berikut:

    • bigquery.jobs.create
    • bigquery.models.create
    • bigquery.models.getData
    • bigquery.models.updateData
    • bigquery.connections.delegate
  • Untuk menjalankan inferensi, Anda memerlukan izin berikut:

    • bigquery.models.getData
    • bigquery.jobs.create

Untuk mengetahui informasi lebih lanjut tentang peran dan izin IAM di BigQuery, baca Pengantar IAM.

Membuat set data

Buat set data BigQuery untuk menyimpan model ML Anda:

  1. Di konsol Google Cloud, buka halaman BigQuery.

    Buka halaman BigQuery

  2. Di panel Explorer, klik nama project Anda.

  3. Klik View actions > Create dataset.

    Buat set data.

  4. Di halaman Create dataset, lakukan hal berikut:

    • Untuk Dataset ID, masukkan bqml_tutorial.

    • Untuk Location type, pilih Multi-region, lalu pilih US (multiple regions in United States).

      Set data publik disimpan di US multi-region. Untuk mempermudah, simpan set data Anda di lokasi yang sama.

    • Jangan ubah setelan default yang tersisa, lalu klik Create dataset.

      Halaman Create dataset.

Membuat tabel data input

Pernyataan SELECT dari kueri berikut menggunakan fungsi EXTRACT untuk mengekstrak informasi tanggal dari kolom starttime. Kueri ini menggunakan klausa COUNT(*) untuk mendapatkan jumlah total harian perjalanan Citi Bike.

table_1 memiliki 679 deret waktu. Kueri menggunakan logika INNER JOIN tambahan untuk memilih semua deret waktu yang memiliki lebih dari 400 titik waktu, sehingga menghasilkan total 383 deret waktu.

Ikuti langkah-langkah berikut untuk membuat tabel data input:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    CREATE OR REPLACE TABLE
      `bqml_tutorial.nyc_citibike_time_series` AS
    WITH input_time_series AS
    (
      SELECT
        start_station_name,
        EXTRACT(DATE FROM starttime) AS date,
        COUNT(*) AS num_trips
      FROM
        `bigquery-public-data.new_york.citibike_trips`
      GROUP BY
        start_station_name, date
    )
    SELECT table_1.*
    FROM input_time_series AS table_1
    INNER JOIN (
      SELECT start_station_name,  COUNT(*) AS num_points
      FROM input_time_series
      GROUP BY start_station_name) table_2
    ON
      table_1.start_station_name = table_2.start_station_name
    WHERE
      num_points > 400;

Membuat model untuk beberapa deret waktu dengan parameter default

Anda ingin memperkirakan jumlah perjalanan sepeda untuk setiap stasiun Citi Bike, yang memerlukan banyak model deret waktu; satu untuk setiap stasiun Citi Bike yang disertakan dalam data input. Anda dapat menulis beberapa kueri CREATE MODEL untuk melakukannya, tetapi itu mungkin membosankan dan memakan waktu, terutama jika Anda memiliki banyak deret waktu. Sebagai gantinya, Anda dapat menggunakan satu kueri untuk membuat dan menyesuaikan serangkaian model deret waktu guna memperkirakan beberapa deret waktu sekaligus.

Klausa OPTIONS(model_type='ARIMA_PLUS', time_series_timestamp_col='date', ...) menunjukkan bahwa Anda membuat kumpulan model ARIMA_PLUS deret waktu berbasis ARIMA. Opsi time_series_timestamp_col menentukan kolom yang berisi deret waktu, opsi time_series_data_col menentukan kolom yang akan diprediksi, dan time_series_id_col menentukan satu atau beberapa dimensi yang ingin Anda buat deret waktunya.

Contoh ini tidak menyertakan titik waktu dalam deret waktu setelah 1 Juni 2016 sehingga titik waktu tersebut dapat digunakan untuk mengevaluasi akurasi perkiraan di lain waktu menggunakan fungsi ML.EVALUATE.

Ikuti langkah-langkah berikut untuk membuat model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_default`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name'
      ) AS
    SELECT *
    FROM bqml_tutorial.nyc_citibike_time_series
    WHERE date < '2016-06-01';

    Kueri membutuhkan waktu sekitar 15 menit untuk menyelesaikannya.

Mengevaluasi akurasi perkiraan untuk setiap deret waktu

Evaluasi akurasi perkiraan model menggunakan fungsi ML.EVALUATE.

Ikuti langkah-langkah berikut untuk mengevaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    SELECT *
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
      TABLE `bqml_tutorial.nyc_citibike_time_series`,
      STRUCT(7 AS horizon, TRUE AS perform_aggregation));

    Kueri ini melaporkan beberapa metrik perkiraan, termasuk:

    Hasilnya akan terlihat seperti berikut: Metrik evaluasi untuk model deret waktu.

    Klausa TABLE dalam fungsi ML.EVALUATE mengidentifikasi tabel yang berisi data kebenaran dasar. Hasil perkiraan dibandingkan dengan data kebenaran dasar untuk menghitung metrik akurasi. Dalam hal ini, nyc_citibike_time_series berisi titik deret waktu yang berada sebelum dan setelah 1 Juni 2016. Poin setelah 1 Juni 2016 adalah data kebenaran dasar. Titik sebelum 1 Juni 2016 digunakan untuk melatih model agar menghasilkan perkiraan setelah tanggal tersebut. Hanya poin setelah 1 Juni 2016 yang diperlukan untuk menghitung metrik. Poin sebelum 1 Juni 2016 akan diabaikan dalam penghitungan metrik.

    Klausa STRUCT dalam fungsi ML.EVALUATE menentukan parameter untuk fungsi. Nilai horizon adalah 7, yang berarti kueri menghitung akurasi perkiraan berdasarkan perkiraan tujuh titik. Perhatikan bahwa jika data kebenaran dasar memiliki kurang dari tujuh titik untuk perbandingan, metrik akurasi akan dihitung berdasarkan titik yang tersedia saja. Nilai perform_aggregation adalah TRUE, yang berarti bahwa metrik akurasi perkiraan digabungkan melalui metrik berdasarkan titik waktu. Jika Anda menentukan nilai perform_aggregation FALSE, akurasi perkiraan akan ditampilkan untuk setiap perkiraan titik waktu.

    Untuk mengetahui informasi selengkapnya tentang kolom output, lihat fungsi ML.EVALUATE.

Mengevaluasi akurasi perkiraan secara keseluruhan

Evaluasi akurasi perkiraan untuk semua 383 deret waktu.

Dari metrik perkiraan yang ditampilkan oleh ML.EVALUATE, hanya rata-rata error persentase absolut dan rata-rata error persentase absolut simetris yang tidak bergantung pada nilai deret waktu. Oleh karena itu, untuk mengevaluasi seluruh akurasi perkiraan dari rangkaian deret waktu, hanya gabungan dari kedua metrik ini yang bermanfaat.

Ikuti langkah-langkah berikut untuk mengevaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_default`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

Kueri ini menampilkan nilai MAPE dari 0.3471, dan nilai sMAPE dari 0.2563.

Membuat model untuk memperkirakan beberapa deret waktu dengan ruang penelusuran hyperparameter yang lebih kecil

Di bagian Membuat model untuk beberapa deret waktu dengan parameter default, Anda menggunakan nilai default untuk semua opsi pelatihan, termasuk opsi auto_arima_max_order. Opsi ini mengontrol ruang penelusuran untuk penyesuaian hyperparameter dalam algoritma auto.ARIMA.

Dalam model yang dibuat oleh kueri berikut, Anda menggunakan ruang penelusuran yang lebih kecil untuk hyperparameter dengan mengubah nilai opsi auto_arima_max_order dari default 5 menjadi 2.

Ikuti langkah-langkah berikut untuk mengevaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    Kueri membutuhkan waktu sekitar 2 menit untuk menyelesaikannya. Ingat bahwa model sebelumnya memerlukan waktu sekitar 15 menit untuk selesai saat nilai auto_arima_max_order adalah 5, sehingga perubahan ini meningkatkan peningkatan kecepatan pelatihan model sekitar 7x lipat. Jika Anda bertanya-tanya mengapa peningkatan kecepatannya bukan 5/2=2.5x, ini karena saat nilai auto_arima_max_order meningkat, tidak hanya jumlah model kandidat yang meningkat, tetapi juga kompleksitasnya. Hal ini menyebabkan waktu pelatihan model meningkat.

Mengevaluasi akurasi perkiraan untuk model dengan ruang penelusuran hyperparameter yang lebih kecil

Ikuti langkah-langkah berikut untuk mengevaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

Kueri ini menampilkan nilai MAPE dari 0.3337, dan nilai sMAPE dari 0.2337.

Di bagian Mengevaluasi akurasi perkiraan secara keseluruhan, Anda mengevaluasi model dengan ruang penelusuran hyperparameter yang lebih besar, dengan nilai opsi auto_arima_max_order adalah 5. Hal ini menghasilkan nilai MAPE 0.3471, dan nilai sMAPE 0.2563. Dalam hal ini, Anda dapat melihat bahwa ruang penelusuran hyperparameter yang lebih kecil sebenarnya memberikan akurasi perkiraan yang lebih tinggi. Salah satu alasannya adalah karena algoritma auto.ARIMA hanya melakukan penyesuaian hyperparameter untuk modul tren di seluruh pipeline pemodelan. Model ARIMA terbaik yang dipilih oleh algoritma auto.ARIMA mungkin tidak memberikan hasil perkiraan terbaik untuk seluruh pipeline.

Membuat model untuk memperkirakan beberapa deret waktu dengan ruang penelusuran hyperparameter yang lebih kecil dan strategi pelatihan yang cepat dan cerdas

Pada langkah ini, Anda akan menggunakan ruang penelusuran hyperparameter yang lebih kecil dan strategi pelatihan cerdas cepat menggunakan satu atau beberapa opsi pelatihan max_time_series_length, max_time_series_length, atau time_series_length_fraction.

Meskipun pemodelan berkala seperti tren musiman memerlukan jumlah titik waktu tertentu, pemodelan tren memerlukan titik waktu yang lebih sedikit. Sementara itu, pemodelan tren jauh lebih mahal secara komputasi daripada komponen deret waktu lainnya seperti musiman. Dengan opsi pelatihan cepat di atas, Anda dapat membuat model komponen tren secara efisien dengan subset deret waktu, sedangkan komponen deret waktu lainnya menggunakan seluruh deret waktu.

Contoh berikut menggunakan opsi max_time_series_length untuk menyelesaikan pelatihan yang cepat. Dengan menetapkan nilai opsi max_time_series_length ke 30, hanya 30 titik waktu terbaru yang digunakan untuk membuat model komponen tren. Semua 383 deret waktu masih digunakan untuk membuat model komponen non-tren.

Ikuti langkah-langkah berikut untuk membuat model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    CREATE OR REPLACE MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`
    OPTIONS
      (model_type = 'ARIMA_PLUS',
      time_series_timestamp_col = 'date',
      time_series_data_col = 'num_trips',
      time_series_id_col = 'start_station_name',
      auto_arima_max_order = 2,
      max_time_series_length = 30
      ) AS
    SELECT *
    FROM `bqml_tutorial.nyc_citibike_time_series`
    WHERE date < '2016-06-01';

    Kueri membutuhkan waktu sekitar 35 detik untuk menyelesaikannya. Proses ini 3x lebih cepat dibandingkan dengan kueri yang Anda gunakan di bagian Membuat model untuk memperkirakan beberapa deret waktu dengan ruang penelusuran hyperparameter yang lebih kecil. Karena overhead waktu yang konstan untuk bagian non-pelatihan pada kueri, seperti pemrosesan data, perolehan kecepatan akan jauh lebih tinggi jika jumlah deret waktu jauh lebih besar daripada dalam contoh ini. Untuk satu juta deret waktu, pertambahan kecepatan mendekati rasio panjang deret waktu dan nilai opsi max_time_series_length. Dalam hal ini, peningkatan kecepatan lebih besar dari 10x.

Mengevaluasi akurasi perkiraan untuk model dengan ruang penelusuran hyperparameter yang lebih kecil dan strategi pelatihan yang cepat dan cerdas

Ikuti langkah-langkah berikut untuk mengevaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    SELECT
      AVG(mean_absolute_percentage_error) AS MAPE,
      AVG(symmetric_mean_absolute_percentage_error) AS sMAPE
    FROM
      ML.EVALUATE(MODEL `bqml_tutorial.nyc_citibike_arima_model_max_order_2_fast_training`,
        TABLE `bqml_tutorial.nyc_citibike_time_series`,
        STRUCT(7 AS horizon, TRUE AS perform_aggregation));

Kueri ini menampilkan nilai MAPE dari 0.3515, dan nilai sMAPE dari 0.2473.

Ingat bahwa tanpa penggunaan strategi pelatihan yang cepat, akurasi perkiraan akan menghasilkan nilai MAPE sebesar 0.3337 dan nilai sMAPE sebesar 0.2337. Perbedaan antara dua kumpulan nilai metrik adalah dalam 3%, yang secara statistik tidak signifikan.

Singkatnya, Anda telah menggunakan ruang penelusuran hyperparameter yang lebih kecil dan strategi pelatihan yang cepat dan cerdas untuk membuat pelatihan model Anda lebih dari 20x lebih cepat tanpa mengorbankan akurasi perkiraan. Seperti yang disebutkan sebelumnya, dengan lebih banyak deret waktu, peningkatan kecepatan oleh strategi pelatihan cepat yang cerdas dapat jauh lebih tinggi. Selain itu, library ARIMA dasar yang digunakan oleh model ARIMA_PLUS telah dioptimalkan untuk berjalan 5x lebih cepat dari sebelumnya. Bersama-sama, keuntungan ini memungkinkan perkiraan jutaan deret waktu dalam hitungan jam.

Membuat model untuk memperkirakan satu juta deret waktu

Pada langkah ini, Anda memperkirakan penjualan minuman keras untuk lebih dari 1 juta produk minuman keras di berbagai toko menggunakan data penjualan minuman keras publik Iowa. Pelatihan model ini menggunakan ruang penelusuran hyperparameter yang kecil serta strategi pelatihan yang cepat dan cerdas.

Ikuti langkah-langkah berikut untuk mengevaluasi model:

  1. Di Konsol Google Cloud, buka halaman BigQuery.

    Buka BigQuery

  2. Di editor kueri, tempel kueri berikut dan klik Jalankan:

    CREATE OR REPLACE MODEL
      `bqml_tutorial.liquor_forecast_by_product`
    OPTIONS(
      MODEL_TYPE = 'ARIMA_PLUS',
      TIME_SERIES_TIMESTAMP_COL = 'date',
      TIME_SERIES_DATA_COL = 'total_bottles_sold',
      TIME_SERIES_ID_COL = ['store_number', 'item_description'],
      HOLIDAY_REGION = 'US',
      AUTO_ARIMA_MAX_ORDER = 2,
      MAX_TIME_SERIES_LENGTH = 30
    ) AS
    SELECT
      store_number,
      item_description,
      date,
      SUM(bottles_sold) as total_bottles_sold
    FROM
      `bigquery-public-data.iowa_liquor_sales.sales`
    WHERE date BETWEEN DATE("2015-01-01") AND DATE("2021-12-31")
    GROUP BY store_number, item_description, date;

    Kueri membutuhkan waktu sekitar 1 jam 16 menit untuk menyelesaikannya.

Pembersihan

Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus resource satu per satu.

  • Anda dapat menghapus project yang dibuat.
  • Atau, Anda dapat menyimpan project dan menghapus set data.

Menghapus set data

Jika project Anda dihapus, semua set data dan semua tabel dalam project akan dihapus. Jika ingin menggunakan kembali project tersebut, Anda dapat menghapus set data yang dibuat dalam tutorial ini:

  1. Jika perlu, buka halaman BigQuery di konsol Google Cloud.

    Buka halaman BigQuery

  2. Di navigasi, klik set data bqml_tutorial yang Anda buat.

  3. Klik Hapus set data untuk menghapus set data, tabel, dan semua data.

  4. Pada dialog Hapus set data, konfirmasi perintah hapus dengan mengetikkan nama set data Anda (bqml_tutorial), lalu klik Hapus.

Menghapus project Anda

Untuk menghapus project:

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Langkah selanjutnya