海老ノート

Google Earth Engine 苦闘の記録

GEEでランダムフォレスト2:関東の人口を予測

人口データの準備

前回のとおり、e-statからデータをダウンロード。具体的には、関東地方7都県の4次メッシュの人口データとshpファイルをダウンロードして、Rを使って各メッシュの人口と中心座標をまとめた1枚のcsvファイルを作りました。

そこから、まずは海上のメッシュを除外。その後メッシュ当たり人口1,000人ごとのクラスに分けて層別サンプリングをして、約1,000メッシュを抽出し、shpファイルに書き出しました。

衛星データの準備

衛星データは深く吟味せず、データカタログをみて使えそうと思ったのを入れてみます。全部で16種類。

500mメッシュということで、MODISの500mのを基本に気温や標高、夜間光(これは解像度約1kmだった)を入れました。MODISデータのSurface Reflectanceは無雪期だけを使うことにして、NDVI、NDWI(水面の方)、NDBI(建物の指標らしい)を計算して追加。気温は月別だったので、年平均、最高、最低の3つにまとめました。

ランダムフォレストをする

人口のshpをassetへアップロードした後ee.FeatureCollection()にして、各種データの数値をsampleRegions()を使って取得、という流れは分類の場合と同じ。今回は8:2で訓練:検証データに分けてやってみました。訓練データ800っていうのは、Rで見てみたらそのくらい以上あればRMSEがあまり変わらなそうだったから。ntreeとかmtryもRでよさげだった値をGEEに設定。

ランダムフォレスト回帰のコードの書き方は前回の通り、.setOutputMode('REGRESSION')をつけるだけでOK。ドキュメントを見ると、他のee.Classifierでもできるものがあるよう。SVMもできるのか?

結果と評価

Google Earth Engineの結果

チュートリアルのコードの通り実行すると、変数の重要度のグラフとか予測と実測の散布図までできちゃう。素晴らしい。.explain()を使えばモデルの内容が出てくる。で、GEEでの結果はこういう感じ。avg_radというのは夜間光。夜間光、NDWI、MODISのバンド5が大事といっています。

f:id:camarao:20220213154520p:plain
変数の重要性
f:id:camarao:20220213154549p:plain
予測(x軸)と検証データ(y軸)の散布図

Rの結果

randomForest()を使用。

f:id:camarao:20220213155155p:plain
変数の重要性(R)
f:id:camarao:20220213155627p:plain
予測(x軸)と検証データ(y軸)の散布図(R)

似ているけど微妙に違う

ざっと見た感じ似てます。が、よく見ると重要な変数とかが違っている。両者で使っているデータが同じではない(GEE、Rそれぞれで訓練データ・検証データに分割しちゃったから、失敗)のと、まあランダムなのでということなのかな?RMSEはGEEでは983.6、Rで996.9とこれまた微妙な違い。大体似ているので、いいことにしたいと思います。

地図

それなりに、それっぽい地図ができました。適当に作ったにしては思ったよりもそれっぽくできている。

f:id:camarao:20220213160502p:plain
ランダムフォレストで予測した関東の人口

富士山の上のほう(関東地方外だけど)で人口が多めに出ているのは植物は生えていないか雪で色が他と違うからだろう。あと、成田空港も人口密集になってるけど、夜明るいからなんだろうと思う。

もっとよくできるという点はいくつもあるけど、今回はこれで終わり;

  • メッシュとラスタの位置が対応していない
  • sampleRegions()でのデータ取得は点からバッファ500mの平均(按分)でやった方が妥当だと思う
  • 予測に使う変数を整理。ほかにも探してみて追加
  • 人口0の訓練データをもうちょっと増やしてもいいのかも。
今回のコードはこちら

https://code.earthengine.google.com/f9b1398016c10d332e34d44832407085

www.e-stat.go.jp

fsapps.nwcg.gov