機械学習の基礎 ②：特徴量エンジニアリング

こんにちは、[アルファアーキテクト](https://alpha-architect.co.jp/recruit/)でVPoEをやっております胡 恩召（Ethan Hu）です。

先日書いた記事「[機械学習の基礎 ①：モデル評価指標](https://qiita.com/AA_office/items/e57738018ab4f35b610f)」の続き、機械学習の前段階の「特徴量エンジニアリング」をご紹介いたします。


# 特徴抽出

機械学習のモデルは、直接生データから学習出来ず、生データからいろいろな前処理をして、モデルが学習出来、フォーマットを変換した後データは、特徴データです。

仮で下記のデータがあります。これからデータの処理方法をご紹介します。

|  ID  | 性別  | 出身地 |  年齢  | 身長(cm) |  体重(kg) | 
| :----: | :----: | :----: | :----:  |:----: |:----: |
|  1   |  男性  | 東京都 |  25  | 165  | 55  |
|  2   |  女性   | 神奈川県|  29  | 173  | 60  |
|  3   |  女性   | 千葉県 |  31  | 158  | 49  |
|  4   |  男性   | 大阪府 |  48  | 181  | 73  |
|  5   |  不明   | 埼玉県 |  18  | 177  | 67  |
|  ...   |  ...   | ... |  ...  | ...  | ...  |


## 数値データ処理

上記のデータの中で、数値特徴は、年齢と身長と体重です。

### 区切り

年齢の処理は、5歳刻みまた10歳刻みで区切り出来ます。
10歳刻み場合、処理後「年齢」データが下記です。

|  ID  |  年齢(元)  |  年齢(~20) |  年齢(21~30)  | 年齢(31~40)|  年齢(41~50) | 年齢(51~60) |  年齢(60~) |
| :----: | :----: | :----: | :----:  |:----: |:----: |  :----:  |   :----:  | 
|  1   |  25   | 0 | 1  | 0  | 0  | 0  | 0  |
|  2   |  29  | 0 | 1  | 0  | 0  | 0  | 0  |
|  3   |  31   |  0 | 0  | 1  | 0  | 0  | 0  |
|  4   |  48   |  0 | 0  | 0  | 1  | 0  | 0  |
|  5   |  18  |  1 | 0  | 0  | 0  | 0  | 0  |
|  ...   |  ...   | ... |  ...  | ...  | ...  | ...  | ...  |

### 変換

身長と体重の処理は、変換して出来ます。変更方法は、主に下記の3種類があります。

* Mean Normalization

```math
x^{new} = \frac{x - mean(x)}{max(x) - min(x)}
```

* Min-Max Normalization

```math
x^{new} = \frac{x - min(x)}{max(x) - min(x)}
```

* Standardization / Z-Score Normalization

標準化処理

```math
x^{new} = \frac{x - mean(x)}{σ(x)}
```

標準差計算式：

```math
σ(x) = \frac{1}{N} \cdot \sum_{i=1}^{N}(x_i - mean(x))^2
```

## カテゴリーデータ処理

### Label encoding

カテゴリーのテキスト値を数字に変換する。出身地の処理は、使えます。

| 出身地(都道府県名)   | Label 数字  |  
| :----: | :----: | 
| 北海道   |  1  |
|  ...   |  ...   |
|  埼玉県  |  11   |
|  千葉県   |  12   |
| 東京都 | 13 |
|  ...   |  ...   |
|  沖縄県   |  47   |

Label化した

|  ID  | 出身地(元) | 出身地(数字) |
| :----: | :----: | :----: |
|  1   | 東京都 |  13  | 
|  2   |  神奈川県| 14  | 
|  3   |  千葉県 |  12  | 
|  4   |  大阪府 |  27 | 
|  5   |  埼玉県 | 11   | 
|  ...   |  ...   | ... | 


### One-hot encoding

性別と出身地の処理は、One-hot encodingで出来ます。

|  ID  | 性別(元)  | 性別(男性) |  性別(女性)  | 性別(不明)  |  
| :----: | :----: | :----: | :----:  |:----: |
|  1   |  男性  | 1 |  0  | 0  | 
|  2   |  女性   | 0 |  1  | 0  | 
|  3   |  女性   | 0 |  1  | 0  | 
|  4   |  男性   | 1 |  0  | 0  | 
|  5   |  不明   | 0 |  0  | 1  | 
|  ...   |  ...   | ... |  ...  | ...  |

### Hash encoding

Hash化処理は、One-hot encodingと似ています。One-hot encodingとの違いは、One-hot encodingは、種類が多すぎな特徴（ドメイン、国など）の場合、処理後の列数（特徴数）も多すぎてしまい、超スパースデータセットになります。Hash化処理をすれば、処理後の列数（特徴数）が減ります。


# 特徴選択

特徴量エンジニアリング（Feature Engineering）は、機械学習のモデルにおいて重要な工程です。良い特徴量を見つけられれば、同じモデルでも効果が違います。これからよく使う特徴選択手法をご紹介します。

## Pearson相関係数

Pearson相関係数は、変数 $X$ と $Y$ の線形相関関係を計算出来ます。

Pearson相関係数の計算式：

```math
ρ_{X,Y} = \frac{con(X,Y)}{σ_X \cdot σ_Y} = \frac{E[(X - μ_X)(Y - μ_Y)]}{σ_X \cdot σ_Y}
```


サンプルのPearson相関係数の計算式：

```math
r = \frac{\sum_{i=1}^{n}(X_i - \overline{\text{X}})(Y_i - \overline{\text{Y}})}{\sqrt(\sum_{i=1}^{n}(X_i - \overline{\text{X}})^2) \cdot \sqrt(\sum_{i=1}^{n}(Y_i - \overline{\text{Y}})^2)}
```


## Pearsonカイ二乗検定

カイ二乗統計量が大きいほど変数間の相関関係が高いです。
カイ二乗統計量の計算式：

```math
χ^2 = \sum_{i=1}^{r}\sum_{j=1}^{c} \frac{(Q_{i,j} - E_{i,j})^2}{E_{i,j}^2} = N \cdot \sum_{i,j}p_ip_j(\frac{(Q_{i,j}/N) - p_ip_j}{p_ip_j})^2
```

$N$：合計サンプル数
$Q_i$：類別$i$のサンプル数


## Fisherスコア

分類のタスクで、良い特徴は、同じ類別の値の差が少なくて、異なる類別の値の差が大きいです。その評価手法は、Fisherスコアで出来ます。Fisherスコアが大きいほど変数間の相関関係が高いです。

Fisherスコアの計算式：

```math
S_i = \frac{\sum_{j=1}^{K} n_j(μ_{ij} - μ_i)^2}{\sum_{j=1}^{K} n_jρ_{ij}^2}
```

$μ_i$：特徴$i$の平均値

$n_j$：類別$j$のサンプル数

$μ_{ij}$：類別$j$の中で、特徴$i$の平均値

$ρ_{ij}$：類別$j$の中で、特徴$i$の分散（variance）


## Kullback–Leibler情報量

Kullback–Leibler情報量は、確率論と情報理論における2つの確率分布の差異を計る尺度である。Kullback–Leibler情報量が大きいほど変数間の相関関係が高いです。

Kullback–Leibler情報量の計算式：

```math
I(X, Y) = \sum_{y \in Y}^{}\sum_{x \in X}^{} p(x,y) \cdot log(\frac{p(x,y)}{p(x)\cdotp(y)}) = D_{KL}(p(x,y)||p(x)\cdotp(y))
```

# まとめ

特徴量エンジニアリング作業は、とても重要な作業です。質が高い学習データを作れば、より良いモデルを構築出来ます。

アルファアーキテクトは現在IPOを目指しています。『VeleT』の発展を加速させるため、 現在[インフラエンジニア](https://alpha-architect.co.jp/935/)、[バックエンドエンジニア](https://alpha-architect.co.jp/939/)、[テックリード](https://alpha-architect.co.jp/384/)などを積極的に募集しています。動画広告サービス『VeleT』の開発を一緒に推進してくれる方、是非応募をお待ちしています！


# 参照

* [Feature Variables](https://www.datarobot.com/wiki/feature/)
* [特徴量エンジニアリング](https://www.datarobot.com/jp/wiki/feature-engineering/)
* [美団機械学習実践](https://book.douban.com/subject/30243136/)
* [美団技術チームブログ](https://tech.meituan.com/)
* [機械学習に欠かせない、特徴量とその選択手法とは](https://ainow.ai/2020/07/14/225092/)
* [特徴量抽出 － カテゴリ変数と数値変数の取り扱い方](http://rio-cloud.hatenablog.com/entry/2018/05/02/175319)