How to Win a Data Science Competition Week1

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

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

Competition Mechanics

  • コンペルールはしっかり読む
  • モデルを特定のアルゴリズムとして考えない
  • ソースやモデルを求めず、Prediction のみ求められるものも多い
  • モデルの質は、Evaluation function により採点される
  • Evaluation function はしっかり理解する
  • データは、Public と Private に分けられている。

  • コンペに参加する理由は、学びの場

kaggle Overview

  • 参加する前にルールはしっかり読み込む
  • 講師は基本的にローカルで実行している
  • kaggle kernel はアイデアチェックやシェアする際に利用してる

Real World Application

  • 競技について
    • 機械学習コンペにおいて、アルゴリズムだけが重要というわけではない
    • アルゴリズムは単なるツールで、だれでも簡単に利用できる
    • いくつかのコンペは、高度な機械学習技術無く分析的に解決することができた
  • データや使用するツール、特徴量を理解することが重要
  • Don't limit yourself
  • 気を付ける必要があるのは、ターゲット指標のみ
  • Golden特徴量を作成するために、ヒューリスティックな主導のデータ分析を使用する

  • 重要なのは、創造性

  • 堅実な機械学習の問題に対する従来のアプローチを理解する必要はあるが、縛られたらだめ
  • ソースコードを読み、変更することもためらわない

  • お金を得ることに夢中になるな

  • コンペを楽しみ、得る経験ははるかに重要

Recap of main ML algorithm

線形モデル

  • 単純なアプローチなのでいパンできな問題を解決するのは難しい
  • 空間を超える平面で区切られた部分空間に分割する
  • Vowpal Wabbit は非常に大きなデータセットを処理するように設計されている

ツリーベースメソッド

  • ツリーベースは、より複雑なモデル構築するために、基本木を使用する
  • 分割をつなげていくイメージ
  • ツリーモデルで有名なのは、RandomForestGradient Boost Decision Tree (GBDT)
  • 一般的にツリーベースモデルは非常に強力
  • 表形式データに適したデファクトスタンダード
  • ほとんどすべてのコンペにて上位ランカーが使用
  • ツリーベースは、多くの分割が必要になるので線形依存関係をつかむのは困難
  • Scikit-Learn には、GBDTは実装されているが遅い
  • より高速/正確な XGBoost や LightGBM が好まれる

kNN (k-Nearest Neighbors)

  • 互いに近いポイントは同様のラベルを持つ可能性高いと仮定
  • ポイントの近さを測定する方法に大きく依存する

ニューラルネット (Neural Network)

  • 機械学習モデルの中で特別なモデル
  • 近年非常に注目されている
  • 様々なライブラリが登場しているが、 PyTorchおすすめ

No Free Lunch theory
すべてのタスクにおいてほかのすべてを上回るメソッドはない。理由は、すべての方法がデータまたはタスクに関するいくつかの過程に依存しているため。これらの過程が満たされない場合、リミテッドのパフォーマンスは低下する。よって異なる前提に基づいた様々なツールが必要。

Software/Hardwafer Requirement

  • 通常、多くの計算リソース必要ない
  • 画像ベースを除く多くのコンペでは、数Gb未満のデータ
  • 16GB RAM と 4core のラップトップで処理可能
  • 贅沢言うなら32GB RAM と 6core タワーPC
  • 特に RAM は重要。64GB欲しい。
  • 次にコア数
  • 次にストレージ。メモリに収まらないデータセットを扱う場合、データのチャンクを読み書きするための高速なディスク不可欠。(SSD)
  • クラウドでレンタルするのおすすめ
  • 多 RAM, core, GPU を搭載
  • AWS, Azure, Google Cloud

  • R/python。python 強くお勧め

Overview

すべてのコンペにおいて、特定のデータセットを前処理し、既存データセットから新しい機能を生成する必要がある。以下では、数値特徴量、カテゴリ特徴量、日付型特徴量、座標特徴量について説明。また、使用するモデルに対する前処理と生成の依存性についても議論する。

