機械学習(主にTensorFlow)

機械学習のメモ書き

学習データの前処理

大抵の場合、学習データをモデルに学習させる前にデータの前処理を行う。

学習データに応じて行う前処理は異なるはずなので、その都度検討を行うことになる。

前処理のテクニックは色々あるので、どのようなものがあるのかを予め知っておく必要がある。

アワビのデータセットに前処理を行う。

import tensorflow as tf
import pandas as pd

dataset_url = "https://archive.ics.uci.edu/ml/machine-learning-databases/abalone/abalone.data"

dataset_path = tf.keras.utils.get_file('abalone.data', dataset_url)

# 名前/データタイプ/測定単位/説明
# -----------------------------
# 性別/名目/-/ M、F、I(乳児)
# 長さ/連続/ mm /最長シェル測定
# 直径/連続/ mm /長さに対して垂直
# 高さ/連続/ mm /肉の殻付き
# 総重量/連続/グラム/アワビ全体
# 縮んだ重量/連続/グラム/肉の重量
# 内臓重量/連続/グラム/腸重量(出血後)
# シェル重量/連続/グラム/乾燥後
# Rings / integer /-/ +1.5は年齢を年数で示します

column_names = [
    'Gender',
    'Length',
    'Diameter',
    'Height',
    'Whole weight',
    'Shucked weight',
    'Viscera weight',
    'Shell weight',
    'Rings'
]

raw_data = pd.read_csv(dataset_path, names=column_names)

dataset = raw_data.copy()

dataset

f:id:sham-memo:20200913185148p:plain

アワビのデータセットの内容は、上記のような感じになっている。

今回は前処理として、「ワンホットエンコーディング」「標準化」を行ってみる。

データの欠損はなさそうなので、それについては特に何もしない。

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

モデルに学習させるデータは数値でなければいけないので、Genderは数値化が必要。

最初はM => 1, F => 2, I => 3でコード化することを考えたが、これだと特徴量としては良くないらしい。 F => 2がMとIの中間のような位置付けとなっており、分析結果がおかしくなることがあるとのこと(今後検証する)。

Genderの値3種類を、下記のようにそれぞれ列に分けて0, 1で表現すると学習データとしてより良くなる(ワンホットエンコーディング

Gender Male Female Infant
M 1 0 0
F 0 1 0
I 0 0 1

ロードしたデータのGenderをワンホットエンコーディングしてみる。

gender = dataset.pop('Gender')

dataset['Male'] = (gender == 'M') * 1.0
dataset['Female'] = (gender == 'F') * 1.0
dataset['Infant'] = (gender == 'I') * 1.0

dataset

f:id:sham-memo:20200927154052p:plain

標準化

次に、データセットを標準化してみる。

標準化したほうが学習データを公平に扱え、また、学習が収束しやすいらしい。

標準化とは? ( 統計学における標準化 より )

統計学における標準化 (standardization) とは,与えられたデータを平均が0で分散が1のデータに変換する操作のことをいう. 正規化とか規格化とも呼ばれる. 特に,任意の正規分布に従うデータX を標準正規分布 (μ=0 かつ σ2=1 の正規分布) に従うデータに変換するために用いられる場合が多い.

標準化の計算式は下記の通り。

標準化した値 = (値 - [平均]) / [標準偏差]

個人的には、ばらつき具合の尺度を揃えたぐらいのイメージを持っている。

ワンホットエンコーディングしたアワビの学習データを標準化してみる。

standarded_data = (dataset - dataset.mean()) / dataset.std()

standarded_data

pandas.DataFrame.meanで平均を、pandas.DataFrame.stdで標準偏差を計算してくれる。

f:id:sham-memo:20200927160014p:plain

今後、この前処理したデータを使って、モデルに学習させていく予定。