その他

ニューラルネットワークで積雪深を予測してみた(再チャレンジ)

その他
この記事は約6分で読めます。

はじめに

こんにちは。

新卒で入社してから早いことに4ヶ月が経とうとしています。

入社してから技術に関する記事を公開していますが、除雪に関する記事を数えてると10本公開していました!

さて、一度ニューラルネットワークで積雪深を推定するということをやっているのですが、もう一度やりたいので、ぜひお付き合いいただけますと幸いです!

今回やること

冒頭でも触れましたが、今回の取り組みの主な目的は、PyTorchでニューラルネットワークを構築し、それを自由にカスタマイズすることです。

特に、モデル構造や学習の設定を柔軟に調整しながら、積雪深の予測精度をどこまで向上できるかを探ることを目指します。

実装

PyTorchでニューラルネットワークを構築

冒頭で紹介したURLでは、以前に scikit-learn を用いてニューラルネットワークを実装していました。

scikit-learnは手軽に機械学習モデルを構築できる反面、モデル構造のカスタマイズや柔軟な設計には限界があります。

model = MLPRegressor(hidden_layer_sizes=(128, 64, 32), activation="relu", solver="adam", alpha=0.002, learning_rate_init=0.001, random_state=60, early_stopping=True, max_iter=epochSize)

現在のデータセットは十分な量とはいえないため、モデルを柔軟に拡張できる環境が求められました。

そこで、今回は PyTorch を採用し、ニューラルネットワークを一から構築することにしました。

class neuralnetwork(nn.Module):
    def __init__(self, input_size=13, output_size=1):
        super(neuralnetwork, self).__init__()
        
        self.model = nn.Sequential(
            nn.Linear(input_size, 128),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(128, 64),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(64, 32),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(32, 16),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(16, output_size)
        )

    def forward(self, x):
        return self.model(x)

PyTorchでは、Dropout層やLinear層などを自由に設計・追加できるため、モデルの表現力を調整しながら試行錯誤することが可能です。

特に、今回のポイントである Dropout層 は、中間層の出力のうち 20%をランダムに0にすることで、過学習を防止する効果があります。

これにより、訓練データに依存しすぎることなく、実運用時のデータ(未知のデータ)に対しても安定した予測性能が期待できるというメリットがあります。

データセットの拡張

これまでに収集したデータは、「月」「日」「現地気圧」「海面気圧」「降水量」「気温」「湿度」「最大風速」「風向」「降雪量」「前日積雪深との差」の11項目でしたが、新たに日照時間と合計日射量を追加した13項目としました。

これらの気象データはいずれも、2016年から2025年までの約10年分を収集しており、学習に必要なデータ量としては十分であると考えています。

気象庁|過去の気象データ・ダウンロード
気象庁が提供するページです

学習と評価

450エポックで学習をした結果、以下のような学習結果となりました。

この結果から、300エポックあたりで学習が収束していることがわかります。

また、評価指標として用いた RMSE は以下の通りです

・訓練データ:6.093 cm
・テストデータ:11.105 cm

訓練とテストで約5 cmの差が生じており、これはやや過学習の兆候と考えられます。
この原因としては以下のいずれか、または両方が考えられます:

・データのばらつきが大きい
・全体的なデータ量が不足している

ただし、Train RMSEは前回よりも改善しており、学習自体は順調に進んだと言えます。

一方で、実際の予測(本番環境)でこのモデルが安定して機能するかどうかについては、まだ慎重な検証が必要だと感じています。

特に、積雪深のような気象系データは年や地域によって大きく変動するため、今後は より多様なデータセットでの検証などを検討していく必要がありそうです。

おわりに

いかがでしたでしょうか?

データ量が十分に整っている場合は、手軽にモデル構築ができる scikit-learn でも十分に対応可能である一方で、モデル構造を柔軟に設計したい場合や、精度向上のために学習器の細かなカスタマイズを行いたい場合は、PyTorchによる実装が有効だということが示唆されました。

特に今回のように、データにばらつきがあり、モデルの柔軟性が求められるケースでは、PyTorchを用いたアプローチの方が適していると感じました。

今回作成したソースコードは下記のURLから使用することができます。

snowdepth_regression/snowdepth_neuralnetwork_pytorch at main · morishitaimpl/snowdepth_regression
回帰分析で積雪深を求める. Contribute to morishitaimpl/snowdepth_regression development by creating an account on GitHub.

今後の課題

今後はデータ量を増やしつつ、整えていくことを第一に動いていく予定です。

さらに、2015年から今日までの全国的な衛星画像データを公開しているリンクを見つけたので、これを有効活用して積雪深を予測することができないか試してみたいと思います。

過去の天気(天気図・2016年07月) - tenki.jp
過去天気の天気図では、天気図(2016年07月)の過去の気象情報を確認できます。エリア・日付でわかりやすく整理されています。

参考URL

Build the Neural Network — PyTorch Tutorials 2.7.0+cu126 documentation
【ニューラルネットワーク】Dropout(ドロップアウト)についてまとめる - Qiita
以下の記事は自身のブログData Science Struggleでも掲載予定。許可なき掲載とかではない。 概略 深層学習における技法の一つであるDropout(ドロップアウト)についての論文を読んだので、その仕組みを簡単にまとめる。 Dropoutに関する論文を読んだの...
気象庁|過去の気象データ・ダウンロード
気象庁が提供するページです