俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

【2位解法】SIGNATE開催CDLEハッカソン2020予測性能部門 「画像データに基づく気象予測」の振り返り。

SIGNATEで開催されたCDLEハッカソン2020予測性能部門 「画像データに基づく気象予測」(SIGNATE開催)に参加し、2位の成績を残せました!

今回は、PublicLB、PrivateLBともに2位で、Shakeなしでした。初めての時系列データコンペで、初めての衛星画像データを使ったコンペでしたが、過去のフォーラム等を参考にさせていただきながら、なんとかやり切ることができました!

この夏は、並行して複数のコンペに取り組んでいたのですが、最も力を注いでいたコンペで、結果を残すことができ、一生忘れられない夏になりました。

f:id:kanriyou_h004:20200904185232p:plain

今回のコンペは、G検定、E資格取得者が入会できるCDLEの会員のみが参加できるクローズドのコンペでした。

有資格者の方々が参戦する中で、結果を残すことができたのは、私にとても大きな自信に繋がりました。

では、振り返って参りたいと思います。

1.全体構成

今回は、初めての時系列データかつ衛星画像データからの予測画像データ作成ということで、何から手をつけて良いかわからず途方にくれていました。

そんな中、「昨年開催時のフォーラムページには、当時の参加者の解法が記載されています。これらの情報を参考にしてさらなる高性能なアルゴリズムを開発しましょう。」という案内があり、フォーラムページと、入賞者レポートを徹底的に読み込みました。

その中で、温度や湿度など気象情報も画像データの1chとして入力に取り込んだり、風の向きを正負に分けて別chの入力としたりして3位を獲得されていたashenOneさんの解法を参考にさせていただきながら取り組みました。

ashenOneさんの解法からの変更点は以下のとおりです。

f:id:kanriyou_h004:20200904194631p:plain

効果がでたのは、1−SSIMを損失関数にしたのと、アンサンブルを実施した際に、算術平均ではなく幾何平均をとったことでした。

全体構成図としては以下のとおりです。

【俺人解法構成図】

f:id:kanriyou_h004:20200905200614p:plain

スタッキングや、加重平均なども試みましたが、なかなか良い精度が出ず、最終的に上記の構成となりました。

2.前処理

前処理についてはashenOneさんの解法を参考にさせていただき、以下のような処理を行いました。

衛星画像のデータと、気象情報のデータをいかに組み合わせるかというところがポイントでした。

また、画像データについては、1/4,1/6,1/8の異なるサイズを入力することでデータのバリエーションを作りました。

【衛星画像データ】

種類 処理内容
欠測補完

衛星画像の欠測には2パターンありました。

1つは、特定の時間帯の衛星画像がないパターンで、もう1つは、衛星画像はあるけれども、画像の一部がないパターンでした。

これらの欠測補完は、単純に前後の画像の値の平均値で補完しました。

縮小

画像サイズを1/4、1/6、1/8に縮小して、24時間分を1日分のデータとして保存。

1/10、1/12、1/15の縮小サイズも作成したが、アンサンブルした際にMAEは向上したものの、SSIMが下がってしまったので、採用しませんでした。

 

【気象データ】

種類 処理内容
「気温」、「湿度」、「海面気温」

区分ごとの最大値・最小値を取得して、最小値0、最大値1となるように正規化。

気象データは、3時間ごとのデータしかなかったので、前後のデータから線形に変化した前提で、間の時間のデータを補完。

「東西風」、「南北風」、「鉛直風」

区分ごとの最大値・最小値を取得して、最小値0、最大値1となるように正規化。

気温とは異なり、正負があるので、正と負に分けて保存。

気象データは、3時間ごとのデータしかなかったので、前後のデータから線形に変化した前提で、間の時間のデータを補完。


3.モデル構築

 今回は、モデル構築には、ニューラルネットワークを採用して、損失関数のを工夫しました。損失関数を変更することで、以下の通りPublic Scoreが向上したため、1-SSIMを採用しました。

f:id:kanriyou_h004:20200905205631p:plain

4.アンサンブル

アンサンブルにあたっては、最適な【入力の縮小サイズの組み合わせ】の検証と、最適な【アンサンブル手法】の検証のために、算術平均、幾何平均、加重平均、スタッキングを検証しました。

それぞれ、以下の通りとなり、最終的に1/4、1/6、1/8の縮小サイズで学習済モデルの予測結果を、幾何平均を採用しました。

 【入力の縮小サイズの組み合わせ】

入力の縮小サイズの組み合わせとしては、各入力個数ごとに最もScoreが高かった組み合わせを比較して、さらにその中で最もScoreが高かった1/4、1/6、1/8の3種類の入力を採用しました。

f:id:kanriyou_h004:20200906161737p:plain

【アンサンブルの手法】

アンサンブルの手法の比較結果としては以下の通りです。

加重平均とスタッキングについては、訓練時に検証用につかったデータの予測値を使って最適な荷重の探索や、LGBMの学習を行いました。

スタッキングについては、CVの時点でよい結果が得られなかったので、サブミット数の消費を抑えるために提出しませんでした。。。

f:id:kanriyou_h004:20200906162700p:plain

5.感想

今年の夏は、なかなか外出することもできず、自宅で過ごす時間が多く、今回のハッカソンのような学習機会に恵まれたことは、非常に有意義でした。

特に、いままで経験してこなかった課題に取り組めたことや、新たな知識を得られたことで次回に向けた意欲・モチベーションが向上できたことは、今後の私の人生に大きな一歩となりました。

まだまだ、理論が理解できていない部分が多く、多くの課題が残りましたので、引き続き、日々の勉強を続けてまいりたいと思います。

6.謝辞

最後となってしまいましたが、ハッカソンを運営してくださいました、JDLA、SIGNATE の運営の皆様、データをご提供くださいました株式会社ウェザーニューズの皆様、一緒にハッカソンに取り組んでいらっしゃった皆様に心より感謝申し上げます。

また、ashenOneさんの解法のおかげで、難解な課題について、取り組むべき方向性が示され、2位の予測性能を出すことができました。この場を借りて御礼申し上げます。

私も、これから様々な課題に取り組む皆様に、解決の一助となるような情報を発信できるよう、精進していきたいと思います。

 

【過去記事】

G検定、E資格の取得から、これまでに取り組んできた道のりは以下にまとめております。何かのご参考にしていただければ幸いです。

oregin-ai.hatenablog.com