1.7K Views
February 17, 23
スライド概要
ひろしまQuest2022 河川の水位予測 TeamShiny近藤 2023年2月15日(水)
アジェンダ 1. コンペ概要 6. データ成形、前処理 2. チーム概要 7. その他工夫点 3. EDA 8. まとめ 4. 予測手法 5. 他メンバーの取り組み 2
コンペ概要 広島県内の観測データ(河川の水位、雨量、潮位) から、翌日の各河川(各観測局)の水位を 予測するアルゴリズムを作成する。 分析用データとして、以下が与えられる。 内容 :観測日時、ダムや観測地点の 緯度経度、水位、雨量、潮位 観測期間:6年間 観測頻度:1時間ごと 3
チーム概要 チームシャイニー、シャイニーラボの利用者、スタッフあわせて 5名でチームを組んだ。 ⚫ A(データ成形、前処理、モデリング) ⚫ B(データ成形、前処理) ⚫ C(データ成形、前処理) ⚫ D(前処理、モデリング) ⚫ 近藤(データ成形、前処理、モデリング) 分析は各自行い共有する。週1回は集まり案を出し合う。 4
結果 最終順位は Public Leaderbord6位、 Private Leaderbord7位。 賞金を狙える位置にいたが、 あと一歩届かない結果に。 金メダルは持ち帰れた。 少しシェイクダウンして、 LBを意識しすぎた感があった。 5
EDA フォーラムのチュートリアルの可視化。 これとは別でヒートマップ、特徴量重要度も出して 検討もした。あまり有用な知見は得られなかった。 地図を見て知見を得てはならないというルールがあり、 周辺観測所や上流下流を判定するのに緯度経度を使う必要 がある。 6
観測所を地図上にプロット 雨量観測所(青)は 全体的に散らばっていて、 水位観測所(赤)は 河川周辺にまとまってい る。 雨量観測所は緯度経度か らの距離でエリアが求め られ、 水位観測所は近い場所を 同傾向として使えそうか。 7
6年間の水位 全期間、6年間の水位より 例年、夏に水位が高い期 間があるが、 2年目に欠損が多くあり、 5年目夏に豪雨があり水位 が例年以上に上昇してい る期間がある。 8
1年目の水位 夏にまとまった雨で水位 が変動する以外は変動は 少ない。 近くにダムなどがなけれ ば同じような水位の変動 傾向が見て取れる。 9
予測手法 おおまかに解法は、水位観測所ごとに1時間ずつ水位を予測 する手法と、水位の変動が大きい観測所は24時間まとめて 予測する手法の、2種類のハイブリッド方式を採用した。 水位の変動が大きい観測所は、 全水位観測所 瀬戸内海周辺の観測所が多く 166 周辺の港の潮位の値も多少は 有効だった。 観測所ごと 156 変動 大 10 10
基本戦略 ⚫ 欠損値、異常値、外れ値を適切な値に置き換え減らす AIの傾向を捉えやすくするため ⚫ 河川上流水位の追加を検討 アイデアを煮詰められなかった点として一番に挙げられるの が、後述する河川上流水位を緯度で判定し追加する手法。 川の流れる方向が東西南北バラバラのため精度の貢献は 低かったため見送った。 11
水位観測所ごとに1時間ずつ水位を予測 166ある水位観測所ごとに予測。各観測所ごとの傾向が 捉えられる反面、一括で処理できないためどうしても 学習時間、推論時間が多くかかる。 各水位観測所ごとに最大水位、最小水位、基準水位が 異なるのでこの手法自体は有効だったと思われる。 推論時24行データにおいて、時間の変数以外に説明変数に 大きな差異はなく、変動を捉えずらかったよう(後述)。 12
水位の変動が大きい観測所は24時間 まとめて予測 166ある水位観測所の一部の変動が大きい観測所を1行 データにおいて多出力で予測。1時間ごとの増減は前述の 手法よりこちらの手法の方が捉えやすかったよう。 観測所はラベルエンコーディングして区別している。 河川ごと、季節ごと、雨季や乾季ごとの学習なども試した がtestデータでは精度が上がらず不採用。 13
その他予測手法 ⚫ モデル 観測所ごとではmax_depth=3、水位変動大ではmax_depth=10が適合した。 MultiOutputRegressorのアーリーストッピングは学習時には行えていたが提出時に 調整が必要となり未反映。CatboostはGPUを使用した。最終提出には入れなかったが、 結果として入れない方が良かった。 kerasのMLPやkerasのGRUでまあまあの精度が出ていたが、推論時間の関係で不使用。 LightGBMはoptunaのハイパーパラメータチューニングが有効だった。 ⚫ 評価方法 Hold-outValidationをしtrainデータ9割で、validデータ1割で評価。 評価はデータが少ないためほとんど参考にせずLBをあてにしていた。(Shakedownの 原因かも) 最終的にはアーリーストッピングしていない部分は6年分全部をtrainデータに使用。 ※上位解法では、交差検証を採用していたので追求すればよかったかもしれない。 14
他メンバーの取り組み Aは観測所のダミー変数化、多出力モデルに関心があり 追求していた。また、速度、精度ともに有効な線形モデルに着目し、 アンサンブルの幅を広げることに貢献した。 Bはデータ成形、全体の細かなところを中心に意見を 出していた。 Cはデータ成形、前処理でアイデアを頻繁に提案し率先して 動いた。また全体の取りまとめも行った。 Dは先行して取り組んでいた。水位、雨量の12時間平均 などの改善点の提示や、近藤とは異なるアプローチがあり、特に 提出zip作成時に大きな助けとなった。また交差検証にも取り組んでいた。 15
データ成形、前処理(1) ⚫ 使用した特徴量 ・前日の12時から24時の水位 ・前日の0時から24時の水位観測所から近いTOP3の雨量観測所の平均雨量 ・広島県西中部の2箇所の雨量観測所(吉和、菅沢)の 前日の0時から24時の平均雨量 ・時間 ・水位変動大の観測所は前日の0時から24時の潮位も追加 ⚫ 使用しなかった特徴量(推論時間の兼ね合いもある) ・前日の0時から12時の水位、前々日の0時から24時の水位、雨量、潮位 ・前日、前々日の0時から24時の水位、雨量の12時間平均、最大、最小値 ・河川上流(緯度より選定)の前日の0時から24時の水位 ・月、日、季節 ・前日の水位、雨量の2時間移動平均 ・24時間雨量の0をカウント ・ダムかどうかのフラグ ・水位の平方根(流量に比例と論文に書かれていた) 16
データ成形、前処理(2) ⚫ 目的変数 対数変換を行ったり、「当日水位-前日23時の水位」も試したが効果が確認でき ないため見送った。 ⚫ 前処理 "大谷池"は300以下を+100。"白川"は200以上を-227.5。"七社"は9以上を-10。 "門田"は0を欠損値に。 同観測所が複数行ある等の不整合なデータの調整。 水位、雨量、潮位を1時間ずつシフトさせ、データ数を24倍に増やした。 一部モデルでは豪雨期間を省いた。 ⚫ 欠損値補完 水位、雨量、潮位に関して、limitで制限したinterpolateで線形補完。残った欠 損値は全平均を取り補完。 年月ごとの平均、多変量補完、多重代入法なども試したが、効果が確認できず不 採用。 17 ※上位解法では、近い観測所の値で補完したり、前日の予測値を当日の欠損値補 完として使用していた。
その他工夫点 ⚫ 学習時の工夫 観測所ごとに加えて河川ごと、季節ごと、雨季や乾季ごとの学習 なども試したがtestデータでは精度が上がらず不採用。 ⚫ 推論時の工夫 推論時間がギリギリだったためonnxを介して軽量化、速度向上を 図った。それでも遅いので重要度が高くなさそうな特徴量を省いた。 精度は悪くなかったため、1時間ごとに予測して予測値をtestデータ に入れて24回推論させる方式も試したが、推論時間がかかるので 見送った。 18
アンサンブルによるスコアの向上 ⚫ 観測所ごと ⚫ 予測値の加重平均をとって最終的な予測値として提出。 ⚫ LightGBM、HistGradientBoosting、Ridge、MLP(学習前に 正規化)を使用。 ⚫ 加重平均の割合は0.25:0.25:0.25:0.25。 ⚫ 水位変動大の観測所 ⚫ 推論時間の関係でHistGradientBoostingのみを使用。 19
プログラミングコードについて 整ったコードとはとても言い難いのでお見苦しいところが あるかもしれません。以下リンクへお進みください。 ⚫ チュートリアル https://drive.google.com/file/d/1gGeb7cjLc3EqZBX9q1sxmIBDhA8oOaw/view?usp=share_link ⚫ 最終提出の学習用コード、提出zip https://drive.google.com/drive/folders/1J8id9i9OJlVO098YdZFCLuVPo0Dzp29?usp=share_link 20
まとめ アイデアは終盤まで尽きることはなく時間が足りなかった。 推論時間を気にしたり提出zipを作るのに多数の時間を 費やした。 jc氏、mochizuki氏などのコンペ常連相手に対抗できる 戦いができ、自信となった。 次回も同じような方式のSignateの時系列問題にチームで 参加予定。経験を活かしていきたい。 終盤は個人でまとめてしまったので、チームでの取り組み には課題が残った。 21
ご清聴ありが とうございま した 22