機械の中の学習日誌

社畜によるIT技術メモです。今日も元気です。

How to Win a Data Science Competition - Week1 - メモ

昨年末くらいから、Courseraの「How to Win a Data Science Competition」をやってます。

Kaggleでどうやって入賞するかがコースの目的ですが、前処理をどうするか、特徴量をどう作るかなど、様々な方法が説明されていて勉強になります。

とはいえ、なかなか難しく、進捗はあまりよくありません。内容が難しいというよりも、ロシアなまりのの英語が最大の障壁になっています。字幕も間違えていることが多く、理解できない部分もちらほらあったりします。(英語力が低いのが問題だとは思いますが。)

とはいえ、非常に実践的で良い内容ですので、是非チャレンジしてみてください。

という訳で、以下に1章をやったときのメモを残しておきます。

目次

Introduction & Recap

Recap of main ML algorithms

線形モデル

  • 特徴

    • スパースな高次元データに特に適している
    • モデルの制限に注意(非線形なデータの分割は難しい)
  • 代表例

    • logistic regression
    • SVM

Tree-Based Methods

  • 特徴

    • 線形依存があるデータの場合、多くの分割が必要となるため、値を補足することが難しくなる。
  • 代表例

    • Decision Trees
    • random forest
    • Gradient Boosted Decision Trees (XGBoost, LightGBM)
  • 参考リンク www.datasciencecentral.comarogozhnikov.github.io

k-NN based Methods

k-NN: k-Nearest Neighbors

  • 参考リンク

www.analyticsvidhya.com

Neural Network

  • 特徴

    • 解釈が困難だが、滑らかな非線形決定境界を生成する。
  • 参考リンク

playground.tensorflow.org

No Free Lunch Theorem.

全ての問題に対して高性能な汎用アルゴリズムは存在しない。

アルゴリズムは、特定の前提条件(データの事前分布など)に依存しているため

  • 参考リンク

ja.wikipedia.org

ibisforest.org

Feature preprocessing and generation with respect to models

Numeric features

特徴量のスケールに依存するモデル/しないモデル

スケールに依存 モデル
しない ・ツリー系
する ・再近傍法
・線形モデル
ニューラルネットワーク

大きい値の特徴量が存在する場合、予測値がその特徴量の値に引きずられててしまうことがある。このため特徴量を同じスケールに変換してやる処理が必要。

スケールが予測値に影響する場合、スケーリングを重要なハイパーパラメータとして扱うことができる。

スケール方法

  • MinMaxScaler
  • StandardScaler

外れ値

以下の手法は、線形モデル、kNN、ニューラルネットワーク系に有用

winsorize

線形モデルの場合、特徴量だけでなく、目的変数に外れ値があった場合も予測値に悪い影響がある。この場合、上限値と下限値でクリッピングをして外れ値を除外する。

財務のデータでこの処理をやることをwinsorizeという

rank

  • 数値間が等間隔になるように並べる。外れ値がある場合、外れ値が他の値に近づくためMinMaxScalerより優れたオプションとなる。
rank([-100, 0-, 1e5]) == [0, 1, 2]
  • ソートした配列のインデックス値を使用する。
rank([1000,1,10]) = [2,0,1]

log/sqrt

ログ変換、平方根、いずれも大きすぎる特徴量の値を平均に近づけることができる。

特徴量生成

  • 事前知識とEDAが重要
  • 加算、乗算、除算、その他の特徴量の相互作用は線形モデルだけでなく役立つ

(例) - 商品価格の小数点以下を新しい特徴量として追加(人の価格に対する認識の違いを表現できる)

Categorical and ordinal features

Label Encoding

  • カテゴリ変数を単純に整数に置き換える。
  • 決定木ベースのモデルで効果的(*)
  • 決定木以外のモデルの場合は、適さない

    (*)カテゴリ変数の特定の水準のみが目的変数に影響がある場合でも、分岐を繰り返すことで遅く値に反映できるため

やりかた

  • アルファベット順

    sklearn.preprocessing.LabelEncoder

    ColumnA
    S
    C
    Q

    ColumnA
    2
    1
    3
  • 出現順序

    Pandas.factorize

    ColumnA
    S
    C
    Q

    ColumnA
    1
    2
    3

frequency encoding

  • 出現頻度or出現回数でカテゴリ変数を変換する
  • 値の分布に関する情報が保持されるので、線形モデル、決定木モデルで有用
  • 値の頻度が目的変数に相関している場合、有用
  • 変数の分割数を減らすのに役立つ
  • 同じ頻度で複数の変数があった場合は、区別できないので注意
encoding = titanic.groupby('Embarked').size()
encoding = encoding/len(titanic)
titanic['enc'] = titanic.Embarked.map(encoding)

# 同じ頻度の変数があった場合、以下でランク付けするのも可
from scipy.stats import rankdata

