概要
機械学習を主とするデータ分析のタスクにおいて、特徴量エンジニアリング(Feature Engineering)は、モデルの性能を決定づける大変重要な工程である。
よく使われるであろう特徴量エンジニアリングの種類について(&自分で参照するためのチートシートも兼ねて)、本エントリーにまとめることにした。
メイン参考教材:Feature Engineering のスライドショー
以下の良い資料を見つけたので、こちらの内容に基づいて(翻訳&サマリ)、特徴量エンジニアリングについてメモを記してゆく。
https://www.slideshare.net/HJvanVeen/feature-engineering-72376750
カテゴリ型特徴量へのEngineering
- カテゴリ数が多すぎると、データが疎らになりかねない。
- 何かしらの加工が常に必要である。
One-Hot-Encoding:
- 線形アルゴリズムでは定番である。
- ただし、未知の値の扱いはイマイチとなる。
Hash-Encoding:
- 固定長の One-Hot-Encoding
- 未知の値への対処に優れる。
- embeddingのようなものか?
Label Encoding:
- 全てのカテゴリ値に、ユニークな数値IDを割り当てる。
- 非線形モデルやツリー型モデルと相性が良い!
- 次元数(=特徴量数)が増えない
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:
- カテゴリ変数間の相互作用を数値で表して使う
- XORの関係にあるカテゴリ変数を処理できる
- 場合分けをカラムで用意する
二つの変数の組み合わせを one-hot-encoding で表現したようなもの
カラム数が結構増えるので注意
Expansion Encoding:
- 単一変数から複数の値を取り出す
- 例:ユーザーエージェント文字列から、
・モバイルかどうか、
・バージョンは
・OSの種類は
・ブラウザのバージョンは
といった複数の情報を取り出す。 - 日時からも、年、月、日、曜日、時間などの値を取り出せる。
Consolidation Encoding:
- 同じ値に対して、異なるカテゴリ値を割り当てる!
- 表記ゆれの統一、名寄せ処理のようなもの
- BP,British Petr,B&P --> BP など
数値型変数に対するEngineering
Rounding:
- 数値を丸め込む
- 小数点以下を切り捨てる、10で割った商を採用するなど
Binning:
- 度数に分けて、その階級番号で表す
- 数値の範囲を3つにわけ、値がその範囲のうちのどれに属しているのか 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