特徴量エンジニアリングおさらいメモ

# 概要
機械学習を主とするデータ分析のタスクにおいて、特徴量エンジニアリング(Feature Engineering)は、モデルの性能を決定づける大変重要な工程である。
よく使われるであろう特徴量エンジニアリングの種類について（＆自分で参照するためのチートシートも兼ねて）、本エントリーにまとめることにした。

# メイン参考教材：Feature Engineering のスライドショー

　以下の良い資料を見つけたので、こちらの内容に基づいて（翻訳＆サマリ）、特徴量エンジニアリングについてメモを記してゆく。
  https://www.slideshare.net/HJvanVeen/feature-engineering-72376750
  
  
# カテゴリ型特徴量へのEngineering

  - カテゴリ数が多すぎると、データが疎らになりかねない。
  - 何かしらの加工が常に必要である。
  
## One-Hot-Encoding：
  - 線形アルゴリズムでは定番である。
  - ただし、未知の値の扱いはイマイチとなる。
  
  
##  Hash-Encoding：
  - 固定長の One-Hot-Encoding
  - 未知の値への対処に優れる。
  - embeddingのようなものか？
  
##  Label Encoding：
  - 全てのカテゴリ値に、ユニークな数値ＩＤを割り当てる。
  - 非線形モデルやツリー型モデルと相性が良い！
  - 次元数（＝特徴量数）が増えない
  
##  Count Encoding：
  - カテゴリ変数を、トレーニングデータセット中に登場する頻度で置き換える！
  - 線形モデルも非線形モデルの両方と相性が良い！
  - 未知のデータに対して過敏に反応する
  - 未知の値は 1 で置き換える
  - 値の衝突が置きかねない
    出現頻度が同じカテゴリが混在した場合など
    
  
##  Label Count Encoding：
  - カテゴリ変数を、トレーニングデータセット中の出現頻度の順位で置き換える
  - 線形モデルにも、非線形モデルにも使える
  - 未知のデータに対して、過剰反応しない
  - 異なるカテゴリ値に対して、同じ値をとることはない(->順位なので)
  
  
##  Target Encoding：
  - カテゴリ変数を、それらのターゲット比率(二値分類、回帰など）に変換する
    目的変数が 1/0 の場合に使えそうだ
    
  - 過剰適合に要注意！
  - 交差検証すること
  - 0 にならないようにスムージング処理を定義実施すべし
  - 過剰適合に対処するため、ランダムなノイズ値を加える手がある
  
  
##  Category Embedding：
  - ニューラルネットワークを使い、カテゴリ変数を固定長のEmbedding ベクトルに変換する。
  - one hot encoding より優秀
  - 参考 http://arxiv.org/abs/1604.06737
  
  
##  Nan Encoding：
  - 値を無視する代わりに、Nanを与える
    値がNanであることを示すフラグ変数を用意する
    
  
##  Polynominal Encoding：
  - カテゴリ変数間の相互作用を数値で表して使う
  - ＸＯＲの関係にあるカテゴリ変数を処理できる
  - 場合分けをカラムで用意する
    二つの変数の組み合わせを one-hot-encoding で表現したようなもの
    カラム数が結構増えるので注意
  
  
##  Expansion Encoding：
  - 単一変数から複数の値を取り出す
  - 例：ユーザーエージェント文字列から、
    ・モバイルかどうか、
    ・バージョンは
    ・ＯＳの種類は
    ・ブラウザのバージョンは
    といった複数の情報を取り出す。
  - 日時からも、年、月、日、曜日、時間などの値を取り出せる。
  
  
##  Consolidation Encoding：
  - 同じ値に対して、異なるカテゴリ値を割り当てる！
  - 表記ゆれの統一、名寄せ処理のようなもの
  - BP,British Petr,B&P --> BP など
  
  
  
# 数値型変数に対するEngineering
  
##  Rounding：
  - 数値を丸め込む
  - 小数点以下を切り捨てる、１０で割った商を採用するなど
  
  
##  Binning：
  - 度数に分けて、その階級番号で表す
  - 数値の範囲を３つにわけ、値がその範囲のうちのどれに属しているのか 1/0 で表現する
  
  
##  Scaling：
  - 数値に変換処理を加える
  - 正規分布のzスコアに変換する
  - 最大-最初で標準化する
  - 対数をとる
  
  
##  Imputation：
  - 欠落したデータを無視する
  
  
##  Interaction：
  - 数値変数間の相互作用を数値化して使う
  - 演算処理をする
  - 特徴量選別(統計的、Importanceなどを使う）をしておこう
  - 人間の直感は無視？ おかしな変換が時には素晴らしい改善をもたらす
    --> 先入観のことではないか？
  
  
  
# 線形アルゴリズムに使う、非線形encoding
  - 非線形処理を使い、線形モデルの性能を改善しよう
  - Polynominal kernel
  - カーネル関数か
  - Leafcoding(ランダムフォレスト embedding！）
  - 遺伝的アルゴリズム
  - 局所的線形アルゴリズム、t-SNE,
  
# 行の統計
  - データ行の統計を取るべし
  - NaN の数
  - 0 の数
  - 負の値の数
  - 最大、最小、平均、などの統計量
  
  
# 一次変数
  
  - 大きな改善をもたらす可能性がある
  - 日付のような一次変数は、検証の仕組みを必要とする
  
  
# Projecting to a circle
  - 曜日のように、一つの特徴量を循環型の値に置き換える
    --> 割ったときの余りなど
  - Datetime から、曜日、月、日を取り出す
  

# TrendLine
  - 時系列分析、移動平均など、
  - 同じ消費額の顧客でも、その経緯は異なる。
    まとめてドカっと消費するのか、じわじわ消費するのか、など
  
  
# 大きなイベントからの距離
  - ハードコード処理になる。
    休日の何日前か、など
  - 公的な祝日や、月初の祝日など、いろいろな起点がある
  - 消費パターンを予測する際に、役立つ
  
  
# 空間的値
  - 位置情報：緯度経度、住所など
  
  
# 位置をカテゴリ化する
  - クラスタリング
  - 緯度経度
  - 都市名を緯度経度で表す
  
  
# ハブからの距離
  - 主要なハブからの位置的距離


# リンク集
  
  Discover Feature Engineering, How to Engineer Features and How to Get Good at It
  https://machinelearningmastery.com/discover-feature-engineering-how-to-engineer-features-and-how-to-get-good-at-it/
  
  Feature Engineering: Data scientist's Secret Sauce !
  https://www.linkedin.com/pulse/feature-engineering-data-scientists-secret-sauce-ashish-kumar?trk=prof-post
  
  カテゴリカル変数のEncoding手法のまとめ
  http://jotkn.ciao.jp/wp/2017/08/22/post-67/
  
  KaggleのWinner solutionにもなった「K近傍を用いた特徴量抽出」のPython実装 - u++の備忘録
  https://upura.hatenablog.com/entry/2018/06/23/165855
  https://github.com/upura/knnFeat
  
  Feature Engineering のリンク集
  https://qiita.com/squash/items/667f8cda16c76448b0f4
  
  Introduction to Manual Feature Engineering | Kaggle
  https://www.kaggle.com/willkoehrsen/introduction-to-manual-feature-engineering