学習データの前処理
大抵の場合、学習データをモデルに学習させる前にデータの前処理を行う。
学習データに応じて行う前処理は異なるはずなので、その都度検討を行うことになる。
前処理のテクニックは色々あるので、どのようなものがあるのかを予め知っておく必要がある。
アワビのデータセットに前処理を行う。
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
アワビのデータセットの内容は、上記のような感じになっている。
今回は前処理として、「ワンホットエンコーディング」「標準化」を行ってみる。
データの欠損はなさそうなので、それについては特に何もしない。
ワンホットエンコーディング
モデルに学習させるデータは数値でなければいけないので、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
標準化
次に、データセットを標準化してみる。
標準化したほうが学習データを公平に扱え、また、学習が収束しやすいらしい。
標準化とは? ( 統計学における標準化 より )
統計学における標準化 (standardization) とは,与えられたデータを平均が0で分散が1のデータに変換する操作のことをいう. 正規化とか規格化とも呼ばれる. 特に,任意の正規分布に従うデータX を標準正規分布 (μ=0 かつ σ2=1 の正規分布) に従うデータに変換するために用いられる場合が多い.
標準化の計算式は下記の通り。
標準化した値 = (値 - [平均]) / [標準偏差]
個人的には、ばらつき具合の尺度を揃えたぐらいのイメージを持っている。
ワンホットエンコーディングしたアワビの学習データを標準化してみる。
standarded_data = (dataset - dataset.mean()) / dataset.std() standarded_data
pandas.DataFrame.meanで平均を、pandas.DataFrame.stdで標準偏差を計算してくれる。
今後、この前処理したデータを使って、モデルに学習させていく予定。