How to Win a Data Science Competition: Learn from Top Kagglers Week2 講義メモ
全体概要
- How to Win a Data Science Competition: Learn from Top Kagglers の講義メモ
- 機械学習の基礎がある前提で、Kaggleで上位に喰い込むための知識、スキルを身につけるための講義
- 解説者がロシア人?のため、若干英語に癖があるが字幕があるので問題無し
- Week2は、EDA, バリデーション、データリークについて解説
1週目のメモは下記になります。
EDAとは
- データを見て、慣れるプロセスのこと
- タスクの理解それを解くために何が与えられているのかを理解する
- データを理解することで新しい特徴量を作成するための仮説を立てることができるようになる
- データをロードしてすぐにモデルにデータを食わせると一見いいスコアが得られるかもしれないが、まずは必ずEDAをするべき。そうしないとTOPにはなれない
- TOP層は注意深いEDAを行なってデータからインサイトを得ている
可視化
- EDAの一つのツールとして可視化がある
- 可視化をすることでパターンを読み取ることができる
Building intuition about the data
- ドメイン知識を得る
- ググってカラムの意味を調べる
- 直感的に正しいかどうかを調べる
- 例えばageのカラムに330才などが無いか
- クリック数がインプレッションよりおお多くなってないか
- 間違っている場合は、is_incorrectフラグを立てると良い
- trainとtestがどうやって生成されたかを理解する
- ランダムにサンプリング
- 特定のクラスをオーバーサンプリングなど
- 正しいバリデーションをするために理解が必要
- trainデータがtestデータと異なっていると、trainデータの一部はtestデータをrepresentiveしないのでバリデーションセットとして使うことはできない
- 違いがあればtrainとtestの可視化をしてみるとよくわかる
anonymized dataとは
- 例えばドキュメントの分類問題で、テキストがエンコード化されたものなど
- カラム名が匿名化されていることがある
- カラムの意味を特定できることもあるができないこともある
- できない場合はカラムがnumericなのかcategoricalなのかは判定できるはず
- df.dtyoes
- df.info()
- x.value_counts()
- x.isnull()
Visualizations
- ヒストグラム
- 特徴をbinにしてbinごとに何個あるかカウントする
- ヒストグラムはmisleadingを引き起こすこともあるので注意する. 例えば下記はほぼ0の値に偏っているように見えるが、logをとると別の分布がみられる
- これから言えることは、一つのプロットから結論を出さないことが重要
- 特徴をbinにしてbinごとに何個あるかカウントする
trainとtestのdistributionが同じかチェックするのにscatter plotを使う。下記の例でいうと、右上の方がtrainデータとマッチしていないので良くない。
Exploring individual features
- plt.scatter(x1, x2)
- pd.scatter_matrix(df)
- df.corr()
- plt.matshow( ... )
- df.mean().sort_values().plot(style=' .')
Duplicated and constance feature
- constant feature は取り除くべき
- 例えば、yearカラムがあって、配布されたデータが1年分で2018しかない場合は取り除くべき。
- data.nunique(axis=1 == 1
- trainデータでは、constant, testデータで別の値があっても学習時にはconstantな値のなので、取り除く
- duplicated featureは取り除く
- ただ学習時の邪魔になるので取り除く
- 下記のようにぱっと見違うようだが、実はduplicatedな特徴もあるのでその場合はlabel encodingして確認する
- duplicated rowsは取り除く
Validation
- validationの目的は、testデータでもっとも精度の良いモデルを選択するため
- kaggleではtrainとtestデータが与えられるが、trainデータをtrainとvalidationに分けてモデルの精度を検証する
モデルのcomplexityのちょうどいいところを探すイメージ
validation types
- Holdout
- シンプルにtrainとvalidationに分割する手法
- データが十分にある場合か異なる分割をしても同じようなスコアが出る場合は Holdoutは有効
- K-fold
- Holdoutを別の分割でk回行う手法
- k回行ったvalidationのスコアを平均したものを結果とする
- データが十分に無い場合か異なる分割をするとスコアが全然異なる場合は K-foldが有効
- Leave-one-out
- K-foldのKがtrainのサンプル数のパターン
- データがとても少量でモデルを学習させるのに十分な場合に有効
- Holdout
K-foldとHoldoutはシャッフルされたデータで利用するのが普通
- あるクラスのサンプルが少ない場合、random splitは失敗することがある
stratification(層化)
- ターゲットのクラス割合を保って分割する
- データが少ない場合や、ターゲットのクラス割合がアンバランスな場合、マルチクラス分類に有効
Data splitting strategy
- 下記のような時系列データの場合、左のケースはvalidationスコアとtestスコアが剥離する。右のケースの場合はvalidationスコアとtestスコアが近いので、右のように分割するといい
- trainとtestの分割方法を見極めて、それと同じようにtrainとvalidationを分割する
splitting data into train and validation
- random
- rowが独立している場合。例えばローンを返すかどうかを予測するケースで一行が1人に該当するような場合
- timewise
- 時系列順で最初の方をtrainデータ、後半の方をtestデータとする
- 先週の売り上げや先月の売り上げなどの特徴量が思いつく
- id
- idとはユーザやショップなどを一意に識別できるもの
- 例えば、新しいユーザに音楽のリコメンデーションをするタスクの場合、trainとtestのユーザは完全に異なる。こういったケースでは、その音楽をこれまで何回聞いたかなどの特徴量は意味をなさない
- combined
- ここよくわからなかった
- 一番重要なのは、コンペのオーガナイザによって分割されたtrainとtestと同じ分割の方法でtrainとvalidationの分割もすること
- random
Problem occurring during validation
- trainとvalidationのsplitによってスコアや最適なパラメータに大きな差が出てしまう問題
- 2月の売り上げを予測するタスクで1月をvalidationに使うようなパターン。1月は休みが多く、売り上げは大きいためMSEは2月より大きくなってしまう。だからといってモデルの精度が悪いと言えない
- この問題が起こってしまう時は下記のようなパターン
- データが少ない場合
- データがdiverseでinconsistantな場合
- この問題に対して下記の方法が考えられる
- K-Foldの平均スコアを使う
- あるfoldでモデルのチューニングを行い、別のfoldでスコアを評価する
- LBスコアとvalidationスコアに剥離が出てしまう/LBスコアとvalidationスコアの相関性が無い
- K-Fold内で大きく異なるスコアが出ているから
- public leaderboardのデータが少ないから
- この場合はvalidationを信じる
- trainとtestのdistributionが異なるから
- 例えば、trainは女性の身長、testが男性の身長データの場合、モデルのpredictionは女性の身長の平均値あたりになりvalidationではスコアがスコアがいいが、submitすると悪くなる。こういう時は、trainの平均とtestの平均の差分をsbmitデータに追加してやれば良い。
- 下記のようなdistributionの場合、validationの割合をtestの割合と同じようにしてやれば良い
- trainとvalidationのsplitによってスコアや最適なパラメータに大きな差が出てしまう問題
最後のsubmission二つのうち一つはpublic leaderboardがもっともいいもの、もう一つはvalidationスコアがもっともいいものを選ぶといい
Basic data leaks
- leakageとは予期しない情報がデータにあり、それによって非現実的な予測ができてしまうこと
コンペでleakが起こるとタスクを解くために費やした時間が無駄になってしまう
Leaks in time series
- 例えば、明後日の株価データを使って明日の株価を予測することはもちろんできないが、間違った time splitがあることできてしまうことがある
- 時系列データで、train, public, privateの分割をチェックして、一つでも on timeではないものがある場合、leakを見つけることができる?
- on timeでも未来の情報を含んでいる
- test setのrowにアクセスできるため、例えば未来のユーザヒストリーなどを取得できる
- 時系列データでleakを無くすためには、特徴量のないtest setにする。例えばIDだけとか
- 参加者は過去から特徴量を自分で作る
- Unexpected information
- 例えば、猫と犬の画像を識別するコンペで、猫の画像の方が先に撮られている場合、それが分かってしまうメタデータが残っているとleakになってしまう
- IDからleakする場合。基本はIDはランダムに割り当てられるのでモデルに組み込んでも意味はないが、何かのハッシュになっていることがあるので、使えるかどうかをチェックする価値はある
- 一般的なケースでは、データはtarget variableによってシャッフルされるが、そうでないこともあり。例えば、rowが近いものは同じラベルを持っているコンペが存在した
Leaderboard probing and example of rare data leaks
- Leaderboard probingには二種類ある
- public leaderboardからground truth(真値)を得る
- submissionの特定の行を変更してスコアを見てground truthを計算する。詳細についてはリンクを参照
- idが同じものが同じtarget値をもつ場合を考える
- submissionを全て0にして提出してスコアが改善した場合、publicにおけるground truthは0で、privateについても同様である submissionを全て0にして提出してスコアが悪くなった場合、publicにおけるground truthは1で、privateについても同様である
- C : constant prediction
- N : real number of row
- N1 : the number of rows with target
- L : LB score given by that constant prediction
- メトリックがloglossのbinary classificationタスクを考える。test setは10000 row、全て0.3で提出するとpublic scoreは1.01だった。この場合のtest setにおけるpublic部分のtarget variableの平均値は何になるか。下記の数式を使って計算すると 0.7712 になる。
- public leaderboardからground truth(真値)を得る