One-hot encoding

  • 一意の値ごとに新しい列を作り、1を立てる。それ以外は全て0
  • 線形モデル、kNN、ニューラルネットワーク系で機能する
  • 0 or 1のため既にスケーリングされている
  • 重要な数値特徴量がなく、One-hotで多くの特徴量が出来てしまう場合は、ツリー系のモデルはうまくいかない可能性が高い。

スパース行列

  • カテゴリ変数に一意の値が大きい場合にOne-Hotを行うと、数値がほとんど0の列がたくさん生成される。これらの配列を効率的に保存するにはスパース行列を利用する。
  • スパース行列を使うことで、メモリを節約することができる。
  • カテゴリ変数、テキストデータを処理するのに役立つ。
  • XGBoost、LightGBM、sklearnなどは、スパース行列を直接処理できる。

(参考)

docs.scipy.org

note.nkmk.me

Feature interactions

  • ターゲットがカテゴリ特徴量Aとカテゴリ特徴量Bの両方に依存している場合、これらの2つの特徴量のあらゆる組み合わせを作成し、One-hot encodingを行う。
  • 特徴量間の相互作用を考慮することができるので、非ツリーベースモデルに有用。

Datetime and coordinates

Datetime

  • Time moments
    • 秒、分、時間、週の日、月、年
    • 休日フラグ
  • 経過時間
    • 特定の日にちからの経過日数
    • 特定イベントからの経過日数
  • 時間差
    • 休日までの日数
    • アクション間の日数(顧客購入日~顧客へ電話した日の差など)

Coordinates(座標)

  • 重要ポイントまでの距離
    • 病院、学校、最寄り店舗までの距離など
  • クラスター中心までの距離
    • 重要ポイントがない場合は、特定の地点(地価予測の場合は、地価の高い場所)を中心として、その中心までの距離を出す
    • 非常に古い建物があるなど、特別な地点を中心として、中心までの距離を出す
  • 集計値を計算
    • ポイント周辺の平均地価などの統計値を算出する

座標の回転

価格の高い土地と、低い土地を斜めに走る通りで区切られていた場合を考える。

この場合、ツリー系のモデルだと、斜めに切れないため、ジグザグな形で切ることになる。しかし、座標を回転することで、まっすぐな線で切ることが出来るようになる。

Missing Values

  • 状況により欠損値を埋める方法を選択する
    • 可視化することで、既に欠損値が別の値で埋められたかどうか判断できる事がある。
  • 一般的な方法:-999など範囲外の値で穴埋めする
    • ツリー系モデル:欠損値を別カテゴリとして扱えるため有益
    • 線形モデル、NN:パフォーマンスが下がる可能性がある。
  • 一般的な方法:中央値、平均値などで穴埋めする
    • 線形モデル、NNに有益
    • ツリー系の場合、欠損値と判断することが難しくなる⇒ NULLの場合に、isnull特徴量を追加
  • 欠損値の再構築
    • 時系列データなどで、欠損値がある場合は、前後のデータから概算した数字を補完する
  • 特徴量生成の前に欠損値の穴埋めは避ける
    • 例えば-999で穴埋めし、各カテゴリの平均値の特徴量を生成する場合、-999の値に引っ張られてしまう場合がある。
  • XGBoostは欠損値を扱える
  • 外れ値を欠損値として扱う
  • TestデータにありTrainデータには存在しないカテゴリを扱う場合
    • Trainデータ、Tesetデータ両方のデータを使用したfrequency encodingを試してみる。

参考Links

Feature extraction from text and images

Text

  • Bog of words
  • Embeddings(~word2vec)

Bag of words

  • 各単語の出現回数をカウント
sklearn.feature_extraction.text.CountVectorizer
  • TFiDF
    • TF: 単語の出現頻度
    • iDF: 逆文書頻度. レアな単語の数値を高く
# Term frequency
tf = 1 / x.sum(axis=1)[:,None]
x = x * tf

# Inverse Document frequency
idf = np.log(x.shape[0]/(x>0).sum(0))
x = x * idf

sklearnを使用

sklearn.feature_extraction.text.TfidfVectorizer

gihyo.jp

Text preprocessing

  • Lowercase
    • 単語を小文字に揃える。
  • Lemmatization
    • 見出し語化
    • 例)
      • was → be
      • eating → eat
      • had → have
  • Stemming
    • 語尾変化した語の語幹を揃える。
    • 例)
      • cats → cat
      • trouble → troubl
      • troubled → troubl
  • Stopwords
    • 冠詞や前置詞のように重要な情報を含まない単語を除外

word2vec

  • 単語の特徴ベクトル。
  • BoWと比べ比較的ベクトルは小さい
  • 似た意味の単語は似たベクトルを持つ
  • 事前トレーニングモデル

Image

  • ネットワークで画像処理をする際、途中のレイヤーから特徴量を抽出できる
  • 事前学習済みモデルを使用してもよい
  • 事前学習済みモデルにfine-tuningを実施することで精度を高めることができる
  • データ拡張(data augmentation)により精度を高めることができる
    • グルーピング、回転、ノイズ etc..