How to Win a Data Science Competition Week2-01

Posted on 2019/09/04 in 機械学習 , Updated on: 2019/09/04

coursera の How to Win a Data Science Competition: Learn from Top Kagglers の Week 2 のまとめ1。

Exploratory data

  • EDA (Exploratory data analysis) 探索的データ解析
    データを調べて理解し、慣れ親しむプロセス。問題を解決するためには、問題を理解し、何を知るかが重要。データを調べずにただ機械学習モデルに学習させて結果を提出するだけでも高得点は得られるかもしれないが、トップスコアを得ることはない。

    主なEDAツールは、データの可視化。これによりデータのパターンを浮き彫りにし、そのパターンはなぜ存在するのかを考える。ここから仮説を立てていく。

  • EDAは
    • データをよく理解でき
    • データに対する直感を得て
    • 仮説を立てることで
    • 洞察を得る

Building intuition about the data

  • kaggleコンペには様々な種類のデータを扱う必要がある
    • 3次元スキャン画像から異常検出
    • 不動産価格
    • 衛星画像の分類。。。
  • ドメイン知識を持っていない分野が多いだろう
  • また常に提供されているデータが正常かどうかもわからない
  • ベースラインを構築するためにも、理解することは重要
  • コンペに参加する前にある程度、勉強するといい
    • 不動産価格予測コンペなら、どのような条件が不動産価格を決定しうるのかを調べてみる等
  • またドメイン知識が使えるデータかを確認する
  • 年齢データに200という数字があれば明らかに対処する必要があることがわかる
    • 336という値があれば、本当は 33 or 36 の打ち間違いなのか?等

  • データの間違いを見つけたら、例えば "is_incorrect" 特徴量を新たに作ってみる
  • train と test データの分布を確認することも重要
  • 異なるアルゴリズムで生成されていたら対処する必要がある
    => じゃないとモデルの適切な検証を確立できない

Exploring anonymized data

  • データの特徴量は匿名化されていることも多々ある
    • 単語がハッシュ化されていたり
    • 意図的に値が変更されていたり
    • ダミーに置き換えられていたり
  • これらのデータをデコードすることができることもある
    これが最終的に高得点につながることも

  • まず行うことは、特徴量のタイプを推測して、数値データやカテゴリデータに分ける
  • 次に各特徴量の相互関係を探る
code function
df.dtypes 各特徴量のデータ型を確認
df.info() 有効データ数などの情報を確認
x.value_counts() 値の頻度を確認
x.isnull() NaN値の有無を確認


  • 実際に匿名化されたデータで、中身を認識できることは少ない
  • でも特徴量の種類を認識することは重要(category, numerical, binary, text ..)

Visualization

  • 個々の特徴量を可視化
    • ヒストグラム
    • プロット(index vs 値)
    • 統計量

  • 特徴量相互関係の可視化
    • Pairs
      • 散布図行列 (Scatter plot matrix)
      • 相関図 (Corrplot)
    • Groups
      • Corrplot + clustering
      • プロット (index vs 特徴量統計量)

  • ヒストグラム plt.hist(x)
    • ヒストグラムを描画する際には、binの値に注意
    • bin数が荒いと、近い値が固まっているのか同じ値の頻度が高いのわからないから
    • ヒストグラム図が大きく偏っている場合は、値の対数をとって再度ヒストグラム図を描画してみる
      => 単一のグラフで結論をだしてはいけない
    • 値におかしなピークがある場合は、欠損値がその値で埋められている可能性あり
    • 欠損値を -999 で埋めてみる。線形モデルで有効

  • plot (index vs 値) plt.plot(x, '.')
    • プロット通しを線でつながずに点で描画する
    • 水平線が現れたら、該当特徴量に頻度の高い値がある
    • 垂直パターンが無ければ、データは適切にシャッフルされている
    • ラベルによる色分けも有効。これできれいに分かれるようなら非常に有用な特徴量だとわかる plt.scatter(range(len(x)), x, c=y)
    • 回帰タスクでは、ターゲット値をポイントサイズで視覚化するのもいい
    • 散布図を使って、train と test の分布が同じかも確認できる
      • もし分布が重ならなければ一旦考えよう
      • コードのミスなのか、もしくはこの特徴量は有益ではないのか等

  • Scatter plot
    • 特徴量の数が少ないときに便利
    • 散布図とヒストグラムを一度に描画できる

  • 相関図
    • df.corr(), plt.matshow() により相関係数を比較
    • 何かしらの関係を持つ特徴量を使って新たな特徴量を作る
      • 特徴量間の距離やカウント数
      • 何倍多きか

  • 特徴量の平均をプロットしてみる。ばらばらでも何かしらでソートすると関係が見えたり
    • df.mean().plot(style='.') => df.mean().sort_values().plot(stype='.')
  • 類似した特徴量は、グループとしてその中で新しい特徴量をつくっていくべき
  • 特徴量のグループ見つけに役立つ機能
code function
plt.scatter(x1, x2) 特徴量x1とx2の散布図
pd.scatter_matrix(df) データフレーム内の特徴量間関係とヒストグラム
df.corr() 各特徴量間の相関係数
df.mean().sort_values().plot(stype='.') 特徴量の平均をソートしてプロット