arrow_back

BQML の回帰モデルを使用した自転車レンタル時間の予測

ログイン 参加
700 以上のラボとコースにアクセス

BQML の回帰モデルを使用した自転車レンタル時間の予測

ラボ 1時間 universal_currency_alt クレジット: 5 show_chart 上級
info このラボでは、学習をサポートする AI ツールが組み込まれている場合があります。
700 以上のラボとコースにアクセス

概要

BigQuery は、Google が提供する低コスト、NoOps のフルマネージド分析データベースです。BigQuery では、インフラストラクチャを所有して管理したりデータベース管理者を置いたりすることなく、テラバイト単位の大規模なデータでクエリを実行できます。また、SQL が採用されており、従量課金制というメリットもあります。そのため、ユーザーは有用な情報を得るためのデータの分析に専念することができます。

BigQuery の機能である BigQuery 機械学習を使用すれば、データア ナリストは最小限のコーディングで機械学習モデルの作成、トレーニング、評価、予測が可能になります。

このラボでは、ロンドンの自転車データセットを使用して、レンタル時間を予測する回帰モデルを BigQuery ML で構築します。耐久性の高い通勤用自転車と、スピードは出るものの壊れやすいロードバイクの 2 種類の自転車の在庫を持つ自転車レンタル会社を営んでいるとします。自転車レンタル時間が長時間になる可能性がある場合は、ロードバイクの在庫が必要ですが、短時間になる可能性がある場合は、通勤用自転車の在庫が必要です。したがって、自転車の適切な在庫を保持するシステムを構築するには、自転車レンタル時間を予測する必要があります。

目標

このラボでは、次のタスクの実行方法について学びます。

  • ロンドンの自転車データセットに対してクエリを実行して調査し、特徴量エンジニアリングを行う
  • BigQuery ML の線形回帰モデルを作成する
  • 機械学習モデルの性能を評価する
  • モデルの重みを抽出する

必要なもの

  • Google Cloud プロジェクト
  • Google Chrome や Mozilla Firefox などのブラウザ

設定と要件

各ラボでは、新しい Google Cloud プロジェクトとリソースセットを一定時間無料で利用できます。

  1. Qwiklabs にシークレット ウィンドウでログインします。

  2. ラボのアクセス時間(例: 1:15:00)に注意し、時間内に完了できるようにしてください。
    一時停止機能はありません。必要な場合はやり直せますが、最初からになります。

  3. 準備ができたら、[ラボを開始] をクリックします。

  4. ラボの認証情報(ユーザー名パスワード)をメモしておきます。この情報は、Google Cloud Console にログインする際に使用します。

  5. [Google Console を開く] をクリックします。

  6. [別のアカウントを使用] をクリックし、このラボの認証情報をコピーしてプロンプトに貼り付けます。
    他の認証情報を使用すると、エラーが発生したり、料金の請求が発生したりします。

  7. 利用規約に同意し、再設定用のリソースページをスキップします。

BigQuery コンソールを開く

  1. Google Cloud Console で、ナビゲーション メニュー > [BigQuery] を選択します。[Cloud Console の BigQuery へようこそ] メッセージ ボックスが開きます。このメッセージ ボックスにはクイックスタート ガイドへのリンクと、UI の更新情報が表示されます。
  2. [完了] をクリックします。

タスク 1. 特徴量エンジニアリング用に自転車データを調べる

ML の問題を解決するために行う最初のステップは、ML モデルの策定、つまり、モデルの特徴量とラベルを決めることです。最初のモデルの目標は、自転車レンタルの履歴データセットに基づいてレンタル時間を予測することであるため、ラベルはレンタル時間になります。

自転車がレンタルされるステーション、曜日、時刻に応じてレンタル時間が異なると考える場合は、これらを特徴量とすることができます。ただし、これらの特徴量を使用してモデルを作成する前に、こうした要素がラベルに影響を与えることを確認することをおすすめします。

機械学習モデルのための特徴量を見つけ出すことを、特徴量エンジニアリングと呼びます。特徴量エンジニアリングは、多くの場合、正確な ML モデルを構築するうえで特に重要な部分であり、使用するアルゴリズムの決定やハイパーパラメータの調整よりも大きな影響を与える可能性があります。優れた特徴量エンジニアリングのためには、データとドメインに関する深い理解が必要です。多くの場合、それは仮説テストのプロセスです。つまり、ある特徴量を思いついたら、それがうまく機能するか(ラベルとの間に相互情報量があるか)を確認してから、モデルに追加します。機能しない場合は、別の特徴量を検討します。

ステーションによる影響

レンタル時間がステーションごとに異なるかどうかを確認するには、データポータルで次のクエリの結果を可視化します。

  1. 次のクエリをコピーしてクエリエディタに貼り付けます。
