今回のAI技術ブログはkaggleコンペに参加したメンバーに
レポートを書いていただきました!
チームでの取り組み方も紹介してくださったので見どころ満載です!
ぜひご覧ください👀
\\\ 今までのAI技術ブログはこちらから!//
はじめに
社内でチームを組み、kaggleコンペに初挑戦しました。
チームは3人、日頃業務でpythonを触っていて
AI開発やwebアプリ開発の経験はありますが
kaggleに参加するのは全員初めてです。
そのため今回は、コンペの流れを通してみることをゴールに
練習用コンペに取り組んでみましたので、その取り組みの様子をご紹介します!
~ この記事を読んでほしい人 ~
① kaggleに興味があるがまだコンペに参加したことがない方
② kaggleコンペにチーム参加する際の取り組み方に興味がある方
③ 弊社に興味のある方!
kaggleとは
Kaggleとは、データ分析や機械学習に関する世界的なコンペティションプラットフォームです。
企業などがコンペ形式でデータと課題を提示しており
世界中の参加者が、予測モデルなどを構築しその精度を競います。
各コンペは2~3ヶ月程で開催されており
成績によってメダルが与えられます。
また、一部のコンペでは上位に入賞すると賞金を獲得できるものもあります。
コンペの紹介
今回取り組んだのはkaggleの入門用として常時開催されている
Store Salesというコンペティションです。
課題設定としては、エクアドルを拠点とする小売業の売上の時系列予測です。
具体的には2015/8/16~2015/8/31の各店舗の商品種類別の売上を予測となっています。
評価指標は、RMSLE(対数平方平均二乗誤差)[^1]です。
[^1]: 回帰タスクの代表的な指標で、誤差を表すため0に近いほど良いことを示します 。
以下の式で定義されます
$$
RMSLE = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(\log(p_i + 1) – \log(a_i + 1))^2}
$$
\(n\) はデータ数、 \(p_i\) は予測値、 \(a_i\) は正解値を表しています。
$$\log(p_i + 1) – \log(a_i + 1) = \log\frac{p_i + 1}{a_i + 1}$$
と変形すると誤差の割合に着目した指標であることがわかります!
kaggleから提供されるこのようなデータからモデル作成を行います
● 店舗情報
● 日毎の石油価格
● 祝日とイベントの情報
● 2013/1/1~2015/8/15までの各店舗の商品種類別の売上情報
流れ
今回は以下の流れで着手しました。
① 写経:Notebook3つ
② 精度改善方法の模索:アンサンブル検証
写経
kaggleでは先人たちが作ってくれたnotebookやディスカッションを見ることができます!
高いscoreを出す方法や、データ分析を行なった結果を参考にすることができるため、
まずは先人たちの思考を追うべく、いくつか選んだnotebookの写経を行いました!
Notebook1
1つめはこちらのnotebookです。(score:0.40185)
https://www.kaggle.com/code/theupgrade/step-by-step-from-eda-to-submission-with-lgbmr
EDA[^2]を行いデータの内容を理解したあと
商品ごとにLGBMRegressor[^3]モデルを作成するnotebookとなっています。
特徴量は、曜日、休日、標高、人口密度、
地震、学校入学時期に関する変数を作成しています。
特に標高、人口密度などは提供されたデータにはない情報で
独自に用意された変数のようです。
[^2]: EDA(探索的データ分析):データ分析の初期段階で行われるアプローチ。
データの特徴やパターンを探索し、理解するのが目的で、その後の前処理やモデル構築の足がかりとなります。
データの中身を実際に見てみたり、集計、可視化して、統計量や相関性などを確認します。[^3]: LGBMRegressor:LGBMはLight Gradient Boosting Machineの略で
勾配ブースティングの手法の一つ。
比較的高速で高精度なアルゴリズムと言われています。
それを回帰に対応させたのがLGBMRegressorで、
こちらのライブラリを利用しています。
Notebook2
2つ目のnotebookはこちらです。(score:0.4497)
https://www.kaggle.com/code/satoshiss/store-sales-eda-xgb
日毎の売上値の差を特徴量として作成し
学習データを時系列データとして扱う実装となっています。
学習の候補として挙がった3つのモデル(線形回帰[^4]、XGBRegressor[^5]、CatBoostRegressor[^6])の中から
単体で精度の高かったXGBRegressorとCatBoostRegressorを採用しています。
そして、最終的にそれら単体の評価結果の平均値を取ることでアンサンブルしています。
[^4]: 線形回帰:連続値である数値データから未知の数値を予測する手法です。
[^5]: XGBRegresso:勾配ブースティングの手法の一つで、複数の弱いモデルを組み合わせて、強力なアンサンブルモデルを構築するアルゴリズムとなっています。非常に高性能で、kaggleでもたびたび使用されているのを見かけます。こちらのライブラリを使用しています。
[^6]: CatBoostRegressor:勾配ブースティングの手法の一つで、先のXGBRegressorと比較して高い精度、学習速度を誇るとされています。CatBoost自体は回帰と分類どちらにも対応しているのですが、今回は時系列タスクなので回帰を採用しています。こちらのライブラリを使用しています。
Notebook3
3つ目のnotebookはこちらです。(score:0.38029)
https://www.kaggle.com/code/kelde9/darts-ensemble-stores-sales-forecasting
darts という時系列解析ライブラリを用いて
商品カテゴリ毎に予測モデルを作成する方針をとっています。
学習データを時系列データとして扱うという点は先のnotebook2と同様ですが
ライブラリを用いることで実装しています。
さらに、同じ特徴量を使用し複数のハイパーパラメータ(どの位の期間のデータを学習に利用するかなど)で
作成したモデルをアンサンブルすることで精度追求しています。
精度改善
私たちの方針としては、写経したそれぞれの手法を組み合わせられないかと考え、
アンサンブルを試してみることにしました。
アンサンブルとは
複数の機械学習モデルを組み合わせることで精度改善を図る方法です。
今回は主にスタッキングというアンサンブルの手法で進めていきました。
スタッキングは、複数のモデルの予測値を入力として
最終結果を出力するメタモデルを作成する2段構造となります。
アンサンブル検証1
まずはシンプルにnotebook3つのモデルの予測値を
組み合わせの平均値を用いて出力してみました。
結果としては最も良いパターンのscoreは0.38901でした!
(notebook1と3の組み合わせ)
リーダーボード的には悪くない結果ですが
notebook3のモデル単体の精度の方が高く良い結果とは言えません。。
アンサンブル検証2
その後、先のノートブック写経において
精度の高かったnotebook1と3のモデルを使用し、スタッキングを行いました。
メタモデルとして使用したのは、XGBRegressorです。
結果のscoreは0.4552となり、今回の最良の結果から大きく精度を落としてしまいました。。
あくまで予想ですが、
原因として、時系列であることが意味を持つデータなので
スタッキング用にデータ分割を行なったことで
学習したモデルの性質が変わってしまったのかもしれないと考察しています。。
他にも、モデルが複雑すぎるとオーバーフィッティングすることがあり
今回は、第一段階のモデルの時点で既にアンサンブルしているので
もしかするとその傾向もあるかもしれません。
あるいは、一般的な対応としては、第一段階の学習モデル
およびメタモデルを変更することも考えられます。
また機会があれば、これらの検証も行いたいと思います!
チームでの進め方について
今回3人でチームを組んで取り組みましたが
メンバーそれぞれ作業時間として確保できる時間帯がバラバラでした。
そのため、定期的にチームMTGを実施し、MTG内で各自の担当するタスクを決めて
作業は基本的に各自で行いました。
具体的には下記のように進めていきました。
① キックオフMTG
挑戦するコンペと、スケジュールを決定
② 各自データ分析
統計量の確認など行い、まずはコンペやデータの理解を深める
③ チームMTGの実施
各自で気づいた点や情報の共有、工夫できそうな部分についてディスカッション
次に行うアプローチを検討し、作業を各担当で分担
④ 各自作業
データ分析、notebookの写経、精度改善(アンサンブル)、精度確認
⑤ 3.4.を繰り返し
kaggleコンペ自体も初心者ですが
チームでの取り組みも初めてだったため模索しながらとなりました。
良かった点としては
定期的にチームMTGの開催することで
お互いの情報・状況を共有しながら、連携して進めることが出来た点です。
作業分担や、意見の出し合いなどもうまく回っていたかなと思います。
改善点としては
作業の中で困っていることや気になったことを
リアルタイムで相談しづらい点です。
作業時間帯がバラバラのため、作業中に都度slackを投げて相談というのがやりづらく
作業に詰まってしまうと進捗が一気に滞ってしまうことがありました。
定期的な作業時間は合わせづらいため
まとまった作業時間を調整して
一気に一緒に進めるようなやり方も今後試してみたいなと思います!
感想
今回の取り組みで、一通りのコンペの流れを通すことができました。
他の人のnotebookの写経では
自分では気づくことができなかったデータの特徴や
特徴量作成の工夫を知ることができ勉強になりました。
チームで取り組むことにより、それぞれの作業の結果を共有したり
複数の観点で議論することができ、
kaggle初心者の自分一人で行うよりも有意義に進められたと感じます。
ただ、練習用コンペのランキング上位のnotebookの写経から始めたのもあり
他の工夫を考えたり、それ以上のscoreを目指すのは難しかったです。
次回は練習用でないコンペにも挑戦してきたいなと思います!
それでは、次回のAI技術ブログもお楽しみに!