機械学習コンテストに出てみてる その1

概要

ここ最近、オプトという会社が運営する、DeepAnalyticsの機械学習コンテストに、出ています。
そのなかで、特に直近に開催されたコンテストについて、いろいろ可視化をしてみようと思います。

DeepAnalyticsとは、日本国内の機械学習コンテストのプラットフォームで、以下のようなものです。

  • 不定期に、いろんな題材の機械学習ネタがあり、いろんな人が応募しています。
  • コンテストに依りますが、1位の人には100万円くらいの賞金 が出たります。

今回、その中でも走行中の北陸新幹線車両台車部の着雪量推定モデルの作成というものについて、紹介します。

 

走行中の北陸新幹線車両台車部の着雪量推定モデルの作成

このコンテストでは、雪国を走る北陸新幹線の台車(ようするに、車輪のある周辺部分)に付着付着してしまう雪の量を予測しようというものです。

この雪が、走行中に線路上やその横に落ちてしまうと、後続の列車の運行や周辺の安全性に問題があるようなのです。

なので、事前に予測できたら、停車駅で落としておきたい、ということのようです。

 

着雪量モデルの予測
着雪量モデルの予測モデル

台車についた雪
台車についた雪

 

提供されている駅や観測点、トンネル位置などの情報を、以下のようにGoogle Mapで可視化しました。

 

 

金沢から富山に向かう経路では、山を越えるためにトンネルを通りますね。
トンネルの向こうとこちらでは、気象状況は違いが出そうです。

 

予測する内容

今回のお題では、

  • 北陸新幹線の富山駅での台車部分の着雪量を
  • 新幹線の号ごとに
  • 2017年1月1日〜3月31日までの期間で

予測する必要があります。イメージは、こんな感じ。  

 

着雪量モデルの予測モデル

 

これを、提供された気象情報から予測する必要があります。

 

このコンテストの制約条件

今回、提供されたデータは、

  • 気象庁提供、天気予報データ
    • 天気、気温、湿度、降水量、など
    • 金沢、富山、糸魚川の3地点のみ
  • JR西日本、線路沿いの積雪深計データ
  • JR西日本、線路沿いの風力計データ

でした。他にもあったけど、基本はこれらを使う感じだと思います。

しかし、コンテストの条件をよくよく眺めてみると、大きな制約条件がありました。その制約条件とは、

  • 予測日については気温、降水量、風速、相対湿度、天気 のみ 入力データに利用可。
    • 雪に関する情報がない!
  • これ以外のデータは、当日の朝4時までのデータのみ使用可

 

こういうことなのです。

 

そのため、気温、降水量、風速、相対湿度、天気 以外に、ある時刻の気象情報として必要なデータがあるのなら、これら5つのデータを使って予測する必要があります。
この5つの情報以外を使用する場合は、当日の4時までのデータから、必要な時刻のデータをまず予測したうえで、その予測データを2次データとして使用する必要があります。

 

作戦

Advertisements

無いデータは事前に予測しておく!

そこで、以下のことを実施する。

  1. 天気(晴、雨etc)-> 日照時間 -> 日射量
    • 天気の情報から、日射量を予測しておく
    • 雪が融けるかもしれないので、地上における日射エネルギー量は知りたい
  2. 降水量 -> 降雪量 -> 積雪量
    • 降水量から、積雪量を予測しておく
    • 雪の量を予測しないことにはね、どうしようもないよね

 

1. 天気(晴、雨etc)-> 日照時間 -> 日射量、と予測

気象庁は公開している気象データは、観測点によって日照時間のデータがないところもある。
したがって、天気から日照時間、そして日射量を推定する必要がある。

この段階で機械学習するほどじゃないので、単に統計処理で済ませることにする。

 

天気(晴、雨etc)-> 日照時間

提供データの中には日照時間が含まれています。学習のための特徴量としては使えないけど。
そこで、まず日中に天気と日照時間の関係を可視化してみた。なお、ラベル右の値は、日照時間の期待値です。

金沢,12月富山,12月

 

以下のことに気づく。

  • 薄曇りや、曇り、晴の時は、意外にも日照時間に幅があり、長い時もある
  • (もちろん)場所によっても異なる
  • (12月しか示していないが)月によっても異なる

