【初心者向け】SIGNATE SMBC Group GREEN×DATA Challenge 2024 銀メダルを取った話
初めまして!大学生の onigilar と申します!
初心者ながら、SIGNATE のコンペティションで銀メダル (36 位)を取ることができました。結果は以下の通りです!
【結果】
暫定順位 (Public LB) : 58 位
最終順位 (Private LB) : 36 位 (学生 9 位)
投稿人数 : 862 人
参加人数 : 1,338 人
本稿では、銀メダルを獲得するに至った経緯をお伝えできればなと思います。
1.コンペティション概要
本コンペの概要は下記 URL に記載されています。
「SMBC Group GREEN×DATA Challenge 2024 GHGの排出量の予測にチャレンジしよう!」
【目的】
アメリカの施設の2014年のGHG排出量の予測
【評価指標】
RMSLE
【データ】
場所 (緯度経度、州、市など)、産業分類、
2010 年~2013 年のTRI・GHG排出量
【用語】
TRI : 有害物質
GHG : 温室効果ガス
Public LB : 暫定評価のスコア
Private LB : 最終評価のスコア
All LB : test データ全体による評価のスコア
そもそもコンペティションとは?という方には下記を参照いただければと思います。概要としては、学習用のデータ (trainデータ) を用いて予測モデルを作成し、評価用のデータ (testデータ) を用いて予測精度が算出され、順位が付きます。その際、暫定の順位は testデータの一部のみで算出され、最終順位は testデータの残りの部分で決まります。
以下は公式の引用です。
2.参加前の状態
私のデータ分析に対するレベル感をお伝えできればなと思います。
・学部生
・材料 / 物質 系の専攻でプログラミングは独学
・コンペティション参加経験あり
・データ分析を一通り行えるが、正直よく分からないことだらけ
コンペティションの参加経験に関しては、こちらの記事に書いています。
「MUFG Data Science Basic Camp 2024 初心者でも 9 位を取れた感想」
こちらのコンペティションは、MUFG 主催の SIGNATE コンペティションではありますが、学生限定かつ基本編ということで簡単なタスクとなっています。最初に参加するコンペティションとしては最適なものだと思います。
3.ソリューション
では、本題になります。EDA に関しては省略します。
ネットや本で勉強しながら進めました。
評価指標は RMSLE なので、目的変数は log1p による変換を行っています。
以下にソリューションを記載します。
3.1 前処理
なし
3.2 特徴量生成
Numerical 変数
・TRI (2010~2013) の変化や比率
・GHG (2010~2013) の変化や比率
・TRI と GHG の比率
・2 年前との比較Categorical 変数
・PrimaryNAICSの上2桁を取って、エンコーディング
(産業分類に関する特徴量)
・State (州) をエンコーディング
・GHG の欠損の出方のラベル
・TRI の欠損の出方のラベルグルーピング
・上記 Categorical 変数に対して、Category 毎に GHG や TRI の基本統計量を算出
3.3 特徴量選択
Greedy Forward Selection (改良版)
初期特徴量をGHG(2010~2013)、TRI(2010~2013)の 8 種類として固定。生成したすべての特徴量の中から1つの特徴量を加え、スコアが最も改善したものを追加していく。改善が止まったら終了し、特徴量選択を終了。手動で選ぶ
勘で追加したり変更した。
3.4 モデルとパラメータ
モデルはLightGBM、CatBoost、XGBoostの3種類。( Fold = 5 )
それぞれで上記の特徴量選択を行い、異なる特徴量で学習。
評価関数は RMSE とした。
パラメータはOptunaで探索。
予測結果を加重平均アンサンブルした。比率は以下の通り。
LightGBM : 0.32
XGBoost : 0.21
CatBoost : 0.47
後処理は行わずに、そのまま提出。
4.考察
4.1 Public LB と Private LB
49 回の Submission におけるスコアの変動をグラフにしてみました。( 2回の誤提出は削除しています。)
グラフでは上に行くほど良い精度ということを表しており、Pic 1 が Public LB 、Pic 2 が Private LB を表しています。Pic 2 の Bronze と Silver のラインはそれぞれ銅メダル、銀メダルの基準となるスコアを示しています。
概ね 2 つの LB の傾向は似ているように見えます。しかし、16 回目のSubmission で Private LB の最高値を出していますが、Public LB はあまり高くないです。これに関しては、評価する test データに ""逆の"" overfit をしているのではないかと考えています。その理由は、16 回目以降の数回で Optunaによるパラメータチューニングを行い、Public LB や train データに対する CV が向上しているのにも関わらず、Private LB は下がっているからです。
最終的なファイルは Pic の最後の 2 つを提出していますが、CV や LB の関係性を考慮しその判断に至ったことは妥当であったと考えています。要するに、16 回目のスコアは非常に良いスコアですがまぐれに近いので、合理的な判断の元ではそのファイルを選択することはできないと思いました。
( 補足 )
提出回数 22 ~ 25 の 3 回で大きくスコアが下がっているのは、特徴量選択のミスです。train データの CV だけに焦点を当てると、Greedy Forward Selection で言及した「初期特徴量 GHG(2010~2013)、TRI(2010~2013)の 8 種類」のうち、GHG しか選ばれませんでした。さらに、かなりバイアスのかかったグルーピング特徴量を選んでしまい train データに overfit し、このようなスコアとなりました。
4.2 汎化性能の検証
では、実際に test データに対してどのくらいの予測精度が出ているか算出してみます。
今回の評価指標は RMSLE でした。以下の式で表されます。
$$
\text{RMSLE} = \sqrt{\frac{1}{n} \sum_{i=1}^{n} \left( \log(y_i + 1) - \log(\hat{y}_i + 1) \right)^2 }
$$
Public LB と Private LB 算出に用いられている test データはそれぞれに対して半分に分割されているので、各データに対する RMSLE を それぞれ$${R_1}$$、$${R_2}$$とすると、
$$
R_1 = \sqrt{\frac{2}{n} \sum_{i=1}^{\frac{n}{2}} \left( \log(y_i + 1) - \log(\hat{y}_i + 1) \right)^2 }
$$
$$
R_2 = \sqrt{\frac{2}{n} \sum_{i=\frac{n}{2}+1}^{n} \left( \log(y_i + 1) - \log(\hat{y}_i + 1) \right)^2 }
$$
従って、全体の RMSLE
$$
\text{RMSLE} = \sqrt{\frac{R_1^2 + R_2^2}{2}}
$$
を得られます。
この式を用いると、test データ全体に対する RMSLE を求めることができます。
私の Submission に対してグラフを作成してみました。
やはり test データ全体に対しては 16 回目の Submission よりも最後の 5 Submissions の方が良い精度を記録していました。私は Private LB をよくするというよりは、全体として汎化性能を上げたいと考えていたので、その目標は達成できたのではないかと思っています。
他の参加者の方々の All LB も(誠に勝手ながら)算出してみましたが、やはり上位の方々のスコアは高かったです。さすがだなと思いました!
しかし、私は学生内での最終順位は 9 位なのですが、All LB ですと 3 位になることが分かりました。(最終順位は変わらないので意味はないのですが笑)
賞金まで惜しかったなと思いつつ、上位の方々のソリューションを学びながら次に活かしていきたいです!
5.まとめ
いかがだったでしょうか?自分なりの考察も書いてみましたが、合っているかは分かりません。
私のソリューションでは特徴量生成・選択・モデル・パラメータもすべて基本的なことで完結しています。モデル作成自体は簡単だったので、初心者でも取り組みやすかったように感じました。しかし、感覚的に効く特徴量を作ることが難しかったこと、欠損が多かったことなどが起因し、精度を向上させていくのは難しかったです。
フォーラムで交流してくださった皆さん、及び LB で共に戦ってくれた皆さんのおかげで成長することができたと思います!
今後ともよろしくお願いいたします!