How to Win a Data Science Competition: Learn from Top Kagglers Week1 講義メモ

## 全体概要
- 機械学習の基礎がある前提で、Kaggleで上位に喰い込むための知識、スキルを身につけるための講義
- 若干英語に癖があるが字幕があるので問題無し
- Week1は、データの前処理についての解説がメイン

## Week1
#### データ分析コンペ
Kaggle以外にもたくさんある。例えば下記。

- Kaggle
- DrivenData
- CrowdAnalityx
- CodaLab
- DataScienceChallenge.new
- Datascience.net
- SIngle-cometition sites like KDD, VizDoom

参加前にルールはちゃんと確認しよう。

#### 現実とでコンペの違い
現実だと下記などを考慮する必要がある。

- 課題設定
- 評価指標の決定
- 推論速度
- データ収集
- モデルの複雑性の考慮

コンペだとターゲットである評価指標がよければ、推論速度もモデルが複雑であっても、メモリをたくさん消費しようともOK！

#### Recap of main ML algorithms
- linear Model
   - Vompal Wabbit Library
      - 大きいデータセット向けに設計されている
- tree based model
- k-NN
- neural net

No free lunch theorem(ノーフリーランチ定理)を意識する。全ての問題に対して高性能なアルゴリズムは存在しないということ

#### Feature preprocessing and generation
- Features
   - numeric
   - categorical
   - ordinal
   - datetime
   - coodinate

- 前処理と特徴生成のパイプラインはモデルのタイプに依存する


#### Feature preprocessing for numeric feature
- スケーリング
   - スケーリングが必要なモデルとそうでないモデルがある
      - tree base modelはfeatureのスケールによらない
      - non tree based model、kNN, linear model, neural netはスケールによってモデルの精度が変わってしまう
   - [sklearn.preprocessing.MinMaxScaler](https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html)
      - 0 ~ 1 の間にスケーリングする
- 外れ値
   - linear modelは学習に大きく影響してしまう
   - 99%外の外れ値を除去などする(winsorization)
- rank
   - 外れ値対策のため
   - rank([-100, 0, 1e-5]) == ([0 ,1 ,2])
   - scipy.stats.rankdata
   - rankする前に trainとtestをconcatする
- log transform
   - 特にNNに良い
   - 大きな値を平均値に近づけることができるため
- その他
   - 異なるpreprocessingされた特徴量をconcatしたデータフレーム でtrainする
   - 異なるpreprocessingされた特徴量をそれぞれでtrainしたモデルをmixする

#### Feature generation for numeric feature
Feature generationとはデータやタスクに対する理解、知識を使って新しい特徴量を作成すること

- 掛け算や割り算、feature interactionはlinear model以外(Gradient desicion tree)にも効いてくる
   - モデルがロバストになる
   - ツリーの数を減らすことができる
- fractional partを追加
   - 小数点以下のことで、2.49のfractional partは0.49
   - 確かにトイザらスの価格とか .99など人間の心理的なところを考えると頷ける

#### categorical, ordinal feature
- ordinal featureとは titanicでいう Pclass(チケットのクラス)
   - order categorical feature
   - 順序がある特徴量
   - 例：幼稚園、小学校、中学校、高校、大学など


#### label encoding
- カテゴリ値を数値に置き換える
   - ツリーベースのモデルはlabel encodingは使える
   - non tree modelは別の方法でencodeする必要がある
   - S, C Qをlabel encodingする場合
      - alphabetical 2 ,1 3
         - sklearn.preprocessing.LabelEncoder
      - Order of apperance 1, 2, 3
         - Pandas.factorize

#### frequency encoding
- This will preserve some information about value distributiion.

```python
encoding = titanic.groupby('Embarked').size()
encoding = encoding / len(titanic)
titanic['enc'] = titanic.Embarled.map(encoding)
```
[S , C. Q] = [0.5, 0.3, 0.2]

- value frequencyがtarget valueに相関があれば効果的
- もしマルチカテゴリで同じfrequencyのものがあった場合、frequency encodingをしても意味が無い
   - rankdataを使う https://docs.scipy.org/doc/scipy-0.16.0/reference/generated/scipy.stats.rankdata.html
      - どうすればいい？？

