【Chainer実践編2】scikit-learnのデータはどう使うの?データセットの中身を加工してみたら理解できた。

【Chainer実践編2】scikit-learnのデータはどう使うの?データセットの中身を加工してみたら理解できた。

春はあけぼの。やうやう白くなりゆく山際、少しデコルテ、紫だちたる雲の細くたなびきたる。 っと

ども、アイーンです。

さぁ、前回に引き続きChainerの実践ということであいかわらずやっておりますけども。

どんなデータが必要なのかは前回でお分かりいただけたと思います。しかし、しかしですよ。データの扱い方について我々はまだ何も知らない。そうは思いませんか!そうでしょう!そうに違いない!

というわけで・・・

今回はsckit-learnからアヤメのデータを取り出して、深層学習に使える形に加工してやるところまでをやってみます。

それでは行ってみましょ~

 

作成準備

それではimportです。

いつもどおり、importしてください。

import chainer

import chainer.links as L

import chainer.functions as F

from chainer import Variable,Chain,optimizers

import numpy as np

今回の新登場importは下の一行です。

from sklearn import datasets

この操作によって、sckit-learnの中にあるデータセットをこのPythonファイルでごにょごにょ出来るようになります。

さ、ごにょごにょしましょう。

IrisData = datasets.load_iris()

datasets.load_iris()によって、アイリス(アヤメ)のデータをIrisDataへ移してみました。中身はこんな感じです。

 

・・・行が長すぎて全部見せれねぇ・・・

 

どうせこの後の操作でも分けて使うんで、IrisDataの中身を分けてみましょう。

x = IrisData.data.astype(np.float32)

t = IrisData.target

n = t.size

アイリスデータセットの中には3種類のデータが入ってます。

data  がく片と花弁の長さ、幅

target 品種の正解データ(data[n]行目に対応)

target_names 花の品種名

今回は、品種名を加工する必要はないので、みなさんでコードを書いて、中身を確認してください。

かわりに、入ってるデータの数が必要になるため、t.sizeでリスト数を取り出しました。

これを、それぞれx、t、nに入れましょう。

個別にみるとこんな感じ。

それでも全部はみれねぇw

さて、これからコイツを、深層学習に使えるように加工していきます。

 

データの加工ってどうやるの?

前回ご説明したとおり、今回は分類をやります。

入力が4種(がく片、花弁の幅や長さ)に対し、出力が3つ(花の品種)になりますが、出力結果がもっとも1に近いものが「その品種である可能性が高い」ものとして判定させます。

なので、いまの t「0、1、2」という形で品種を表すのは不都合です。

これを、正解を1、それ以外を0というリストに加工してやりましょう。

 

t_matrix = np.zeros(3 * n).reshape(n, 3).astype(np.float32)

t_matrixに0の入ったn行3列のリストを作成します。

今回はnには150が入ってますので、150行です。

[0. 0. 0.]

[0. 0. 0.]

 

for i in range(n):
t_matrix[i, t[i]] = 1.0

これで150回ループさせて、t_matrixに正解データの位置には1、間違いには0を入力します。

詳しく解説しとくと

第1ループでは

t_matrix[0,0] = 1.0 のように、0行0列に1.0を代入

[1. 0. 0.]

第51ループでは

t_matrix[51,1] = 1.0 のように、51行1列に1.0を代入

[0. 1. 0.]

第101ループでは

t_matrix[101,2] = 1.0 のように、101行2列に1.0を代入

[0. 0. 1.]

となります。tリストの使い方が重要。

 

こ~んな素敵なリストが出来ました。

 

訓練用データとテストデータに分割しよう

さぁ、出来た150個のリストを全部使って訓練はしません

全部使うと、一度訓練で使用したデータを、もう一度仕訳けられるか確認するだけになります。カンニング野郎の汚名を着せられます。

ちゃんと、見たことないデータも正解に分類できたら本物ですよね。

ではコイツを、訓練用データとテストデータに分けてやりましょう。

index = np.arange(n)

index_train = index[index % 2 != 0]

index_test = index[index % 2 == 0]

この3行で、偶数と奇数の入ったリストを作ります。

 

コレを使って、偶数と奇数でデータを2分割してやりましょう。

 

x_train = x[index_train, : ]

t_train = t_matrix[index_train, : ]

x_test = x[index_test, : ]

t_test = t[index_test]

xの偶数をx_trainに、t_trainにはxに使われたのと同じ箇所の正解データをぶち込み、同じように奇数のデータをx_testとt_testに入れます。

t_testだけ、マトリックス[1,0,0]である必要がないため

tからデータを取り出しているところだけご注意ください。

 

 

ここまで出来たらあとは簡単。

Variableタイプのデータに変換しましょう。

x_train_v = Variable(x_train)

t_train_v = Variable(t_train)

x_test_v = Variable(x_test)

 

それではみなさんお疲れさまでした。

データの加工は終了です。これで、深層学習に使える形になりました。

次回がコレを使って学習を実施してみましょう。

 

これで貴方の肩書は「データ加工師」です。

印鑑偽造などの悪用はいけませんよ。

 

それでは。