目次
概要
判定モデルに入力する前のデータ加工作業について解説したいと思います。
はじめに
大まかな流れとしては、
- 標準化/正規化
- ダミー変数化
- (アップサンプリング/ダウンサンプリング)
- データセットの分割
になります。
以下に細かく、各フェーズについて説明したいと思います。
標準化/正規化
数値の大小関係を維持しながら、0~1の間に数値を変換する作業になります。
標準化と正規化のロジックと使い分け方法は、以下になります。
- 標準化(Standardization)
→ 平均0、標準偏差1に変換する。
→ 正規分布しているデータに対して適用
- 正規化(Normalization)
→ 最小値0、最大値1に変換する。
→ 正規分布していなデータに対して適用(画像データなど)
これらの前処理をすることで、
学習スピードの向上と、説明変数同士のスケールを合わせるメリットがあります。
正規分布しているかしていないかは、
正規性検定をやって、P値が0.05より大きいか小さいかで判断するのが良いかと思います。
けれども、
基本的には、正規化してしまうと外れ値に引っ張られてしまうので、
標準化で良いと思います。
ダミー変数化
数値でないデータに対して、0/1のラベルを割り当てる作業になります。
基本的にモデルにデータを読み込ませるときに数値しか読み取れないので、
数値以外のデータを数値にする前処理にする必要があります。
カラムの中身が有り無しの二値のみであれば、単純に0と1を割り当てればよいですが、
曜日など3種類以上のデータが入る場合は、カラムを分割して0と1を割り当てます。
例)曜日の場合、月、火、水 … に曜日のカラムを分割し、それぞれTrue/Falseで0と1を割り当てる。
ダミー変数化することで、
判定結果を分析する際に、説明変数の影響度を大小関係で説明することが出来ます。
【ダミー変数】
サンプリング
各目的変数のレコード数が不均衡である場合、データの数を合わせる処理になります。
不均衡データを取り扱う場合、以下の方法があります。
- サンプリングしてデータ数を合わせる
- Lossに対して重みづけする
- 異常検知のモデルにする
1番の処理に対して、説明したいと思います。
ダウンサンプリング
一番レコード数がすくない目的変数にレコードの数を合わせる削る方法になります。
数を減らしても十分なレコード数がを確保できる場合、
ダウンサンプリングをして、各目的変数のレコード数を調整します。
よく用いられる手法としては、ランダムサンプリングが良く使われます。
文字通り、各目的変数ごとにランダムにピックアップする手法になります。
アップサンプリング
レコード数が少ない目的変数のレコード数を人工的に増やす手法になります。
表データの場合、
SMOTE(Synthetic Minority Oversampling TEchnique)を使用して
データを増やします。
【SMOTEの理論図】
画像データの場合、
DataAugmentationを使用して、画像の確度やトリミング、回転角度などを変えてデータを水増しすることが出来ます。
ただしDeepLearning以外のモデルには適用することが出来ないです。
【DataAugmentation】
それ以外のモデルを使用する場合は、
人力で、正常データを加工して、異常データを作り出したりすることでデータの数を増やすことが出来ます。
ホールドアウト/クロスバリデーション(交差検証)
データセットをモデルで学習させる用と
作成したモデルの精度を検証する用に分割する作業になります。
データセットを分割する際には、
各変数に偏りなく均等にデータを分割する必要があり、層化抽出をします。
また、検証方法によってデータセットの分割方法が異なり、
大きく2つの手法があります。
- ホールドアウト法
→ 7:3や8:2で学習用とテスト用にデータセットを分割する。
→ 学習用データでモデルを学習させ、検証用データを使用してモデルの精度を検証します。 - クロスバリデーション法(交差検証)
→ データセットを5つに分割する。
→ 5つのうち、4つを学習用、1つ検証用にしモデルの精度を検証する。これを5回繰り返し、各回で測定した精度の平均を最終的なモデルの精度とします。
【ホールドアウトの図】
【クロスバリデーションの図】
クロスバリデーションの方が時間がかかりますが、汎用的にモデルを評価することが出来ます。
実装
標準化/正規化
from sklearn.preprocessing import StandardScaler from sklearn.preprocessing import MinMaxScaler # 元データ np.random.seed(seed=1) data = np.random.multivariate_normal( [5, 5], [[5, 0],[0, 2]], 50 ) # 標準化 sc = StandardScaler() data_std = sc.fit_transform(data) # 正規化 ms = MinMaxScaler() data_norm = ms.fit_transform(data)
ダミー変数化
import pandas as pd pd.Series(['A','A','B','A','C']) pd.get_dummies(sr) # ダミー変数を作成