本記事について
先日、SIGNATEで開催されていた「SIGNATE Student Cup 2023【モデリング部門】:中古車の価格予測チャレンジ」に参加しました。
コンペティションURL : https://signate.jp/competitions/1051#terms
結果は9位/379人(Goldメダル)でした。
チームメイトに恵まれ何とかGoldメダルを獲得できました。解法を公開したいと思います。
コンペ初心者で分からないところだらけでした。改善の余地が多々あると思うので、ぜひ参考までに見ていただければと思います。
コンペティションの概要
中古自動車の情報(車種・走行距離など)をもとに、中古車の価格を予測するアルゴリズムを構築します。
また、名前の通り学生限定のコンペティションでした。
評価関数
MAPE(Mean Absolute Persentage Error 平均絶対パーセント誤差)でした。以下の式で求まります。
\frac{100}{n} \Sigma_{i=1}^n \frac{y_i - \hat{y}_i}{y_i}
データ
提供されたデータには以下のような情報が含まれていました。
-
車の状態に関するデータ
車の状態(excellent, fair, good)/走行距離/見た目の状態/年代 など -
車のタイプに関するデータ
車種/製造社/シリンダーの数/燃料/ATorMT/大きさ/など -
販売場所データ
販売地域/販売州
解法の概要
主な工夫点として以下二つを行いました
- 特徴量エンジニアリング
- 多峰性の考慮
予測アルゴリズムとしてはLightGBMを用いました。
内容を説明します。
特徴エンジニアリング
フォーラムや情報共有のSlackで議論されていた内容を導入しました。特に特別なことはしていません。
- カテゴリー変数のターゲットエンコーディング
- 表記ゆれの修正
- 販売地域を補完する
など
多峰性の考慮
中古車価格の分布をカーネル密度推定して描画したのが下の図です。
単純な正規分布でなく山が三つ程あることがわかります。
単純にLightGBMで予測した結果を重ねると以下のようになります。
オレンジが予測値です。
多峰性を表現できていないことがわかります。
これをなるべく表現できるよう複数のモデルを組み合わせることを試しました。
以下の4つのモデルを作成しました
- 全てのデータを使ったLightGBMモデル
- 価格が12,000以下のデータのみで作ったLightGBMモデル (一つ目の山を表現したい)
- 価格が10,000以上のデータのみで作ったLightGBMモデル(2つ目の山を表現したい)
- 価格が25,000以上のデータのみで作ったLighGBMモデル(3つ目の山を表現したい)
1のモデルの結果をもとに、この4つのモデルを組み合わせました。
具体的には
-
1の予測結果が10,000未満
⇒1と2を7:3の割合で足し合わせる -
1の予測結果が10,000以上12,000未満
⇒1の結果のみ -
1の予測結果が12,000以上25,000未満
⇒1と3を6:4の割合で足し合わせる -
1の予測結果が25,000以上
⇒1と4を6:4の割合で足し合わせる
足し合わせる際の割合は試してよかったものを使っただけです。
多峰性を考慮するという観点はよかったと思いますが、もっと良い方法があると思います。
GBDT系のモデルを二段階に重ねる(一段階目で価格の高低の2クラス分類を行い、2段階目にその予測確率を特徴量に加える)という解法を目にして、この方がスマートだなと感じました。
(参考URL:https://dena.ai/news/career-up-challenge/)
解法の説明は以上です。拙い説明に付き合っていただきありがとうございます。
何か参考になれば幸いです。