Numeric features

  • スケールに依存するモデルとしないモデルがある
  • 全モデルをツリーベースと非ツリーベースに分ける
  • 決定木分類器は、各特徴量の最も有効な分割を見つけようとするが、その特徴量に定数をかけても問題はない
  • 一方で、kNN、線形モデル、ニューラルネットワークは、この処理で問題が生じる
  • 線形モデルでは、最初に各特徴量を正則化する必要あり
  • 適切なスケーリング無しでは、勾配降下法がうまく機能しない
  • すべての特徴量を同じスケールに再スケールする方法がある
  • sklearn のMinMaxScaler
    • 最小値を0, 最大値を1にする
    • MinMaxScaling は、その特徴量の分布は変化しない。[0,1]に収めるだけ
  • sklearn のStandardScaler
    • 平均値を引いて、標準偏差で割る
  • kNNでは、大きな特徴量ほどkNNにとって重要。
  • より重要と思われる特徴量を強化(重み付け)
  • 外れ値がある場合、上記のスケーリングがおかしくなる。(正常な値が一か所にかたまってしまう)
  • 外れ値を除外するためにパーセンタイルクリッピングを利用する。
  • ランク変換
    適切に分類された値の間のスペースが等しくなるように設定する。この変換は、外れ値がある場合、MinMaxScalerよりも優れる可能性ある。ランクは、scipyからランダムデータ関数として使える。 ランク変換する際には、トレーニングとテストデータを連結させてからやる。これは非ツリーベースおよびニューラルネットに有用。
  • 平方根抽出、Log変換
    これらもニューラルネットや非ツリーベースに役立つ可能性有。特徴量の平均値に近い大きすぎる値を処理するのに便利。これによりゼロに近い値はより識別しやすくなる。単純だが、これらはニューラルネットにかなり効く。
  • すべての前処理に当てはまる有用な処理は、連結データフレームでモデルをトレーニングする
  • また、異なる前処理データをトレーニングするモデルを混合することが有益になることも
  • 線形モデル、kNN、NNにはこれらの処理がほんとに効く
  • データを掘り下げ、仮説を作成して確認し、これにより得られた知識と直感を使って新し徳超量を導出することは重要
    • 不動産価格および面積がある場合、単位面積当たりの価格という特徴量を追加する。
    • 直角距離が与えられたら、対角距離を追加する
    • 加算、乗算、除算およびその他の特徴量の相互作用は役に立つ
  • GBDTモデルには、特徴量間の相互作用特徴量はマジで効く
    • size feature を追加するとツリーの量が少なくなって堅牢なモデルになるよ
  • ほかにも製品価格があったら、その小数点以下の値を別の特徴量として追加する
    • これは価格に対する人々の認識の違いを浮き出させる
  • オークションデータなら、人間は価格としてラウンド数を設定する傾向があるため、0.93.....と非常に長い数字が出てきたり
  • スパムボット検出では、正確に1秒間隔で行動してるやつとか
  • このような特徴量の生成は、データの理解により促進される => データ理解大事だよ

