BigQuery ML 機械学習で 2020年桜の開花日を予測する!Part 2

前編 Part 1 では気象庁のこれまでの気象データを活用して桜の開花日を予測した。冬の暖冬・厳冬傾向や直前の冷え込みなどをデータに反映させる工夫を施し有名な 400℃の法則・600℃の法則よりも高い予測をすることができたが、精度的にはまだまだ向上・改善させたい。さて、どうしていこうか?

BigQuery ML 機械学習で 2020年桜の開花日を予測する!Part 1

BQML K 平均法クラスタリングで各年をクラスタ分けする

ところで、前回見てもらった各年の開花日表の win と firstMar にさりげなくヒートマップを適用していたのにお気付きだろうか?

暖冬で直前も暖かい年、暖冬だったけど直前には冷え込んだ年 等々各年をどのように分類するとより良い結果が得られるだろうか?

こういう時はサンキーでビジュアライズするに限る。

 

  • 左側の最初のステップから順に冬の平均気温→開花直前の平均気温→開花時の累積平均気温と実際に桜が開花する際のタイムラインの順に並んでいる。
  • 秋冬の平均気温は昇順に並んでいる。
  • 秋冬寒くて直前も冷え込んだ年もあれば、暖冬に続いて春の訪れが早かった年もある。これはまちまちだ。

さあ、どんな傾向があるだろう?

  • 秋冬の平均気温が 7℃台と冬らしい冬だったシーズンはどれも累積平均気温は 400℃以下と少なめ。
  • ただし、累積平均気温 360〜380℃と 2番目に低いレンジだった年の秋冬平均気温は 8℃台ともう少し高め(それでも比較的寒かった冬と言えるだろう)

人間の脳と目で判断する限り、イマイチ分類の傾向や基準が分からず、、 ここは Machien Learning を頼ろう。BigQuery ML(BQML)の K 平均法クラスタリングで 4つのクラスタに分類させてみよう。

create or replace model `cherryBlossom.cherryAnal_kmeans_model`
options( 
  model_type = 'kmeans'
  ,num_clusters=4)
as(
SELECT
  cumAvg
  , cumMax
  , win
  , firstMar
FROM `cherryBlossom.cherryAnal`
)

クラスタの数は手動で 4つに設定した。num_clusters=4 の部分がそれだ。

BigQuery ML が解析して分類した 4つのクラスタは次のような傾向・基準で分類された。

言語化すると次のようになる。

Centroid Id クラスタの傾向
1 暖冬傾向だったが、逆に直前に冷え込むと累積気温が最大級に必要になる
2 冬寒い場合には直前に冷え込んでもそこまでの累積気温は必要にならない
3 冬しっかり寒く直前ポカポカだと累積気温は最も少なくて済む
4 暖冬の場合には直前暖かくても比較的多い累積気温が必要になる

実際どのように分類されるのか、モデルを実行してみよう。

 

得られた結果を表に貼ると次のようになった。

一番右に kluster という列を追加し、数字だとマズイので頭に k を付けて k1,k2,k3,k4 とした。これをラベルとして活用し、クラスタを明示的にデータに含める。どうなるか様子をみてみよう。

ロジスティック回帰モデルでの過去実績の予測

最終的に BigQuery ML での機械学習の為に用意したデータは kluster 列を加えて次のようになった。


これで学習と予測を行う。


今回は全年分予測させてみた。すると、


ドンピシャリが 13! それ以外でも前後 1日に収まった! 素晴らしい!!!

過去分に関しては目標の開花予測日付完全一致もしくは ±1日以内を達成できた。

 線形回帰モデルでの過去実績の予測

K 平均法クラスタリングでのラベルが非常に効果的だった。線形回帰ではどうなるだろう?


ロジスティック回帰モデルほどの精度は出なかったが、クラスタラベルなしの予測に比べれば劇的に改善することができた。

次の最終 Part 3 ではいよいよ 2020年今年の桜の開花日を予測してみよう。僕がどういう手法で予測したのか、そしてその結果を紹介する。

BigQuery ML 機械学習で 2020年桜の開花日を予測する!Part 3

各種 SNS アカウントでコメントできます