Santanderコンペ中に日記をつけようとしたけど途中で飽きたもの

ここはチラシの裏――

3/7 (木) くらい

R コンペがのメダルが確定して Expert になったのでしばらく Kaggle はいいかなとか思ったけど
コンペがいっぱいあってつよい人が分散してる今しか Master になるチャンスはないのでは?とも思っていた 、
Signate の音声コンペで3位を取っていた方が Santander で4位にいることに気づいたので
リベンジするために(?)Santander を始める

この時点での kernel top は 0.898 か 0.899 くらいだったはず
R コンペのときの友人も誘ったが忙しそうだったので1人でやることになった

discussion や公開 kernel で触れられていることは

  • データが綺麗すぎる(欠損値がない、全部数値データ)
  • 変数どうしの相関係数を取るとどれもほぼ 0 (列が直交している)
  • そのため主成分分析済みのデータかと疑う意見もあった(否定的な意見の方がそれっぽかった)
  • var_68 が奇妙 (分散が小さいのに小数第4位で丸められているせい)
  • なにか工夫をするよりそのまま LGBM にかける方が良いスコアが出る

他に得られた情報として、

  • LB の 4位以下のスコアは 0.901 以下なのに上位 3 位は 0.904 以上
  • このツイート

があったので、何かあるんだろうなと思った

3/8 (金) くらい

なんかデータランダムじゃなくない?と思った(このときはヒストグラムの書き方が悪くて勘違いしただけ)ので変数を Count Encoding してみたら何故かスコアが上がった
この時点では LGBM のパラメータを公開 kernel にあるベストなやつにしてなかったりしたので上位に上がったのは次の日の朝

3/9 (土)

Count Encoding したやつを提出したら 0.900 の最上位近くに来た (CV は 0.90374)

ヒストグラムの書き方の間違いに気付いたので無限に悩み始めた

The Zoo チームがぶっちぎりのスコアを出して LB 1位 に躍り出ていた

変数ごとにガウス混合モデルつかってどの山に属するかの特徴を作って
Count Encoding したやつと一緒に計 1000 特徴で学習したらなんかちょっと上がって 0.901 の最下位になった (CV は 0.90212 で低下)
たぶん誤差

この時点で 11 位

3/10 (日)

カーネル密度推定 (KDE) を試したけど効果がなかった

bandwidth=0.004 は見た目と直感で決めた

たしかこの日くらいに一瞬 12 位に落ちたあと 11 位に戻った気がする
その後に GIBA 氏が The Zoo に join したんだけどあれは GIBA 氏だったのか・・・?

3/11 (月)

kde/count_enc の特徴量を (元の変数、count_enc と合わせて計 600 特徴量で) 使ってみると CV で 0.90578 が出た(LB は 0.900)

3/12 (火)

train の count_enc の平均と test の count_enc の平均に必ず 1.5 程度の差があることに気付いた (test のが大きい)

それに基づいて test だけ count_enc の値から 1.0 を引いて 400 特徴量で学習すると
LB が 0.901 中位くらいで 11 位から 8 位に上がった

private と public の境目らしきものに気付いた

夜 2 時間くらいしか寝られなかった

3/13 (水)

mamas さんとチームマージさせていただいた

count_enc の平均はだいたい train+2 ≒ public+1 ≒ private になってることに気付いた

それに基づいて test だけ count_enc の値から 1.0 を引いて 400 特徴量で学習すると
LB が 0.902 になって 7 位になった(直後に 8 位に戻された)

夜中
private が 50000 個ずつに分けられることを発見した
public も 50000 個ずつに分けられた group1, group2 とした

3/14 (木)

朝 Disscussion に動きがあった https://www.kaggle.com/c/santander-customer-transaction-prediction/discussion/83882

train を target で分けて各列をシャッフルしても結果が変わらないという
このスレで CPMP がカテゴリカル変数なんじゃね的なことを言ってる
勘弁してほしい

シャッフルしても結果が変わらないってことは多分交互作用がないってことなので
ロジスティック回帰が結構良い精度出すって情報見たときに気づくべきだったなと思った

group2 を全部 0 にして submit したらスコアが変わらなくて意味不明だった
group1 を全部 0 にすると 0.500 になった
group2 || private を 0 にすると 0.901 (変化なし) だった
50% ってうそじゃん!ってなった
こうなると今まで public と private と呼んでいたものが本当に public と private なのか怪しくなってくる

mamas さんがダミーデータが入ってるのでは?と考えてくれたのでなるほどとなった

