TL;DR
- KFoldのseedをたくさん試して手元のCVスコアを上げるのは有効なテクニックである
- それが有効であることの数学的証明はないが、Stratified KFoldという機能の存在が傍証になっている
- これが効いてSignateCup2024で銀メダル取れた。しかも自分の時間は4時間ほどしか使わなかった。この省エネ入賞は全参加者中でもトップレベルのはず。
- ただし、データ量が少なめのコンペ向け。実務でどれだけ役立つかは不明、というか役に立たないことのほうが多そう
はじめに
機械学習の分野では、KFoldというテクニックがあります。KFoldの基本については他に優れた記事が多数あるので解説はそちらを参照してください。要は、訓練データをうまく分割して独立した複数のモデルを作り、そのアンサンブルを最終的なモデルとすることで成績向上を目指す、というものです。
その派生形で、StratifiedKFoldというのがあります。公式マニュアルによると、
This cross-validation object is a variation of KFold that returns stratified folds. The folds are made by preserving the percentage of samples for each class.
とあります。単に訓練データを分割するのではなく、分割された各Foldにおいて各カラムの分布ができるだけ等しくなるようにする、という制約を課すのですね。
どんなときに役に立つのか
主に、訓練データの件数が少なくて、適当な乱数でFoldに分割すると特徴量や目的変数の分布に偏りが出やすい場合です。
考えてみれば当然の話で、あるFoldには5%の陽性率、別のFoldでは20%の陽性率、とかではモデルのでき方が全然異なるので、それのアンサンブルを取っても効果は薄いというわけです。これは納得いきます。
訓練データに充分な量があれば適当にFoldに分けても均等になりますが、今回のコンペのように訓練データ件数が数千の量しかないと乱数によって不均衡になることはよくあります。
均等分散だけでいいのか?
僕が疑問を持ったのはここです。適当な乱数でFoldを作り、特徴量は均等に分布していてもFold間の「件数だけを見ていてはわからない偏り」によっては、偏ったモデルができて成績は不振になるのではないか?という疑問です。実際、各Foldの挙動を見ると、同じ入力でもけっこう違う値を出すことが見られます。
逆に、すべての特徴量がFold間で完全に均一で均衡していると、どのFoldでも同じモデルになってしまってアンサンブルの効果が出ません。アンサンブルの効果が出るのは均衡と不均衡の中間のどこかの「ちょうどいい」地点にあるはずなのです。単に陽性率が均等、とかだけではなく、分布の仕方が手元のCVに絶妙に効く「秘孔」があるのではないか? これが発想です。このへんの意味合いは言葉では伝えづらいところがあるのでもどかしいですが。
Super Seedを探せ!
僕はこの戦術をとりました。Stratified KFoldに任せきりでなく、究極のKFoldが出てくるようなseedを自力で探索するのです。
- ある範囲(例えば1~100万)の乱数シードについて、それぞれでKFoldを作成する(この個数が適切かはよくわかりません。自分の時間的都合で適当に決めました。)
- 各Foldの陽性率が均衡していないシードをはじく
- これは計算量削減のためです。StratifiedKFoldに採用されないようなseedは無条件で弾いていきます。僕は事前のちょっとしたリサーチで、陽性率の均衡率でトップ1%に入る乱数シードだけを次のステップに進ませました。
- この一次選考を通過した乱数シード(約1万個)によるKFoldで実際にモデルを作り、訓練データに対するスコアを計算していく。
- 訓練データでベストスコアを出した乱数シード(これをSuper Seedと名付けました)を使ってできたモデルをsubmit候補とする。
これが意味のある行為なのか、はかなり悩みました。特に、この試行錯誤の序盤で見つかった乱数シードがずっと自分の中ではベストスコアを叩きだしてたので、単なる偶然にしてはできすぎてるのではないかという疑問が生じ判断に乱れが出ました。ですが考察した結果、これはハイパーパラメータの最適値の探索の一種に過ぎない、というのが結論です。ハイパーパラメータの最適値探索でいろいろ試し、ハイスコアのものを採用するのは基本的な手順です。
また、KFoldで分割した評価用データは評価値の計算にしか使わない、というルールを愚直に守っていればリークにはなりようがないですから、これも自信になりました。リークしてないことが確信できるならセコい手段でもいいんです。
繰り返しますが、これは全体の訓練データが静的かつ量が少なく、一方でモデルの精度を追求する場合にしか使えないテクニックです。コンペ専用といってもいいでしょう。