10th place approach (physyuki part)
使用したモデルはLightGBMのみです。
特徴量作成・選択
- 素の特徴量だけで学習してimportanceが高い特徴量の引き算、かけ算、割り算
- 各特徴量を組み合わせてtarget encoding
- 各特徴量でaggregationして他の特徴量の統計量を計算
この方法で作った約600の特徴をimportance上位50位、100位とかで切ってもあまりスコアは伸びなかったです。
チームメイトのtakoiさんと、ある程度お互い作業してから情報交換を行いました。そこで
- 各特徴を組み合わせた変数でaggregationしてcommute、ageをメインにmean, std, meanとのratio
- その際、子供一人以上フラグが結構効いている
との情報をいただき、上記の作業で「各特徴量を組み合わせてaggregationして他の特徴量の統計量を計算」をやっていなかったことに思い至りました。そこで
- 子供一人以上フラグを軸に2特徴の組み合わせ、3特徴の組み合わせでaggregationして他の特徴のmean, std, meanとの比, meanとの差
で特徴量を作りました。importanceで切るのはうまくいかなかったので、いくつかのかたまりで特徴量を追加してCVが改善すれば採用、という特徴選択方法でCVが大きく伸びました。
さらに色んな組み合わせのaggregation系特徴量や、大きく予測を外しているデータを確認してそれらを改善してくれそうと考えた特徴量を増やしましたが、CV改善には繋がりませんでした。
最後にあるオンサイトコンペで学んだ、重要な特徴量のかけ算・割り算などの特徴量は絶対に作り忘れない、というの思い出して
- importance1位に来ている特徴量と上位に残っている素の特徴量のかけ算・割り算
の特徴量を作り、CVが少し改善しました。
モデル
先に要点をまとめておきます。
- targetとpositionごとのtarget平均との差分を予測するモデルを作成
- 分類問題として扱うモデルも作成
- augmentation, pseudo labelingを行った
まず、targetを予測するモデルと、targetとpositionごとのtarget平均との差分を予測するモデルの2つに取り組みました。これも先ほど言及したオンサイトコンペで得た知見です。後者は最初スコアが伸びずに使っていなかったのですが、takoiさんと情報交換してから作ったchildフラグまわりの特徴量で大きく改善したので使うことにしました。
さらに上記の各モデルに対して、targetを0~1に収まるように変換しobjectiveをxentropyとして分類問題のように学習したモデルも作りました。つまり、全部で4つのモデルを作成しました。あと、targetの分布が歪んでいるのでlogで変換しました。
使用した特徴量の数は
- targetを予測するモデル: 37個
- targetとpositionごとのtarget平均との差分を予測するモデル: 72個
です。
augmentation
EDAからsexとtargetだけに注目すると2変数間に関係がなさそうだったので、試しにtrainのsexだけを反転させたデータを元のtrainにくっつけてデータ量を2倍にして学習しました。CVはほぼ変化なしでしたが、LBが0.4ぐらい改善しました。これはかなり初期の段階の実験なので、最後の方のモデルではどれくらい効いてたか分からないです。本腰入れて取り組み始めたのが終了1週間ぐらい前なので、残されたサブミットに限りがあったからです。
pseudo labeling
大きく予測を外しているtest側のデータも学習に使ってしまうことになりますが、こういうデータはもう良い予測をするのを諦めて、今ある程度良い予測をできているデータを全力で予測しにいくというお気持ちでやりました。これも初期段階ではLB: 0.2ぐらい改善しましたが、終盤にはどれくらいの寄与があったか分かりません。
最終的にこの4つのモデルの重み付き平均でLB: 20.788でした。
これをtakoiさんのモデルとアンサンブルしたものがベストスコアです。チームでNNは使っていません。