Irisデータセットの前処理【標準化とデータ分割】|Excel VBAでIris分類問題

前回、Irisデータセットをダウンロードしましたがこのままではニューラルネットワークを学習させることはできません。これはIrisデータセットに限った話ではなく、基本的にどのデータセットでもニューラルネットワーク内に取り込む前にデータの値を”都合のいい値”に変換しておく必要があります。

このようにデータセットの値を”都合のいい値”に変換することを「前処理」といいます。
このページでは前回ダウンロードしたIrisデータセットに対して「スケール変換(標準化)」「データ分割」という前処理を行なっていきます。

 

Irisデータセットの前処理

まずはこれからディープラーニングを行っていくための場所としてExcelファイルを作成します。
(以降ではこのファイルを「Deep_Learnig_iris.xlsm」という名前で進めていきます)

新規のExcelファイルを作成したら、Irisデータセット(CSVファイル)を[移動またはコピー]を使って「Deep_Learnig_iris.xlsm」上に複製します。下画像の「新しいブック」の部分を自身の新Excelファイル名(本ページでは「Deep_Learnig_iris.xlsm」)に切り替えてください

あとは以降の前処理含め、今後すべての工程を「Deep_Learnig_iris.xlsm」上で行なっていきます。

以降で前処理を行うためのVBAコードを紹介していきますが、それらは全て「preprocess」という標準モジュールを作成し、そこにコピペしていきましょう。

 

スケール変換(標準化)

Irisデータセットは「ガクと花弁の幅/長さ」がそれぞれまとまっています。
これから、この4つの数値をニューラルネットワークに取り込み学習させるわけなのですが、実はこのままの値をニューラルネットワークに入力してもうまく学習させることができません

これは4つの数値の「スケールの違い」が原因によるものです。
たとえば「身長」と「体重」で考えてみたとき、「身長が1cm伸びた」と「体重が1kg太った」とでは、同じ「1」という数値でも、意味合いは大きく変わってしまいます。

人間はそれぞれの数値の意味合いを判別することができますが、コンピュータは数値としてでしか判断することができません。そのため意味合いの違う数値でも同じ数値として認識されてしまい、うまくデータの特徴が取得できず、結果として学習もうまくいかなくなってしまうというわけです。

このような場合はスケールを揃えるための処理「スケール変換」を行う必要があります。
スケール変換の代表的な方法として「正規化」「標準化」というものがあります。

正規化 :すべての数値を「0」から「1」の範囲で表現できる値に変換する
標準化 :すべての値の平均が0、分散が「1」となるように値を変換する

ここではIrisデータセットのスケール変換として「標準化」をしていきます。
 

 icon-list-alt  標準化

標準化とはすべての値の平均が0、分散が1となるよう値を変換することです。
標準化の手順は下記の通りです。

 icon-edit 標準化:計算の手順 

① データ全体の平均値を求める
② 個々の値と平均値の差(偏差値)を求める
③ すべての偏差値の2乗の合計値を求める
④ ③をデータ総数で割り標準偏差を求める
⑤ 偏差値を標準偏差で割る

この手順を踏むことで、標準化することができます。

では実際にIrisデータセットの値を標準化してみましょう。
下記コードをコピペして実行してみましょう。
実行するとIrisデータセットの標準化された値が「iris-dataset-Standardization」という新規シートに出力されます。

 

データの分割

Irisデータセットのスケール変換を行ったので、次はこの標準化した150個のデータを分割します。
ニューラルネットワークの学習を行う場合、学習させる用のデータだけでなく、学習の精度を調べるためのテスト用のデータも必要になってきます。

データセットによっては、はじめから学習用データとテスト用データに分けられて提供されているものもありますが全てがそうではありません。今回のIrisデータセットのように”ただのデータセット”の場合はこちらで学習用データとテスト用データに分割する必要があります。

学習用データとテスト用データの違いはニューラルネットワークに学習させるか否かです。
そのため、計150個のIrisデータセットを単純に120個と30個のように分ければいいだけのお話ですが、分割する際はデータに偏りがないように分割する必要があります。

たとえばIrisデータセットの上から120個を学習用データ、残りをテスト用データに分けたとします。Irisデータセットは花の種類順に並んでいるため、この分割方法だとそれぞれのデータに偏りがでてしまいます。

これを避けるためにデータ分割にはランダム性を取り入れる必要があります。

では実際にこのランダム性を考慮しながら先ほど標準化した「iris-dataset-Standardization」を学習用データとテスト用データに分割していきます。
下記コードをコピペして実行することで標準化したデータセットが「train-iris」(学習用データ)と「test-iris」(テスト用データ)の2つの新規シートに分割されます。

※ここで作成したGetRandomRow関数は話の都合上「preprocessモジュール」に入れていますが、次回「Functionsモジュールの実装」の際に関数をひとまとめにしたモジュールに移行します。

以上で、前処理は全て完了です。これまでのVBAコードを実行して最終的に「train-iris」と「test-iris」という2つのシートが出来ていればOKです。

 

まとめ

今回はニューラルネットワークに学習させるために「Irisデータセット」の前処理を行いました。今回の内容をまとめると下記の通りです。

icon-check-square NNに学習させるため、データを都合のいい形に変換することを「前処理」という
icon-check-square 代表的な前処理は「スケール変換」と「データの分割」
icon-check-square 代表的なスケール変換は「正規化」「標準化」
  ・すべての数値を「0」から「1」の範囲で表現できる値に変換することを正規化という
  ・すべての値の平均が0、分散が「1」となるように値を変換することを標準化という
icon-check-square データ分割とは学習用データとテスト用データに2分割することをいう

今回の内容でニューラルネットワーク作成前の下準備は完了です。
ニューラルネットワークを作成したら、今回作成した学習用データとテスト用データを使って学習させていきます。

次回は今後のニューラルネットワーク作成に必要な関数をまとめた「Functions」というモジュールを実装していきます。(今回使った「GetRandomRow」という関数もこのモジュールにまとめます)
 

【次回】Functionsモジュールの実装
【前回】Irisデータセットのダウンロード
メインページ
 

 icon-book 参考書籍

2021年2月1日AI, Deep Learning, Excel, VBA

Posted by Lic