AI・機械学習 python 技術関連

[sklearn][SMOTE]データセットの作成方法について解説してみる

更新日:

概要

判定モデルに入力する前のデータ加工作業について解説したいと思います。

はじめに

大まかな流れとしては、

  • 標準化/正規化
  • ダミー変数化
  • (アップサンプリング/ダウンサンプリング)
  • データセットの分割

になります。

以下に細かく、各フェーズについて説明したいと思います。

標準化/正規化

数値の大小関係を維持しながら、0~1の間に数値を変換する作業になります。

標準化と正規化のロジックと使い分け方法は、以下になります。

  • 標準化(Standardization)
    → 平均0、標準偏差1に変換する。
    → 正規分布しているデータに対して適用
  • 正規化(Normalization)
    → 最小値0、最大値1に変換する。
    → 正規分布していなデータに対して適用(画像データなど)

これらの前処理をすることで、
学習スピードの向上と、説明変数同士のスケールを合わせるメリットがあります。

正規分布しているかしていないかは、
正規性検定をやって、P値が0.05より大きいか小さいかで判断するのが良いかと思います。
けれども、
基本的には、正規化してしまうと外れ値に引っ張られてしまうので、
標準化で良いと思います。

ダミー変数化

数値でないデータに対して、0/1のラベルを割り当てる作業になります。

基本的にモデルにデータを読み込ませるときに数値しか読み取れないので、
数値以外のデータを数値にする前処理にする必要があります。

カラムの中身が有り無しの二値のみであれば、単純に0と1を割り当てればよいですが、
曜日など3種類以上のデータが入る場合は、カラムを分割して0と1を割り当てます。
例)曜日の場合、月、火、水 … に曜日のカラムを分割し、それぞれTrue/Falseで0と1を割り当てる。

ダミー変数化することで、
判定結果を分析する際に、説明変数の影響度を大小関係で説明することが出来ます。

【ダミー変数】

サンプリング

各目的変数のレコード数が不均衡である場合、データの数を合わせる処理になります。
不均衡データを取り扱う場合、以下の方法があります。

  1. サンプリングしてデータ数を合わせる
  2. Lossに対して重みづけする
  3. 異常検知のモデルにする

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) # ダミー変数を作成

サンプリング

層化抽出・データセット分割

https://pythondatascience.plavox.info/scikit-learn/%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%87%E3%83%BC%E3%82%BF%E3%81%A8%E3%83%86%E3%82%B9%E3%83%88%E3%83%87%E3%83%BC%E3%82%BF

-AI・機械学習, python, 技術関連

Copyright© AIなんて気合いダッ! , 2020 All Rights Reserved Powered by AFFINGER5.