mamas さんに AUC について教わったりした

色々と提案していただいた
・全体でcount encodingした特徴を加える
・count encodingをグループ毎に行う(public group1, public, group2, private group1, private group2)
・catboostでカテゴリカルを使う
・XGBoostでexact

3/15 (金)

そういえば num_leaves=2 のモデルが効果的だって話があったけどこれ交互作用を考慮してないモデルだな?って気付いた

LB が 0.902 のやつ(元の 200 特徴と count_enc から test だけ 1 を引いた 200 特徴の計 400 特徴)に、
Train だけに fit させた Count Encoding 特徴を加えて 600 特徴で学習させると LB が 0.903 になった

その後、複製されたデータを全部除いて Count Encoding すれば良いんじゃね?と気付いて
やってみたら count_enc の平均が違う問題とか CV と LB が一致しない問題とか色々と解決した
CV 0.90438, LB 0.904 で 8 位になってようやくスタートラインに立った気がした

⎳geu(るぎう) on Twitter: "なるほどね… "

cnt_trn と cnt_all の比をとってみると CV 0.90478 になった

mamas さんに GCP の使い方を教わった
32CPU、128GB RAM、つよそう
プリエンプティブならお金出すのでどんどん使ってください的なことを言われた
僕は貧乏性だったので価値観の違いを感じてちょっとつらい気持ちになった

cnt_trn と cnt_all の比を取った 200 特徴と差をとった(これは実質的に cnt_test) 200 特徴を加えて、
計 1000 特徴で学習させると CV 0.90517 LB 0.905 が出た(差を取るのは mamas さんの提案)

3/16 (土)

AtCoderAGC があったので始まる前に発見の要点だけ mamas さんに伝えておいた

・talkingdataをググった
kdeを試したらcntとの比でスコアが上がった
 ・比を取らないでそのまま使うとCVが下がった
・ダミーのデータは正例でも負例でもなさそうだった
 ・public(だと思っていたもの)から目的変数にかかわらず適当に値をコピーしてる

AGC で爆死したのでしばらく引きずった

mamas さんからカテゴリカル特徴と numerical 特徴が混ざってると仮定した場合の処理を
色々と教わった

3/17 (日)

カテゴリカル特徴があると仮定して 2 つの列を使った aggrigation 特徴を作ったがスコアは下がった

この日に自分の見つけたのはこんな感じだった
・cnt/kdeの特徴量が割と強くて、cnt_trnとcnt_trn/cnt_allを消しても(=元の変数とcnt_allとcnt/kdeの600特徴で学習させても)ほとんどCVが変わらない
・target=1とtarget=0でcnt/kdeの分布が変わらないように見える

3/18 (月)

朝(昼)目を覚ますと mamas さんが 10 時くらいにこんなツイートをしていた

スマホを見ると mamas さんからの 9 時頃の通知があったが探しても見つからなくて幻覚だったのか?となった

mamas さんが何を発見したのか知らされてなくてずっと悶々としていた

KDE の bandwidth を倍にしたり半分にしたりしたやつの学習を試したりした(効果は微妙)

結構昼寝した

colsample_bytree を 0.05 から 0.5 まで上げたら LB 0.909 が出て順位が上がった
0.05 は交互作用あんまり考えないってことだったからそれはそうだった
0.9 も試したけどやりすぎっぽかった

夜になって教えてもらったことによれば、どうやらデータは既にシャッフル済みのものらしい
話を聞いているときは割と疑ってかかってたがその後いろいろ考えてみると段々と納得してきた
それなら確かに count encoding が効いたり kde が効いたりする
そっから使える特徴が何か話し合ったりした

各 n について var_n と n_count_enc と n_cnt_per_kde だけで予測して、
その 200 個の予測結果をつかって num_leaves=2 で学習 (stacking) させたらスコアが爆上がりした

それぞれちびモデルとメタモデルと名付けられた

3/19 (月) ~ 3/25 (月)

あらゆることを試したがスコアがびくともしない
順位が 3 位から 11 位に落ちた
public/private 分割とダミーデータの存在が Kernel で一気にバレた
もうおしまいだよ

3/26 (火)

mamas さんと久々におはなしして kde 抜いたのを試してないなとなったので抜いてみたらいとも簡単にスコアが上がってしまった

それとは全く関係なく、ちびモデルの num_leaves を 13 から 7 に減らしたらもっとスコアが上がってしまった

3/27 (水)

パラメタ探索を始めた

日記はここで終わっている・・・