SELECT start_station_name, AVG(duration) AS duration FROM `bigquery-public-data`.london_bicycles.cycle_hire GROUP BY start_station_name
  1. [実行] をクリックします。
  2. Cloud コンソールの BigQuery で、[データを探索] > [データポータルで調べる] をクリックします。
  3. プロンプトが表示されたら、[使ってみる] ボタンを選択します。
  4. Google データポータルにデータへのアクセスを許可するかどうかを尋ねられたら、[承認] を選択します。
注:「データに接続できません」というメッセージが表示されたら、[戻る] をクリックします。次に [データポータル エクスプローラを保存] で [保存] をクリックします。
  1. [グラフ] タブで [縦棒グラフ] を選択します。

  2. 右側のメニューの [データ] タブで、次のように設定します。

  • ディメンション: start_station_name
  • 指標: duration
  • 並べ替え: duration降順
  • グラフ インタラクション: [クロス フィルタリング] と [並べ替えを変更] の両方を有効化
  1. 右側のメニューの [スタイル] タブで、次のように設定します。
  • 棒グラフ:
  • 棒の数: 100
  • 軸: 軸を表示する

次のようなプロットになります。

選択した設定、データ、スタイルと一致するようなプロット。

いくつかのステーションに長いレンタル時間(3,000 秒以上)が関連付けられていることがわかります。しかし、大部分のステーションでのレンタル時間は、比較的狭い範囲内です。ロンドンのすべてのステーションに狭い範囲内のレンタル時間が関連していることから、レンタルが開始されたステーションは特徴量として適切ではありません。しかしこの問題においては、グラフが示すように、start_station_name が重要です。

自転車がレンタルされた時点には、どこに返却されるかは予測できないため、end_station_name は特徴量として使用できません。将来のイベントを予測する機械学習モデルを作成する際は、予測を行う時点で未知の列を使用しないように注意する必要があります。この時間と因果関係の条件により、使用できる特徴量が制限されます。

曜日と時刻による影響

次の特徴量の候補についても、プロセスは同様です。dayofweek(または、同様に hourofday)が重要かどうかを確認できます。

  1. クエリエディタ ウィンドウに次のクエリを貼り付けます。
SELECT EXTRACT(dayofweek FROM start_date) AS dayofweek, AVG(duration) AS duration FROM `bigquery-public-data`.london_bicycles.cycle_hire GROUP BY dayofweek
  1. データをデータポータルで可視化します。曜日については、次のように可視化されます。

Y 軸にレンタル時間(0~2k)、X 軸に曜日(1~7)を示す棒グラフ。

時刻については、次のように可視化されます。

X 軸に曜日ではなく時刻を示す、細分化された棒グラフ。

曜日によっても時刻によっても、レンタル時間が異なることがわかります。平日よりも週末(1 日目と 7 日目)の方が、レンタル時間が長いようです。同様に、早朝と午後の半ばにレンタル時間が長くなります。したがって、dayofweekhourofday は両方とも特徴量の候補として適切です。

自転車台数による影響

その他の特徴量の候補としてステーションの自転車台数があります。自転車をレンタルしたステーションの自転車台数が少ない場合、自転車をより長時間借りたままにしておくと仮定します。

  1. クエリエディタ ウィンドウに次のクエリを貼り付けます。
SELECT bikes_count, AVG(duration) AS duration FROM `bigquery-public-data`.london_bicycles.cycle_hire JOIN `bigquery-public-data`.london_bicycles.cycle_stations ON cycle_hire.start_station_name = cycle_stations.name GROUP BY bikes_count
  1. データをデータポータルで可視化します。

Y 軸にレンタル時間(0~2.8k)、X 軸に bike_count(0~50)を示す棒グラフ。

関係には目に見える傾向がなく有用な情報を示していない(時刻などと比較して)ことがわかります。これは、自転車台数が特徴量の候補として適切ではないことを示しています。

タスク 2. トレーニング データセットを作成する

自転車データセットと、さまざまな列とラベル列との関係の調査結果に基づき、選択した特徴量とラベルを抽出することによってトレーニング データセットを準備できます。

SELECT duration, start_station_name, CAST(EXTRACT(dayofweek FROM start_date) AS STRING) AS dayofweek, CAST(EXTRACT(hour FROM start_date) AS STRING) AS hourofday FROM `bigquery-public-data`.london_bicycles.cycle_hire

特徴量列は数値(INT64、FLOAT64 など)またはカテゴリ(STRING)のいずれかである必要があります。特徴量が数値であるものの、カテゴリとして扱う必要がある場合は、その数値を文字列に型変換する必要があります。整数である dayofweekhourofday 列(それぞれ 1~7 と 0~23 の範囲)を文字列に型変換しているのはこのためです。

