【ML初心者アドベントカレンダー】データ変換と特徴量エンジニアリングについて


# この記事の目的

データ変換と特徴量エンジニアリングについて学ぶ

# データクリーニング（データクレンジング）とは

データをトレーニングに使用できる形へ整えること。たとえばフォーマットを統一したり、かけている値を補完（もしくは削除）したりすること。

質の悪いデータからは質の悪い出力が生まれる。*Garbage in, garbage out*
なので質の良い結果を得るためには、トレーニングに使用するデータをきちんと整えておくことが大切。

## 主な手法

### 外れ値の検出と処理

外れ値とは、データの平均から大きく離れた値のこと。全体の結果に大きな影響を及ぼす可能性があるので、取り除いたり置き換えたりする。
Amazon QuickSight を用いて検出可能。

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/anomaly-detection.html


### 欠損と補完

データに空白が存在した場合には、何らかの対処を行う必要がある。
例えば、平均値入れたり、中央値を入れたり、時系列に基づいて回帰保管をしたり、列ごと削除をするといった手法がある。
AWSでは以下の手法で検知と処理が可能。


**Amazon Forecast**（新規利用はできないみたい…）

https://docs.aws.amazon.com/ja_jp/forecast/latest/dg/howitworks-missing-values.html

**Amazon SageMaker DeepAR**

https://aws.amazon.com/jp/blogs/news/amazon-sagemaker-deepar-now-supports-missing-values-categorical-and-time-series-features-and-generalized-frequencies/

**AWS Glue**

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/transforms-configure-fmv.html

### 結合

データ同士を組み合わせて、新たなデータを作り出すこと。
データAは身長と体重、データBは体脂肪率と血液型、という二つのデータセットがあり、なおかつ「体重と体脂肪率をまとめたデータが欲しいな…」というときには、データAとデータBを結合させて一つのデータとして処理しやすくしたりする。

AWS では以下の手法で処理が可能

**AWS Glue**

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/transforms-configure-join.html

**Amazon QuickSight**

https://docs.aws.amazon.com/ja_jp/quicksight/latest/user/joining-data.html

### 重複排除

その名の通り、重複しているデータを排除すること。

AWS では以下の手法で処理が可能


**Amazon FSx for Windows File Server**

https://docs.aws.amazon.com/ja_jp/fsx/latest/WindowsGuide/managing-data-dedup.html

# 特徴量エンジニアリング

モデルをトレーニングするにあたり、使用する特徴量を加工したり修正したりすること。

## 主な手法


### スケーリング

データを定められた範囲内に広げること。

更に以下の手法に分けられる。

#### 標準化

データの平均値を 0 として、標準偏差（平均からどれくらい外れた位置にあるか）を 1 とする。

#### 正規化

データを 0 から 1 の範囲内にスケーリングする。元のデータの分布を保持できるが、最小と最大が決まっているため、外れ値があるとうまくいかない可能性がある。


#### ビニング

ビン分割とも言う。
特徴量をいくつかのカテゴリに分割する。年齢を年齢層に変換したい時などに使える。


# エンコーディング

データを機械が読み取れる形に変換すること。

## 主な手法

### ワンホットエンコーディング

（過去記事より再掲）
機械学習は数値でしかデータを処理できないため、あらかじめ特徴量を数値に変換しておく必要があるが、単純に「男=1、女=2、その他=3」のような形にすると機械が数字をそのまま優先順位と勘違いする可能性があるため、1と0で表現する。

たとえば男性1人、女性1人、その他1人を表すときは以下の図のようになる。
（1が当てはまるからone-hot、みたいな覚え方）

| 男性 | 女性 | その他 |
| ---- | ---- | ---- |
| 1 | 0 | 0 |
| 0 | 1 | 0 |
| 0 | 0 | 1 |


### バイナリエンコーディング

ラベルエンコーディングしたものを、さらにバイナリ化すること。ラベルエンコーディングと比較して、誤った順序関係の学習を回避しやすい。
カテゴリが多い場合には役に立つが、カテゴリの情報は消えてしまう。


### ラベルエンコーディング

（過去記事より再掲）
1つのカテゴリが1つの数値に当てはまるようにマッピングすること。
男性=1,女性=2,その他=3,のように数字を割り振る手法。
One-Hot エンコーディングで書いた通り、数値をそのまま優先順位と勘違いする可能性があるが実装が簡単でメモリ消費が少ない。


### トークン化

入力を小さな単語に分解すること。処理がしやすくなる。

# データ処理に役立つAWSサービス 


## SageMaker Data Wrangler

なんと、これ一つでたいていのデータ処理は行える。さらに「レシピ」としてデータ処理のあれやこれを保管して使いまわせる。もちろんノーコード。機械学習用にデータを処理するならこれを使っておけば間違いない。

https://docs.aws.amazon.com/ja_jp/sagemaker/latest/dg/canvas-transform.html

## AWS Glue

データの抽出、変換、ロード（ETL）を行うためのフルマネージドサービス。
機械学習用でなくても汎用的にデータを変換したい場合におすすめ。

https://aws.amazon.com/jp/glue/

https://docs.aws.amazon.com/ja_jp/glue/latest/dg/machine-learning-transform-tutorial.html

## AWS Glue DataBrew 

データのクリーニングや加工、前処理を行えるフルマネージドビジュアルデータ準備ツール。より機械学習へ特化している。GUIで操作が可能。もちろんノーコード。

https://aws.amazon.com/jp/glue/features/databrew/

## Amazon Managed Service for Apache Flink

ストリーミングデータを変換したいときに使用する。とにかくリアルタイムにやりたいんだというときはこれ。Apache Flinkを使うので知識が必要なのと、コストがやや高め。

## Amazon EMR

ストリーミングデータを変換したいときに使用する。バッチ変換も可能だが、その場合はリアルタイムではない。機械学習ではなく、一般的なデータ変換にも使用できる。SparkまたはHadoopを使用したいときはこっち。

## AWS Lambda

短時間で終了できる小規模タスクなら高速で処理ができる。
最大実行時間が十五分なので、簡単なストリーミングデータの処理向け。大規模なデータの処理は向いていない。

# データの検証とラベリング

## SageMaker Ground Truth

特徴量をセキュアに保存、共有ができるサービス。
ラベリングもできる（AWSのチームがやってくれる。）
コストがかかる分精度が良い。大規模なサービス向け。

https://aws.amazon.com/jp/sagemaker/groundtruth/


## Amazon Mechanical Turk

人間の知性が介入しないと処理が難しい問題（翻訳した文章の美しさなど）に対し、AWSに「これちょっと見ておいてくれませんかね…」という依頼ができるサービス。
もちろんラベリングもやってくれる。
比較的安価だが精度にばらつきがある。小規模向け。

https://aws.amazon.com/jp/mturk/faqs/