39
40

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-07-03

概要

機械学習を主とするデータ分析のタスクにおいて、特徴量エンジニアリング(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

39
40
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
39
40