データを準備する際に計算コストが高い変換や結合が行われる場合は、テスト中に同じ作業を繰り返さなくても済むように、準備したトレーニング データをテーブルとして保存しておくことをおすすめします。変換は簡単でも、クエリ自体の実行時間が長い場合は、クエリをビューとして保存しておくと、繰り返し作業を回避できます。

ここで扱うクエリはシンプルで短いため、保存は行いません(煩雑さを避けるため)。

  1. モデルを格納する bike_model というデータセットを BigQuery で作成します。
  2. トレーニングに使用するデータが EU 内にあるため、[データのロケーション] を [EU] リージョンに設定します。
  3. [データセットを作成] をクリックします。

[データセットの作成] ページ。[データセット ID]、データ ロケーションの各欄が入力されており、テーブルの有効期限がなしに設定されている。

ML モデルをトレーニングしてデータセット bike_model に保存するために、CREATE TABLE と同様に動作する CREATE MODEL を呼び出します。予測を行おうとしているラベルが数値であるため、これは回帰問題です。このため、OPTIONS では linear_reg をモデルタイプとして選択するのが最適です。

  1. 次のクエリをクエリエディタに入力します。
CREATE OR REPLACE MODEL bike_model.model OPTIONS (input_label_cols=['duration'], model_type='linear_reg') AS SELECT duration, start_station_name, CAST(EXTRACT(dayofweek FROM start_date) AS STRING) AS dayofweek, CAST(EXTRACT(hour FROM start_date) AS STRING) AS hourofday FROM `bigquery-public-data`.london_bicycles.cycle_hire

モデルのトレーニングには 2~3 分かかります。

  1. モデル トレーニングに関連するいくつかの指標を確認するには、BigQuery エディタ ウィンドウで次のクエリを入力します。
SELECT * FROM ML.EVALUATE(MODEL `bike_model.model`)

平均絶対誤差は 1,025 秒(約 17 分)です。つまり、自転車レンタル時間を、約 17 分の平均誤差で予測可能であると期待できます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 トレーニング データセットを作成する

タスク 3. 特徴量エンジニアリングによりモデルを改良する

曜日を統合する

見つけた特徴量を別の方法で表すことができます。たとえば、レンタルの dayofweekduration の関係を調べた際に、平日よりも週末のほうがレンタル時間が長いことがわかりました。したがって、dayofweek の未加工の値を特徴量として扱う代わりに、複数の dayofweek の値を統合して weekday カテゴリに統合することで、この分析情報を使用できます。

  1. 統合した曜日の特徴量を使用した次のクエリを実行して、BigQuery ML モデルを構築します。
CREATE OR REPLACE MODEL bike_model.model_weekday OPTIONS (input_label_cols=['duration'], model_type='linear_reg') AS SELECT duration, start_station_name, IF (EXTRACT(dayofweek FROM start_date) BETWEEN 2 AND 6, 'weekday', 'weekend') AS dayofweek, CAST(EXTRACT(hour FROM start_date) AS STRING) AS hourofday FROM `bigquery-public-data`.london_bicycles.cycle_hire
  1. このモデルの指標を確認するには、BigQuery エディタ ウィンドウに次のクエリを入力します。
SELECT * FROM ML.EVALUATE(MODEL `bike_model.model_weekday`)

このモデルの平均絶対誤差は、元のモデルの 1,025 秒より小さい 966 秒になり、モデルを改良することができました。

時刻をバケット化する

hourofdayduration の関係に基づいて、変数を (-inf,5)、[5,10)、[10,17)、[17,inf) の 4 つのビンにバケット化してみましょう。

  1. バケット化した時刻と、統合した曜日の特徴量を使用した次のクエリを実行して、BigQuery ML モデルを構築します。
CREATE OR REPLACE MODEL bike_model.model_bucketized OPTIONS (input_label_cols=['duration'], model_type='linear_reg') AS SELECT duration, start_station_name, IF (EXTRACT(dayofweek FROM start_date) BETWEEN 2 AND 6, 'weekday', 'weekend') AS dayofweek, ML.BUCKETIZE(EXTRACT(hour FROM start_date), [5, 10, 17]) AS hourofday FROM `bigquery-public-data`.london_bicycles.cycle_hire
  1. このモデルの指標を確認するには、BigQuery エディタ ウィンドウに次のクエリを入力します。
SELECT * FROM ML.EVALUATE(MODEL `bike_model.model_bucketized`)

このモデルの平均絶対誤差は、weekday-weekend モデルの 966 秒より小さい 904 秒になり、モデルをさらに改良することができました。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 特徴量エンジニアリングによりモデルを改良する

タスク 4. 予測を実行する

ここまで作成してきたモデルには、いくつかのデータ変換が含まれています。トレーニング時に行われた一連の変換が BigQuery で記憶され、予測時に自動的に適用されると便利でしょう。そこで、TRANSFORM 句を使用してみます。