これをどうやって取り扱うか、最終的な着雪量予測に影響を与える。
ここでは、各天気ごとに、日照時間の期待値を算出することにした。

 

観測点/月/天気ごとの、日照時間の期待値

LocMonあられみぞれ快晴薄曇
金沢120.00.0111.00.7270.1370.60.0330.0
金沢10.00.041.00.7390.1710.30.0210.056
金沢20.20.10.9650.7390.20.70.0030.054
金沢30.30.00.8480.6860.0930.7330.0620.15
富山120.01.00.5930.0650.6830.00.00.0
富山10.0430.90.5350.140.5570.0590.082
富山20.00.0250.9930.4620.1471.00.0350.094
富山30.9950.6690.1550.7370.060.28

 

以下のことに気づく

  • 月によっても、結構違う
    • 季節が変わっていくので、当然考慮しないといけないような気がする
    • 週単位だと細かすぎる?
  • 雨や雪の天気の時に、若干の日照時間となっている
    • この程度の小さな数値なら、いっそのこと0としてしまったほうが、ノイズにならなくてよいと思う
  • 糸魚川の天気データがなかった
    • 日照時間のデータはあるが、天気の情報がない
    • 日照時間は入力情報として使用できないはず。どうしろってんだ。
    • 今回は諦めて、使わないことにした

 

上記の表のように、富山と金沢の過去実績から、月と地点、そしてその時の天気を元に、日照時間を推定することにする。

しかし、ここで求めたいのは、日射量である。
日照時間は、地上での日射量を予測するための、中間予測値である。

 

Advertisements

日照時間 -> 日射量 の推定

以下の計算で算出することにします。
ここで、日照時間を1時間当たりの日照率として使用します。

日照率は、提供されている観測データの中に含まれています。
この日照時間の観測データを使うことで、とりあえず日照量を計算してみます。

 

大気上端日射量とは、以下の図の「大気上端日射量S0」のことです。

 

当たり前の話ですが、大気上端日射量は、観測地点から見た太陽高度に依存します。
したがって、任意の時刻、緯度経度における、太陽高度を計算する必要があります。
そこで、pythonのastropyパッケージを使って太陽高度を計算させてみました。

これがその結果です。意外に良く合っていました。

 

こうして富山の観測値と予測値を比較してみると、まぁよく推定できていると言ってよいでしょう。

この予測を高精度にすることにはあまり意味がないので、この手法での予測で、十分だと判断することにします。

 

天気 -> 日射量 の推定

最終的には、天気(晴れや曇りなど)から、直接日射量を得ることが、最初の目的です。
そして、ここまでで、以下のように日照時間を挟んで推定の手順を確認しました。

  • 天気 -> 日照時間
    • 過去の天気と日照時間の観測値から、統計的にその期待値を求めた
  • 日照時間 -> 日射量
    • 経験式を使い、日照時間から日射量を求めた

 

そこで、いよいよ天気 -> 日照量と、直接推定を行います。
(直接といっても、それは結果的に見たらそう見えるというだけ。実際には日照時間を挟んで計算している)

ただし、日射量の観測値、天気のデータがそろっているのは富山のみでした。

金沢は日射量がなく、糸魚川は天気の情報が提供データに含まれていませんでした。そのため、

  • 富山と金沢だけが、天気から日射量を推定できる
  • 富山だけが、推定した日射量と、日射量の観測値を比較できる

という状況です。

以下が、富山の推定結果。

うん、まぁまぁ、ですね。
というのも、天気情報(晴れとか曇りとか)は、数時間毎のデータでした(間隔は観測点によって異なる)。
そのため、欠損値が多く含まれるため、描画時に補完処理を強いられました。

  • 金沢
    • 03:00、06:00、09:00、12:00、15:00、18:00、21:00
    • 1日8回
  • 富山
    • 03:00、09:00、15:00、21:00
    • 1日4回

そのため特に富山の場合、最も日射量が強くなるはずの12時付近の天気がないため、可視化するとピーク時の値が小さくなってしまっています。
これが、あまり予測値と観測値が一致しないように感じる、一つの大きな要因となっています。

長くなったので、ここらで一旦切ることにします。

 

次回は

天気から、降雪量を推定する手順について説明します。
もうコンテストも終わったし、今更こういうことを知りたいという人は少ないでしょうけど。

それでは。
 

Advertisements

コメントを残す