2024年3月22日
Kaggleのコンペを振り返る
- Category ブログ
私たちが今回参加したコンペは「Enefit - Predict Energy Behavior of Prosumers」です。
このコンペを選んだ理由は以下です。
- 市場で非常に需要の高い時系列分析の技術を学び、スキルを向上させたい
- モデル提出時にPythonの時系列APIを使用している流行りのコンペ
経験豊富なメンバーから初心者まで、幅広いスキルを持つ4名でチームを組んで参加しました。お互いの不明点や考えを積極的に相談したことで、個々の成長だけでなく、チームメンバー間の交流も深まった貴重な機会となりました。
今回のコンペでの学びを紹介できればと思います。
コンペの概要
目的
- エネルギー消費と生産の両方を行う『プロシューマー』のエネルギー使用/生産予測モデルを作成する
背景
- プロシューマーの増加に伴う、エネルギーの不均衡は運用コスト増加や供給の不安定などの多くの問題を引き起こしている。
- エネルギーの不均衡コストを削減し、供給を安定させることで、エネルギーシステムの効率と持続性を改善し、再生可能エネルギーへの移行を促進したい
指標
- MAE(Mean Absolute Error/平均絶対値誤差)
タイムライン
- 2023年11月1日 開始
- 2024年1月24日 エントリー、チーム結成締め切り
- 2024年1月31日 最終提出締め切り
- 2024年4月30日 コンペ終了日
今回のコンペに参加したメンバーが別途記事を執筆しております。ぜひご覧ください。
今回のコンペで難しかった点
①エネルギーの生産と消費でデータの特徴が大きく異なる
まず今回のコンペで特徴量加工やモデル選択の際に悩んだ点としては、エネルギー生産と消費のTargetデータの特徴が大きく異なる点でした。今回のコンペでの生産エネルギーは再生可能エネルギーである、太陽光などのことを指していると思うので、一般的に天候や季節、太陽光パネルの設置件数に大きく依存することが予想されます。一方、消費エネルギーは、人々の生活パターンや経済活動、気温などに影響を受けることが予想されます。この前提と実際のTargetデータを基に、特徴量の選択や加工、モデルの選択を検討しました。生産エネルギーの方は特に線形特性を含んでいたので、Discussionでも多く議論されていました。私たちのチームは、生産と消費で分けてモデルを学習させました。この点については、どのような特徴量やモデルを使用するべきだったのか、コンペ終了後、上位の方の解法を参考に振り返りたいと思っています。
②最終提出日後にテストデータが更新される
今回のコンペでの大きな課題は、モデル提出時にPythonの時系列APIを使用することで、最終提出日後にテストデータが更新される点にありました。これによりパブリックリーダーボード上での成績が最終的な評価とどの程度一致するのか分からず、最終モデル選択に大いに悩む原因となりました。
(パブリックスコアとは、コンペ進行中のパフォーマンスを示すもので通常、テストデータの一部を使用しLeaderboardでランキングとして公開されています。プライベートスコアが最終評価となるスコアですが、こちらは通常パブリックデータで使用しなかったテストデータを使用して計算されることが多いです。それぞれのコンペの概要やリーダーボードのページに詳細が記載されています。)
今回のコンペでは、テストデータを使用してパブリックスコアの評価を計算し、プライベートスコアは、提出期限後に収集したデータを使用すると記載されていました。このため最終的な順位やスコアがパブリックリーダーボード上の成績と大きく異なる可能性があります。つまり、過去のデータを基にして未来のエネルギー量を正確に予測するモデルや特徴量加工が求められるコンペでした。これらの課題に対処するため、リーダーボードのスコアを指標の1つとして参考にしつつ、モデルの汎用性を高め、未来のデータに対してもある程度予測精度を保てるモデルを作成することに注力しました。具体的にはアンサンブル手法を用いて複数のモデルを組み合わせて予測精度の向上を目指しました。
私たちのチームの解法
- 特徴量加工
特徴量加工についてはシンプルでラグ特徴量や差分特徴量を作成しました。これによりデータの時間的な動きや変化のパターンをモデルが学習しやすくなるので、時系列分析においては一般的な手法です。公開されている多くのNotebookでも同様の処理が行われていました。最終的にモデルに投入した説明変数の数は160~170でした。
- モデル構築
モデルにおいては勾配ブースティングマシンやニューラルネットワークモデルを中心に展開しました。これらの異なるモデルを利用することで、それぞれ異なるデータの特性をとらえることができるため、複合的なアプローチにより予測精度の向上を目指しました。
最終的に、複数のモデルの予測結果を組み合わせるアンサンブル手法を採用しました。この手法により、個々のモデルの弱点を補いあうとともに、汎用性を高め、未知の未来のデータに対する予測精度の向上を目指しました。
パブリックスコア上位者の解法
モデルの提出締め切り後、パブリックスコア上位の方がいくつか解法を公開していたので、簡潔に紹介しつつ、自分たちのアプローチと比較したいと思います。
パブリックスコア上位者の解法
- 特徴量加工は基本的に特別なことはせず、最終的に利用した変数は100~200
- Targetを4パターン作成し、比較を行った
- 比較したターゲットは以下
①raw target(何も加工していないTarget変数)
②target-target_shift2(TargetからTargetを2つずらした変数を引いたもの)
③target/installed_capacity(Targetをinstalled_capacityという変数でわったもの)
④(target-target_shift2)/installed_capacity(上記の②をinstalled_capacityという変数でわったもの)
- ③と④のターゲット変数×生産/消費で4つのxgboostモデルと2つのGRUモデルで編成
- より多くのモデルをアンサンブルして、最終スコアを向上を目指した
- 特にニューラルネットワークモデルがスコアを向上させたらしい
私たちのチームの解法と比較
・基本的な特徴量加工は同じ
・Target変数に関しては私たちのチームの最終的なモデルは差分を取ったのみだったため、もう少し工夫できればよかったと反省。
・③は試したのですが、パブリックスコアが低下して不採用としていたので、パブリックスコアに惑わされず他の指標等も考慮して検討すればよかったと反省。
コンペを振り返って
本コンペの終了は4月末のため、まだ結果は出ていないのですが、今回のKaggle参加の目的の1つであった、個々の時系列分析の技術、知識の向上は達成できたのではないかと思います。コンペ参加中に様々なDiscussionを確認したり、それぞれの考えやアプローチを共有したり、最終提出後、上位の解法を学んだりしたことで、自分に足りない知識や視点を、メンバーそれぞれが吸収し、成長することができたと思います。
Kaggle参加中はフルリモートだったため、実はまだ直接会ったことのないメンバーもいたのですが、チャットや定期的なオンラインミーティングを行うなど、積極的にコミュニケーションを取ったことで、良好な関係を築くことができました。技術的な話題はもちろんですが、業務とはまた違った場面での非公式な会話が、チームメンバーの一体感を高める重要な要素になったのではないかと思います。
また個人的には原因不明のスコアリングエラー(手元のコードは問題なく実行できるのに、なぜか提出するとスコアリングエラーというエラーになってしまう)に一時期悩まされました。今回、チームでの参加のためうまく気持ちを切り替えて、最後までメダル獲得を目指して活動することができたと思います。チームメンバーに感謝しつつ、今後は1人参加であっても気持ちの切り替えをしっかり行えるよう、自分を律していきたいと思いました。
今後の抱負
今年の個人的な目標はなんといってもメダルを獲得することです。継続的にKaggleのコンペに参加し、振り返りと反省を行いながら、メダル獲得に向け活動していきたいと思います。
ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。