この場合、作成したモデルには、duration を予測するための start_station_namestart_date が必要です。変換が保存され、指定された元データに対して実行されて、モデルに入力する特徴量が作成されます。前処理関数をすべて TRANSFORM 句内に配置する主な利点は、モデルのクライアントがどのような前処理が実行されたかを知る必要がないということです。

  1. バケット化した時刻と、統合した曜日の特徴量を TRANSFORM 句に使用した次のクエリを実行して、BigQuery ML モデルを構築します。
CREATE OR REPLACE MODEL bike_model.model_bucketized TRANSFORM(* EXCEPT(start_date), IF (EXTRACT(dayofweek FROM start_date) BETWEEN 2 AND 6, 'weekday', 'weekend') AS dayofweek, ML.BUCKETIZE(EXTRACT(HOUR FROM start_date), [5, 10, 17]) AS hourofday ) OPTIONS (input_label_cols=['duration'], model_type='linear_reg') AS SELECT duration, start_station_name, start_date FROM `bigquery-public-data`.london_bicycles.cycle_hire
  1. TRANSFORM 句を配置して、Park Lane での現時点からのレンタル時間を予測する次のクエリを入力します(結果はそれぞれ異なります)。
SELECT * FROM ML.PREDICT(MODEL bike_model.model_bucketized, ( SELECT 'Park Lane , Hyde Park' AS start_station_name, CURRENT_TIMESTAMP() AS start_date) )

predicted_duration、start_station_name、start-date の情報が表示されたクエリ結果。

  1. トレーニング セットのサンプルの 100 行でバッチ予測を行うには、次のクエリを使用します。
SELECT * FROM ML.PREDICT(MODEL bike_model.model_bucketized, ( SELECT start_station_name, start_date FROM `bigquery-public-data`.london_bicycles.cycle_hire LIMIT 100) )

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 予測を行う

タスク 5. モデルの重みを調べる

線形回帰モデルでは、入力に重みが組み合わされた合計として出力が予測されます。多くの場合、本番環境でモデルの重みを使用する必要があります。

  • 次のクエリを使用して、モデルの重みを調べます(またはエクスポートします)。

    SELECT * FROM ML.WEIGHTS(MODEL bike_model.model_bucketized)

    数値特徴量には単一の重みが課せられ、カテゴリ特徴量には存在する可能性のある値ごとの重みが課せられます。たとえば、特徴量 dayofweek には次の重みがあります。

    特徴の入力名である processed_input の値「dayofweek」の重みとして「null」が表示されているクエリ結果。

    つまり、平日の場合、予測レンタル時間全体に対するこの特徴量の割り当ては 1,709 秒です(最適なパフォーマンスを提供する重みは一意ではありません。そのため、異なる値が得られる場合があります)。

    [進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 モデルの重みを調べる

ラボを終了する

ラボでの学習が完了したら、[ラボを終了] をクリックします。ラボで使用したリソースが Qwiklabs から削除され、アカウントの情報も消去されます。

ラボの評価を求めるダイアログが表示されたら、星の数を選択してコメントを入力し、[送信] をクリックします。

星の数は、それぞれ次の評価を表します。

  • 星 1 つ = 非常に不満
  • 星 2 つ = 不満
  • 星 3 つ = どちらともいえない
  • 星 4 つ = 満足
  • 星 5 つ = 非常に満足

フィードバックを送信しない場合は、ダイアログ ボックスを閉じてください。

フィードバック、ご提案、修正が必要な箇所については、[サポート] タブからお知らせください。

Copyright 2020 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。

始める前に

  1. ラボでは、Google Cloud プロジェクトとリソースを一定の時間利用します
  2. ラボには時間制限があり、一時停止機能はありません。ラボを終了した場合は、最初からやり直す必要があります。
  3. 画面左上の [ラボを開始] をクリックして開始します

シークレット ブラウジングを使用する

  1. ラボで使用するユーザー名パスワードをコピーします
  2. プライベート モードで [コンソールを開く] をクリックします

コンソールにログインする

    ラボの認証情報を使用して
  1. ログインします。他の認証情報を使用すると、エラーが発生したり、料金が発生したりする可能性があります。
  2. 利用規約に同意し、再設定用のリソースページをスキップします
  3. ラボを終了する場合や最初からやり直す場合を除き、[ラボを終了] はクリックしないでください。クリックすると、作業内容がクリアされ、プロジェクトが削除されます

このコンテンツは現在ご利用いただけません

利用可能になりましたら、メールでお知らせいたします

ありがとうございます。

利用可能になりましたら、メールでご連絡いたします

1 回に 1 つのラボ

既存のラボをすべて終了して、このラボを開始することを確認してください

シークレット ブラウジングを使用してラボを実行する

このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウントの競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。