How to Win a Data Science Competition: Learn from Top Kagglers サマリー Week 2《重要なところだけ》: EDA


コースリンク: https://www.coursera.org/learn/competitive-data-science/
提供: National Research University, Higher School of Economics

はじめに

Kaggle初心者(natsuozawa)です。Kaggle Expertを目指して勉強しています。この講座をKaggle初心者ガイドで見つけ、面白そうだったので受けてみました。

読み返す価値のありそうな内容を集約しました。

過去の記事

EDA (Exploratory Data Analysis)

データを理解するためにデータを分析する。

ポイント: データを理解せずにモデルを組んでも、トップのスコアはたたき出せない。

基本的な過程

  1. データの領域知識(domain knowledge)をつける: ググる、Wikipediaを読むなどして、データが何を表すのか簡単に理解する
  2. データが常識的に間違っているところを見つける: 1の領域知識を使う。間違っている場合は、直す・is_correctの列を足すなどして改善できる
  3. データがどのように生成されたか理解する: バリデーションに必要。訓練データとテストデータが異なった方法で生成されていたら要注意

データの可視化

ヒストグラム

plt.hist(x)

ポイント: 異なる便個数・幅を使用したものを複数作って、データのパターンを入念に確認する

散布図

plt.plot(x, '.')

ポイント: 水平にパターンが見られるのはOKだが、縦方向にパターンがある場合データがシャッフルされていない。

なお、二つの特微量の関係を可視化することも良い。

plt.scatter(x1, x2, c=y)

ポイント:色を使いわける

平均・中央値・分散など

df.describe()

特微量同士の相関

df.corr()
plt.matshow(...)

特微量のグループ

相関する特微量をまとめてグループを見つける。特微量のグループはデータ生成に使える!

例:平均でまとめる

その他

x.value_counts()
x.isnull()
x.nunique()

検証

データの分け方

  • random split: 普通
  • 時間ベース: ある時間の前(test)と後(validation)に分ける
  • IDベース: 店番、製品IDなどに基づき分ける

ポイント:train/validationの分け方はtrain/testの分け方に似せる

検証の手法

  • Holdout: 普通のバリデーション sklearn.model_selection.ShuffleSplit
  • KFold: データのサイズが小さい場合 sklearn.model_selection.KFold
  • Leave one out (LOO): データのサイズが極めて小さい場合。名前通り。
  • Stratification: ラベルの分布を保持したい場合

ポイント:訓練で使ったデータを絶対に検証で再利用しない

検証時の問題

  • データが小さすぎる
  • データに一貫性がない

KFoldを何回も行い平均する、モデルチューニングと評価に別々の分割を使う

提出結果と検証スコアが一致しない問題

  • テストデータのサイズが小さい: しょうがない
  • テストデータの分布が訓練データと異なる: leaderboard probing、データの分け方を変える