Categorical and ordinal features

  • titanic データ内の、性別、キャビン等はカテゴリカルデータ
  • Pclassは、チケットクラスを表し3つ値をとる。これは順序的なので ordinalデータ
    • 基本的に順序に意味があるだろう
    • Pclass が、Numericalデータなら、1と2の差と2と3の差は等しい。今回は違う。
    • Pclass間の大小はわからない
    • ほかには、運転免許証の種類(A,B,C,D)や教育レベル(幼稚園、小学校、学部、学士、修士、博士)
    • これらは複雑な順序でソートされている。=> 有用
    • カテゴリ特徴量をエンコードする簡単な寳保は、一意の値を異なる数値にマッピングする(ラベルエンコード)
    • ツリーメソッドは特徴量を分割して、カテゴリ内の有用な値のほとんどを独自に抽出するので効く
    • 非ツリーモデルは、効果ない (linear model, NN など)
    • カテゴリカル特徴量をしようしてラベルエンコードする際には、アルファベット順もしくはソート順にエンコードする必要あり(ラベルエンコーダー)
    • ソート順でやる場合は、pandas.factorize関数 : 機械学習の前処理 重複行・列の削除、ラベルエンコード
    • ほかには、frequency encoding 機能がある
      • その値の頻度で割合を決める。例えば c=0.3, s=0.5, q=0.2など。
      • これにより値の分布が保持されて線形モデルなどに利用できる。
      • 値の頻度がターゲットと相関あれば効く
  • 一位の値ごとに新しいコードを作成して、それ以外をすべてゼロ埋めするワンホットエンコーディング

    • linear model, kNN や NN などのモデルにて有効

    • ただし、ワンホットエンコードで多くのバイナリ特徴量を作って、tree model に渡すのはやめよう。速度低下。精度不明。

    • カテゴリ特徴量に一意の値が多すぎる場合、大半が0である特徴量を山ほど作ることになる。
    • これらの特徴量をスパース行列として扱う => RAMに0以外の値のみを保持するので効率的
    • XGBoost, Light GBM, sklearn は、スパース行列を直接扱える
  • 特徴量の相互作用
    • ターゲットが、複数の特徴量の組み合わせに相関があると考えれるとき、有効。
    • それらの特徴量の組み合わせを並べて、ワンホットエンコーディングすると簡単にモデルに学習させられる

Datetime and coordinates

  • 日時データは全く異なるデータ。年、日、週などの様々な層がある
  • 日時から生成される特徴量は、2つのカテゴリに分類される
    1. ある機関の時間的瞬間
      秒、分、時間、曜日、月、年などの。データ繰り返しパターンをキャプチャするのに役立つ
      薬の効能を予測するために、3日ごとに1回錠剤を服用する場合、これを特別な期間とみなせる。
    2. 特定イベントからの経過時間
      店舗での売り上げ予測で、最後の休日、週末、または最後のキャンペーンから経過した日数。または残日数。
      全ユーザのlast_purchase_date と last_call_date からdate_diffが作れる。

  • Coordinate data
    • 不動産価格推定時に、マップ上の重要なポイントまでの距離を計算できる。
    • 最寄りの店舗や病院、近隣の最高の学校などのデータをどんどん追加できる。
    • グリッド付きの正方形に新しいマップを作成し、各正方形内で最も効果なフラットを見つけ、その正方形内のほかのすべてのオブジェクトについて、そのフラットに距離を追加できる。
    • 古い建物があるなど、特別なエリアを見つけて、そのエリアに距離を追加できる
    • 平均不動産価格も追加できる
    • 座標トリックとして重要なのが、決定木訓練時に、わずかに開店した座標を追加する
    • どのような回転がいいかはわからないことが多いので、45°または22.5°を追加する。
    • 相対価格予測時に、ある通りで分けられたエリアを考えられる可能性があるため

Handling missing

  • 学習前処理としてデータの欠損値対処の必要がある
  • これらは、空文字、NaN、-999 だったり => 学習にとってノイズであったり、効果的に使えたり
  • 欠損値見つけ方例
    • ヒストグラムを見て、きれいな分布と離れたところにピーク値がポツンとある
    • もしくは分布内に大きくピークを持つ。意図的に欠損値が平均値や中央値で代入されているかも
  • 欠損値への対処
    1. 分布の塊の外の値で代入する -999など
      • 線形モデルのパフォーマンス低下の可能性あり
    2. 平均値または中央値で置き換える
      • 線形モデル、ニューラルネットワークモデルに有効
      • tree ベースモデルにはよくない
    3. 新たなカテゴリを作成する。
      • どの行に欠損値があったかを示す isnull 特徴量
  • 時系列の欠損
    • 1カ月の気温データでいくつか欠損
      • 欠損の近傍データから推測できる
  • 欠損値の置換には非常に注意が必要
  • 何も考えずに、平均値や中央値を入れるとおかしくなることもある
  • 欠損値を見つけたらその特徴量を注意深く考察する必要あり
  • 欠損値を含む特徴量の平均や中央値を見る際には、欠損値は無視する(-999などが大量にあるとこの値に近くなってしまう)
  • 外れ値を欠損値としてみなすことも boosting モデルでは効くことある