特徴量エンジニアリング(feature engineering)は、私がデータ分析を始めた20数年前から非常に重要なものでした。
特徴量(feature)とは、数理モデルの説明変数Xを指します。
ドメイン(データ活用の現場)理解とデータ理解なくしては、特徴量エンジニアリング(feature engineering)は非常に難しいものです。
データ理解のためのデータ分析の技術がEDA(探索的データ分析)です。
では、何のために特徴量エンジニアリング(feature engineering)を実施するのでしょうか?
ざっくり言うと、以下の2つです。
- 適切なデータセットを作る
- 数理モデルのパフォーマンスを上げる
構築する数理モデルが予測モデルであれば、それは予測精度を上げるということです。構築するモデルが構造理解(要因分析など)のためのものであれば、それは起こった現象の再現性が高い(納得性がある)ということです。
今回は、「3タイプの特徴量エンジニアリング(feature engineering)基礎テクニック」というお話しをします。
RやPythonなどのツールを使ったデモ的なものはございません。また文字ばかりで眠くなるかもしれません。
Contents
- 3つの特徴量エンジニアリング(feature engineering)
- 特徴編集(Feature Editing)
- 特徴抽出(Feature Extraction)
- 分割(Split)
- エンコーディング(Encoding)
- One Hot Encoding/Vectorization
- Index Based Encoding
- 順序付きOne Hot Encoding
- 欠測値補完(Imputation)
- 異常検知の方法
- 視覚化して探す
- 異常検知の手法を使う
- 欠測値補完の方法
- 簡単な方法
- 多重補完法(multiple imputation)
- 特徴選択(Feature Selection)
- Filter Method
- 説明変数X(特徴量)の各統計量に基づいて選択する方法
- 目的変数yと説明変数X(特徴量)の関係性を表す統計量に基づいて選択する方法
- 説明変数X(特徴量)間の関係性を表す統計量に基づいて選択する方法
- Wrapper Method
- Embedded Method
- 今回のまとめ
3つの特徴量エンジニアリング(feature engineering)
特徴量エンジニアリング(feature engineering)は、ざっくり3タイプあります。
- 特徴編集(Feature Editing)
- 特徴抽出(Feature Extraction)
- 特徴選択(Feature Selection)
特徴抽出(Feature Extraction)で特徴量を増やし、特徴選択(Feature Selection)で減らします。
特徴編集(Feature Editing)は、簡単に言うと変数変換や特徴量をまとめたりすることです。
特徴編集(Feature Editing)
説明の簡単な、特徴編集(Feature Editing)からお話しします。
よくある特徴編集(Feature Editing)はスケーリングです。例えば、以下です。
- 標準化(Standardization)
- 正規化(Normalization)
- 対数変換(Log Transform)
他にも、色々な変換が考えられることでしょう。
さらに、特徴量同士を足したり引いたり四則演算したりし新たな特徴量を作ったり、意味のある特徴量でグルーピングし新たな特徴量を作ったりします。
特徴編集(Feature Editing)を実施するとき、元の変数を残すかどうかという問題が起こります。残せば、どんどん特徴量が増えます。
特徴抽出(Feature Extraction)
比較的よく使う3つの特徴抽出(Feature Extraction)を紹介します。
- 分割(Split)
- エンコーディング(Encoding)
- 欠測値補完(Imputation)
分割(Split)
1つの特徴量(変数)をもとに、複数の特徴量(変数)を作ります。
分かりやすい例ですと、「年月日(yyyymmdd)」を「年(yyyy)」「月(mm)」「日(dd)」に分割する、といったものです。ダイレクトにもとの特徴量をある区切りで分割しています。
よくあるやり方は、元の特徴量をカテゴリー化(例:ビン分割など)し、このあと説明するエンコーディング(Encoding)で複数の特徴量にするやり方です。
例えば、元の特徴量「商品名」に対し「大カテゴリー」「中カテゴリー」「小カテゴリー」などの情報を特徴量として新たに追加するという感じです。
最初に例としてあげた「年月日(yyyymmdd)」も、「年(yyyy)」によるグループ化、「月(mm)」によるグループ化、「日(dd)」によるグループ化、といった感じでグループ化という考え方でも説明できます。
元の特徴量が数値のときは、カテゴリー化するときに適当な境界で区切りビン分割(binning)し、このあと説明するエンコーディング(Encoding)で複数の特徴量に分割することがあります。
ビン分割(binning)とは、データを何かしらの基準に沿って分割することで、数値データのときに作成するヒストグラムの階級(ヨコ軸)をイメージして頂くと分かりやすいと思います。
「大カテゴリー」「中カテゴリー」「小カテゴリー」の例もある種の、ビン分割になります。個々の商品を大カテゴリーという粒度によるビン分割、中カテゴリーという粒度によるビン分割、小カテゴリーという粒度によるビン分割し、それぞれのビン分割で新たな特徴量を作るという感じです。
エンコーディング(Encoding)
主にカテゴリカルな特徴量に対し実施します。カテゴリカルな特徴量とは、「1:受注、2:失注」や「1:ヘビー顧客、2:ミドル顧客、3:ライト顧客」みたいなデータです。
比較的よく使う3つのエンコーディング(Encoding)です。
- One Hot Encoding/Vectorization
- Index Based Encoding
- 順序付きOne Hot Encoding
One Hot Encoding/Vectorization
One Hot Encodingは、カテゴリカルな特徴量をダミーコード化(0-1データ)することです。
例えば、「1:ヘビー顧客、2:ミドル顧客、3:ライト顧客」の3カテゴリーの場合、3つの0-1変数(特徴量)が作られ、該当する場合に1を、そうでない場合に0が入ります。
1つの特徴量が複数の特徴量になりベクトル化するのでVectorizationとも言います。
Index Based Encoding
Index Based Encodingは、例えばテキストデータ(文章)に対し形態素解析し単語を抽出し、その単語に該当する数字(Index)を割り振ることで数字の列を作ることです。
他にも、顧客の購買した商品の順序を表現したり(例:商品A(id:982)→商品C(id:519)→商品B(id:167)などを982519167と表現)する感じです。
順序付きOne Hot Encoding
Index Based Encodingした特徴量よりもOne Hot Encoding/Vectors encodingを実施した特徴量の方が、データとしては扱いやすいですが、順序性(時間の概念や前後関係などを導入)が消えてしまいます。
順序付きOne Hot Encodingというのがあります。
通常のOne Hot Encodingには順序性はありませんが、それに順序性(時間の概念や前後関係などを導入)したものです。
順序付きOne Hot Encodingを実施すると、膨大な0-1で表現された特徴量が出来上がります。
欠測値補完(Imputation)
手に入れたデータセットの中の一部が欠測していたり、明らかに可笑しなデータ(異常値など)が混入していることがあります。
欠測の発生具合や異常値の混入具合が酷い場合にはどうしようもありませんが、少数であるならば何かしらのデータで埋めたいところです。
異常検知の方法
先ず、可笑しなデータ(異常値など)の見つけ方を説明します。
2つの方法があります。
- 視覚化して探す
- 異常検知の手法を使う
視覚化して探す
基本は視覚化し探すことです。
視覚化し探すとは、データをグラフで表現し明らかに他のデータから外れているデータを探すことです。
異常検知の手法を使う
もう一つの方法が、異常検知の手法を使うやり方です。
目で見て探す視覚化よりも高速に探すことができますが、ざっくりしていますので、異常検知されたデータは必ずグラフ化して目で確認しましょう。
伝統時には、標準偏差や分散を活用したもの、パーセンタイルを活用したものがあります。ここでは多くは話しませんが、異常検知で調べてもらうと、色々な手法が紹介されていると思います。
ちなみに、QC7道具の管理図は、視覚的かつ統計学的に異常値を探るものです。
欠測値補完の方法
次に、欠測値補完の方法です。
2つの方法があります。
- 数値データに対する欠測値補完
- カテゴリカルデータに対する欠測値補完
要するに、欠測しているデータが数値なのかカテゴリカルなのかで、やり方が変わります。
簡単な方法
一番簡単なのは、数値データであれば平均値を代入する方法、カテゴリカルデータであれば最頻値を代入する方法などでしょう。
欠測していないデータで分布を求め、その分布に従う乱数を発生させることで、ランダムな値を代入する方法も非常に簡単です。
他には、欠測値している特徴量を目的変数yにした予測モデルやマッチングモデルを構築し、欠測している値を予測するというものです。
多重補完法(multiple imputation)
なんとなくてすが…… 機械学習のスタンスの場合には、ある特定の値を1つ代入する単一値代入法(single imputation)を使うことが多い気がします。
一方、数理統計学的なスタンスのときは、多重補完法(multiple imputation)を使うことが多いです。
多重補完法(multiple imputation)とは、複数の欠測値を補完したデータセットを構築し、それぞれのデータセットを使いデータ分析などをします。
要するに、単一値代入法(single imputation)であれば1回で済む処理を複数回実施するため、全体の処理時間が膨大になります。
例えば、1つのデータセットに対し1時間かかる処理(単一値代入法)を、多重補完法(multiple imputation)だということで100個のデータセットを作り処理を実施すると、100時間ぐらいかかるかもしれません。
この世界のデータ分析も奥が深すぎるため、ここではこれ以上のお話しはしません。分かりやすい専門書(入門的な書籍も含め)ありますので、興味ある方は調べて見てください。
特徴選択(Feature Selection)
特徴選択(Feature Selection)つまり変数選択ですが、昔から色々な方法が考案されています。
この世界も色々とありすぎるため、概要のみお話しします。別の機会で、RやPyhtonなどを使い説明します。
代表的なのは、以下の3つでしょう。それぞれで、色々な手法があります。
- Filter Method
- Wrapper Method
- Embedded Method
Filter Method
Filter Methodは、最も簡単な特徴量選択方法で、主に3種類あります。
- 説明変数X(特徴量)の各統計量に基づいて選択する方法
- 目的変数yと説明変数X(特徴量)の関係性を表す統計量に基づいて選択する方法
- 説明変数X(特徴量)間の関係性を表す統計量に基づいて選択する方法
説明変数X(特徴量)の各統計量に基づいて選択する方法
バラつきが異常に小さい(分散が0など)変数を除外したり、欠測値や異常値の占める割合が異常に多い変数を除外することです。
例えば、分散が0というのは、その変数の値がすべて同じ値ということです。
例えば、欠測値や異常値の占める割合が多い場合、欠測値補完して変数を使える状態にしたとしても、どのような欠測値補完したかによってこれから実施するデータ分析やモデル構築が影響を受けるため、好ましくありません。
目的変数yと説明変数X(特徴量)の関係性を表す統計量に基づいて選択する方法
例えば、目的変数yと各説明変数X(特徴量)で1対1で相関係数を計算し、相関係数が異常に小さい説明変数X(特徴量)を除外するということです。
このとき、相関係数が1や-1などに異常に近い場合、疑った方がいいです。目的変数yとその説明変数X(特徴量)が実はほぼ同じ意味合いのものを別の表現でデータにしただけ、ということが起こっている可能性があります。
他にも、分散分析やカイ二乗検定を実施したりと簡単な統計学的なやり方があります。
説明変数X(特徴量)間の関係性を表す統計量に基づいて選択する方法
例えば、各説明変数X(特徴量)間で1対1で相関係数を計算し、相関係数の高い変数の組み合わせを見つけて、一方を除外するということです。
他にも、VIF(Variance Inflation Factor)を求めたり主成分分析を実施したりと簡単な統計学的なやり方があります。
以上の3つのFilter Methodは、データ分析やモデル構築前に必ず最初に実施すると思います。
Wrapper Method
Filter Methodは各説明変数X(特徴量)を1つ1つ見て検討していく感じでしたが、Wrapper Methodでは説明変数X(特徴量)の組み合わせを見ていきます。
要は、Wrapper Methodは最適な説明変数X(特徴量)の組み合わせを探そうとするものです。
やり方は簡単で、次にような流れになります。
- 説明変数X(特徴量)の組み合わせ決める
- 数理モデルを構築する
- 構築した数理モデルを評価する
最も評価の高い説明変数X(特徴量)の組み合わせを、最終的な説明変数X(特徴量)として採用します。
ちなみに、数理モデルのアルゴリズム(線形回帰なのか、ランダムフォレストなのか、ニューラルネットワークなのか、など)で、最も評価の高い説明変数X(特徴量)の組み合わせは変わってきます。
探し方も色々あります。例えば、次の5つです。
- Exhaustive Feature Search
- Forward Regression
- Backward Regression
- Stepwise Regression
- Bi-directional elimination
Exhaustive Feature Searchとは、すべての説明変数X(特徴量)の組み合わせを試す方法です。特徴量の数が多い場合には非現実的です。
Forward Regressionとは、特徴量を1つずつ追加していく手法です。一方、Backward Regressionとは、特徴量を1つずつ削除していく方法です。
そして、Stepwise RegressionとBi-directional eliminationは、Forward RegressionとBackward Regressionを組み合わせたかのような手法です。
Embedded Method
Embedded Methodとは、モデルベース特徴量選択とも呼ばれ、機械学習っぽい感じのするものです。
ざっくりした流れは、以下です。
- 数理モデルを構築する
- 特徴量の重要度を算出する
- 重要でない特徴量を削除する
特徴量の重要度とは……
- 線形回帰系のモデル:係数(regression coefficient)
- 決定木系のモデル:重要度(feature importance)
Lasso回帰(L1 Regularization)やElastic Net回帰などの正則化回帰モデルの場合、数理モデルを構築した段階で変数選択された状態で出力されます(不必要な特徴量の回帰係数が0)。
通常の変数線選択というか特徴量選択は、この3つの手法をすべて使うことが多いと思います。
今回のまとめ
今回は、「3タイプの特徴量エンジニアリング(feature engineering)基礎テクニック」というお話しをしました。
特徴量エンジニアリング(feature engineering)は、私がデータ分析を始めた20数年前から非常に重要なものでした。
特徴量(feature)とは、数理モデルの説明変数Xを指します。
ドメイン(データ活用の現場)理解とデータ理解なくしては、特徴量エンジニアリング(feature engineering)は非常に難しいものです。
データ理解のためのデータ分析の技術がEDA(探索的データ分析)です。
では、何のために特徴量エンジニアリング(feature engineering)を実施するのでしょうか?
ざっくり言うと、以下の2つです。
- 適切なデータセットを作る
- 数理モデルのパフォーマンスを上げる
構築する数理モデルが予測モデルであれば、それは予測精度を上げるということです。構築するモデルが構造理解(要因分析など)のためのものであれば、それは起こった現象の再現性が高い(納得性がある)ということです。
幾つかのテクニックのキーワードを紹介しました。RやPythonなどのツールを使って実施するとき、この今回上げたテクニックのキーワードを参考に実施してみるのもいいでしょう。
とは言え、実際に手を動かしながら体感しないと分からない部分もありますので、別の機会にRやPyhtonなどを使い説明します。