🐕

GCPを利用した基盤構築及びデータ取得作業の定期実行について②

2022/09/16に公開

はじめに

これは前回の記事の続きとなっており、GCPで集めたデータを利用し、bigquery上で機械学習を試したことについての記事です。
https://zenn.dev/girigiri_cto/articles/f1d7d6a515ef3caf07aa
https://qiita.com/s_yaginuma/items/b692d3716dcb06416ce0

カラム変換 別のテーブルにエクスポートする

機械学習を行う前にテーブルについて注意点があったのでそれを記載します。
前回のPythonのコードではUTCの時刻をJSTに変換してcsvに保存・テーブルにインサートするという処理となっていました。
しかし、bigqueryではデフォルトの時刻がUTCとなっているためそのまま入れるとテーブルが自分の意図しない表記になってしまいます(CSVはそのままで大丈夫です)。

テーブルのプレビューで「2022-09-12 00:00:00 UTC」となるのですが、「2022-09-12 00:00:00」についてはJSTに変換済みの時刻のため「UTC」という表記を消す必要があります。
そのためカラム変換を行います。今回はデータ型をTimestampからDatetimeに変換し、その結果を別のテーブルにエクスポートするというやり方を取ってみました。

select CAST(time AS datetime) as time
      ,temp
      ,feels_like
      ,temp_min 
      ,temp_max
      ,pressure
      ,sea_level
      ,grnd_level
      ,humidity
      ,pop
      ,pod
      ,main
      ,description
      ,speed
      ,deg
      ,gust
from プロジェクト名.データセット名.モデル名
order by time asc;

これで処理結果が出るはずなので、「結果を保存」から「BigQueryテーブル」で結果を保存すれば大丈夫です。

モデル作成

今回は「2022-09-12T00:00:00~2022-09-16T21:00:00」の40件のデータを
・「2022-09-12T00:00:00~2022-09-15T21:00:00」(32件、トレーニングデータ)
・「2022-09-16T00:00:00~2022-09-16T21:00:00」(8件、テストデータ)
 に分けてみました。
後は、以下の通りにすればモデル作成、検証、テストデータ予測をできると思います。
※トレーニングデータを訓練データと検証データに分けたほうがより良いとは思います。

create model `データセット名.モデル名`
 options( model_type='linear_reg' # 線形回帰
         ,enable_global_explain=TRUE
         ,labels=['temp_max'] ) as # 目的変数
select temp
      ,feels_like
      ,temp_min
      ,temp_max
      ,speed
from `データセット名.テーブル名`
WHERE time BETWEEN '2022-09-12T00:00:00' AND '2022-09-15T21:00:00';

大体2分半くらい

モデル検証

SELECT *
FROM ML.EVALUATE(MODEL `プロジェクト名.データセット名.モデル名`
                  ,(select temp
                          ,feels_like
                          ,temp_min
                          ,temp_max
                          ,speed
                    from `データセット名.テーブル名`
                    WHERE time BETWEEN '2022-09-12T00:00:00' AND '2022-09-15T21:00:00'))

テストデータ予測

SELECT *
FROM ML.PREDICT(MODEL `プロジェクト名.データセット名.モデル名
                 ,(select time
                         ,temp
                         ,feels_like
                         ,temp_min
                         ,temp_max
                         ,speed
                   from `データセット名.テーブル名`
                   WHERE time BETWEEN '2022-09-16T00:00:00' AND '2022-09-16T21:00:00'))

まとめ

GCPではCloud Sheduler・Cloud Functions・Cloud Storage・Bigquery・Pub/Subなど様々なサービスを併用することでかなり作業を簡単に進めることが出来ると知り大変良い勉強になりました。
またSQLはデータ操作の言語だと思っていたのですが、Bigqueryで機械学習が出来るのは驚きました。
よりこういったものを使いこなせるようにこれからも学習していきたいと思います。

Discussion