Skip to content

Tips for data science competitions (e.g. Kaggle, SIGNATE)

Notifications You must be signed in to change notification settings

amaotone/kaggle-memo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

58 Commits
 
 
 
 

Repository files navigation

Kaggle Memo

個人的に学んだことをメモしておく場所です。Kaggleを始めたいという方はGetting Startedも参考にしてみてください。

多くの人に役立ちそうなリンク

EDA

  • 時系列性がある場合などは特に、意味のある順序にソートしてから眺める
  • ランダムにサンプリングしてcsvに吐き、Excelで眺める
  • 各列の意味を和訳しながらデータを眺める。その過程でいろいろ気づくことがあるので、メモしておく

バリデーション

  • すぐれたバリデーションを作ることがコンペの第一歩
    • 今後の全てのアイディアの評価はバリデーションの精度で行う。悪いバリデーションに最適化するのは狂った方位磁針に沿って航海するのと一緒。
  • KFold or Stratified
    • 多クラス分類ならstratified必須
    • 回帰でも1変数k-meansしてstratifiedにすることも
  • Adversarial Validationは検討したか?
  • random seedを変えてどれくらいばらつくかで自分のバリデーションの精度を確認する(Jackさん)

特徴量作成

  • ゼロかそれ以外か、0.5以上か、などの2値学習(tkmさん)
  • 予測値を特徴量に入れてもう一度学習する(Home Credit)
  • メインcsvの1行に対し、サブcsvの複数行が対応しているような場合(Home Creditとか)
    • サブに時系列性があればカテゴリ変数は最後の値を取る、などが使える
    • 逆にサブにメインをマージして、サブだけで学習してみるのも手
    • 先頭/末尾のn行で集約
  • 代表的な特徴量だけで計算したkNNで近傍500点のtargetの平均を特徴量として加える(Home Credit 1st)
    • 全変数でやるとnoisyだし、kNNは次元が増えてくると意味をなさなくなってくる

カテゴリ変数の取扱い

  • カテゴリの共起を取ってLDAする(Talkingdata 1st)
  • Target-Encodingを考える
    • 必要ならTarget-Encodingのスムージングも検討する(参考)
  • Weight of Evidence (参考)
  • NNのEmbedding Layerに突っ込む
    • cross validationしているとき、各foldでembeddingの実際の値が異なることには注意が必要。実際の値を特徴量にしてLightGBMにかける、とかは難しいかも。
  • カテゴリの表記ゆれなどがある場合はn-gramを取るなどして表記揺れをなくすとよい

欠損の処理

特徴量選択

  • Ridgeなどにかけて1変数ずつ有効かどうか確認するstepwiseを行う。LightGBMなどでできたらそちらのほうが良いが、計算時間との相談。

Representation Learning

アンサンブル

  • 種類の違うモデルは出力のレンジが異なることがあるので、公平に扱う必要がある
  • Rankにしたり、何らかの分布に押し込めたあとaverageすると良いことがある
  • Stacking
  • Quiz Blending (pdf)
  • 特徴量をbaggingしたモデルを大量につくってアンサンブル(Home Credit)

タスクの種類ごと

時系列

  • 時系列的依存性がある場合はバリデーションの切り方に注意
  • 基本的には直近のもので学習させたほうが良いが、1年前などに特徴的な周期性がないかは確認すべき
  • 時系列で重み付けしたカウントなどは有効な特徴量になり得る
  • 過去のflagのn-gramを取る(Jackさん)
  • 過去のflag推移を文字列にしてカテゴリ変数として扱うと、複雑なパターンを表現可能になることがある(Jackさん)

画像

  • imagemagickのidentify --verboseで統計量が出る (tkmさん)
  • 画像の動きが欲しい場合はOpenCVのoptical flowを取る (osciiartさん)

自然言語処理

