はじめまして、Aidemy研修生のryotake0404です。今回は衛星画像の雲から降水判断を行います。
近年、雲(水蒸気)のデータは異常気象予測に注目されていますが、専門的でない自分にはなかなかデータを読み取るのが難しいと感じました。そのため、気象データにくわしくない自分でもわかるやり方で雲を識別し、データとしてみました。
衛星画像は地上で衛星から送られてきたデータを基に作成されますが、作成される経緯はよくわからないので、作成された画像から別の方法で雲をデータにおこそうという考えです。おそらく世界で誰もやったことがないと思いますが、もしいたらぜひ一緒に飲みに行きたいです。
データの引用元・詳細
① ひまわり8号の衛星画像downloadページ: ※ 2017年8月全日(但7日除く)、2018年8月1~20と2018年6月21から7月31までの雨が降っている日(降水量0.5以上)の衛星画像(日本列島付近)をダウンロードしました。
② 気象庁 過去の気象データ・ダウンロード: ※ ①に対応した日(但2018年8月11,12日を除く)分の東京の降水量をダウンロードしました。
※ 雨と晴れの比率は1:1になるようにデータをとっています。
環境
- jupyter notebook 5.5.0
- Python 3.6.5
- mac 詳細
流れ
- Neuronを作成し、Simple sigmoid modelを定義する
- ひまわり8号からダウンロードしてきた衛星画像を読み込む
- 画像を切り取って軽くして、いい感じにマスクかけて雲とそれ以外に色を分ける
- 2の画像をlistにし、全画像分のlistが入った大きなlistを作成する
- 気象庁からダウンロードしてきた降水量を元に、label作成
- 3と4を1つのtupleに入れ、neuronに実行できる形にする
- 必要情報をあてはめ、trainingを開始する
- trainingし終わったmodelをもとにtest dataにあてはめて、どれくらいの精度で判断できたかをみる
※データは時間やパソコンの調子の関係でtrainingとtestそれぞれに約1ヶ月分しか用いられませんでした。次回機会があるなら数年、数十年分のデータで行ってみたいです。
補足説明
説明はほとんどcode内にあります。epoch数、どういうpredict方法か、loss functionはどういう定義にしたのか、などなどcode内に書き込んであります。ただ、途中の画像処理やデータの調整などは記載していないため、ここに画像で貼ります。 まず、ひまわり8号からとってくる画像は下の画像
そして、きりとって軽くすると下のような感じ
そして肝のマスクはこんな感じ。ここで雲とそれ以外にわけるのでマスクの数値は大切です。
次に、気象庁からのデータですが、ダウンロードして何も調整していない状態だと下のような感じです(画像は例としてあげているものなので実際に使用したものとは必要な情報や日付などすこし違います)。
そして、使用しない項目を減らし、今回は降水量をPrecipitation(mm)に変更したので、下のよう感じ(例です)。
Code
Codeは下の通り。 実際にrunすると、下のように表示されます。下のときは最終的な精度として71.4%でしたが、10回おこなった結果、60%~83%まで変動しました。平均はちょうど70.0%で最頻は67.9%でした。
結果をみると、マスクをかけた白黒の画像から70%の精度で判断ができるのは意外ですね、とてもおもしろい結果となりました。
改善点
改善点をあげるとすれば、データ量、画像の切り取り方、雲認識のためのマスクの数値などをいじることだと思います。また、ここから1日単位ではなく、数分単位で観察して予測につなげるためには、夜の画像を用いなければならないので肉眼で認識するこの方法は使えないです。赤外画像を用いればなんとかなるのかなとは思いますが、future workとし、試してはいないです。
おまけ
完全におまけですが、下記のサイトを参考に気象庁のデータ20年分をもちいてロジスティック回帰を行うと、85%を超える精度がでました。やはり雲から判断するよりも10~20%くらい高い精度ですね。ちなみにデータは下のように調整しております。
特徴量は画像の1行目のとおりです。気象庁の②と同じサイトから、1998/1/1~2017/12/31のデータをダウンロードしております。 そして、表示された結果はこんな感じです。
※ codeの説明はcode内に書いてあります。流れとしては、データを読み取り、降水量からlabelを作成。そして欠損やいらない項を削除し、train と test を8:2で分けた後、sklearn.linear_modelのLogisticRegressionを用いて回帰を行い、最後にcross validationを行っています。
最後に
ありがとうございました、自分としては、70%の精度でいろいろ改善点があるものの、おもしろいことができたんじゃないかなと思います。