```python
>>> from scipy.stats import rankdata
>>> rankdata([0, 2, 3, 2])
array([ 1. ,  2.5,  4. ,  2.5])
>>> rankdata([0, 2, 3, 2], method='min')
array([ 1.,  2.,  4.,  2.])
>>> rankdata([0, 2, 3, 2], method='max')
array([ 1.,  3.,  4.,  3.])
>>> rankdata([0, 2, 3, 2], method='dense')
array([ 1.,  2.,  3.,  2.])
>>> rankdata([0, 2, 3, 2], method='ordinal')
array([ 1.,  2.,  4.,  3.])
```

#### one hot encoding
- categorical featureをカテゴリ数分、列を増やしてバイナリで表現するencoding  
- non tree based modelにきく
- oと1なのでスケール不要

- sklearn.preprocessing.OneHotEncoder
- Note that if you care for a fewer important numeric features, and hundreds of binary features are used by one-hot encoding, it could become difficult for tree-methods they use first ones efficiently.
- categorical featureがたくさんの unique valueを持っている場合、たくさんのカラムを追加することになる
   - この場合に sparce matricesを理解しておく必要がある
      - non zero valueのみをメモリに格納することで、メモリの節約になる
      - sparce matricesはcategorical feature , text dataに使えることが多い
      - XGBoost, LightGBMなどは sparce matricesをそのまま使える

#### date and time
- 周期性
   - week ,month, season, year, second, minute, hour
   - 繰り返しのパターンをつかむのに良い
- time since
   - 独立性のある時間特徴量
      - 1970/1/1 0:00:00からの経過時間
   - 依存性のある時間特徴量
      - 特定の出来事からの経過時間 例：セールからの時間
- difference between dates
   - last_purchase_date - last_call_date = date_diff

datetimeから新しい特徴量を作成したら、numeric featureやcategorical featureを得るが、それらは以前述べた方法で適切な前処理が必要

#### coodinates
ある不動産価格の予測をする場合、

- ある建物までの距離 例：病院まで距離、学校までの距離
- 地価の高いエリアとの距離
- 重要ポイントクラスターの中心地との距離
- エリア周辺のオブジェクトの集計統計
   - 不動産価格の平均
- 決定木を使う場合は、座標を回転させると精度が上がることがある
   - とりあえず45, 22.5°回転させるといい

#### 欠損値
- missing valueには情報が隠れている
- hidden NaNs
   - ヒストグラムを書いて 0 ~ 1の間に値が分散しているのに -1がある場合
- 欠損の埋め方
   - -999や-1など
      - 関係のないカテゴリに置き換える
      - linear model, neural networkには良くない
   - 平均や中央値など
      - linear model, neural networkには良い
   - reconstructする
      - isnullフラグをつける
- テストセットにあって、学習セットにないようなカテゴリがある場合は、frequency encodingを使うなど、どちらでも使える特徴量を追加するのもあり
- 欠損値はkaggleの主催者によって置き換えられていることがあるので、ヒストグラムを使って確認する

#### Feature extraction from text and images
- Bag of words
   - 出てきた単語分、次元を増やして単語カウントをする  
   - Bag of word後は、kNN, linear model, neural net などはpost processingが必要
   - TF(1レコード内の合計が１になるように正規化)  
   - IDF(多くの文書に出てくる単語の影響を小さく、あまり出てこない単語の影響を大きくする)
   - N-grams(N個の連続した単語からなる配列)  

   - text preprocessing
      - Lowercase 
         - 小文字に変換する Veryとveryが別の単語にならないように
      - lemmatizatiin and stemming
         - lemmatizatiinはsawはsaw or see
         - stemmingはsawはs
      - stopwords
         - モデルに不要な単語のリスト

#### Word2vec, CNN
- Word2vec, Glove, FastText
   - 単語を数百次元で表す
   - 文章をベクトル化したい場合、単語ベクトルの平均や合計を用いるか、Doc2vecを用いる
   - 学習に時間がかかるので、pre trainedモデルをインターネットで探すのが良い
      - 例えばwikipediaを学習したものなどがある
   - 学習の前に text preprocessingをやってから
- Doc2vec
   - 単語ではなく、文章をベクトル化したい場合に用いる
- BoWとWord2vecの比較
   - BoW
      - とても大きいベクトルになる
      - ベクトルの各要素が単語として分かる
   - Word2vec
      - 比較的小さいベクトルになる
      - ベクトルの要素はある限られた場合にのみ理解できる
      - 似たような単語が似たようなembeddingsになる

- CNN
   - Word2vecと似たように、CNNは画像から圧縮された表現を得ることができる