前処理

  • BeautifulSoupでHTMLタグを消す
  • unicodedataライブラリでアクセントを消す
  • 省略形を元に戻す(don't -> do notなど)
  • シンボルなどを消す
  • stemmingやlemmatizationを行う
  • stopwordを消す(消すなという意見もあるのでよくわからん)

特徴量

  • textblobライブラリでpolarity(ネガポジ)やsubjectivity(主観性)判定が簡単にできる(src)
  • 商品カテゴリなどがいくつかのフィールドに分かれているときはすべてくっつけて文章として扱う
  • Tfidf+fastTextで強い特徴になるが、fastTextに偏りがちなのでfraction強めにいれると良いらしい (nardtreeさん)
  • fastTextをがっつりPCAなどで次元削減してTfidfと合わせる (nardtreeさん)
  • 翻訳→再翻訳してTTAするのは有効 (toxic commentで多く使われた)
  • 文章ユニークの単語の割合やすべて大文字の割合をモデルの後半でconcatする(Toxic Comment 3rd)

Pretrained Embeddingについて

  • pretrained embeddingは横に結合したり、平均をとったりして用いる
  • pretrained embeddingを使う場合、語彙ができるだけ多くpretrained embeddingに含まれていることが大事。大文字にしたり小文字にしたり、stemmingを行ったりして、できるだけたくさんの単語に対して学習済みベクトルを割り当てるのが大切(Quora 3rd)
  • スペル訂正をするときは編集距離1の単語を探すと良い
  • Projection Meta Embedding(PME)を検討する
    • 各学習済みの重みをconcatし、Dense+ReLUで低次元に写像してEmbeddingのように使う。

その他

手法ごと

Deep Learning

  • [0, 1]のregressionならbinary-crossentropyで学習するのもあり (ynktkさん)
  • 連続変数をGaussRankで処理
  • 徐々にbatch_sizeを大きくしていく (Mercari 1st)
  • AdamWとamsgradを使う(参考)
  • Kernel Onlyコンペなど、実行時間制限があって多くのモデルのアンサンブルを行えない状況ではSnapshot Ensembleを検討する。
  • 自然言語処理において、各バッチごとに系列長を決めることで学習の効率化が可能
    • 系列長の設定はバッチごとの最長でもいいが、95%点などを利用するのも良い(Quora 1st)

LightGBM

  • num_leaves多め、feature_fractionかなり小さめ、とかもあり (Avito 4th)
  • feature_fraction = sqrt(n_features)/n_features 程度だと特徴量数の影響を受けづらく、良い

Kernel Only / 2-stage制 について

  • 当たり前だが、Kernel Onlyコンペだからといって全ての作業をKernelでやらなければいけないわけではない。パラメータチューニングなどはローカルでやり、良いものをKernelに載せる
  • 2nd-stageに進むことが一番大切。Kernelがメモリ不足で落ちたり、実行時間制限にかかったりしないように心がける
    • 学習を高速化するテクニックを使うのはもちろんのこと、余計なデータの書き出しなどで時間を使わないこと

チームで動くときのノウハウ

  • slackでチームを作り、特徴量・モデル・メモ・精度などを簡単にシェアしておけるようにする
  • 今日使うサブミット数を毎朝slack botなどで聞いて調整する

おまけ

  • https://notify-bot.line.me/my/ からLINEに通知を送るアクセストークンを作れる
  • (銅メダル圏内くらいのとき)終了直前で激強kernelが出現することがあるので、最終日は2サブミット残して7時に起床し、自分のsolutionとちゃちゃっとアンサンブルできる体制を整えておく。1サブ残しだと精神的にきついので、2サブ推奨
  • 2値分類のコンペではkernel-bestのどこかの行を0にしたやつと1にしたやつを提出すると、カーネルパクリ軍団を抜かせることがある

ライブラリ

ライブラリ名 内容
eli5 デバッグと可視化。permutation importanceとかLIMEとか
PDPBox partial dependency plotの作成
albumentation 画像のaugmentation

リンク集

参戦記

Kaggle Meetup

書いている人

About

Tips for data science competitions (e.g. Kaggle, SIGNATE)

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published