#!/usr/bin/env python
# coding: utf-8
# # 種々のベンチマークデータ
#
# 個別のノートブックを用意していないデータセットを整える段取りを記録している。
# __目次__
#
# - Irisデータ
#
# ___
#
# ## Irisデータ
#
# 20世紀前半からある古くて小さなデータセットであるが、線形モデルでは完全に識別できないことはわかっているので、多種の学習機のプロトタイプを手軽に試すデータセットとして重宝されてきた。学習課題はアヤメの花の品種を、花びらの長さなどの指標で識別することである。
# In[1]:
import os
import csv
import numpy as np
# In[2]:
get_ipython().system(' cat data/iris/iris.data | head -n 5')
get_ipython().system(' cat data/iris/iris.data | tail -n 5')
# ここで、先頭の5行はデータであるのに対して、末尾の5行はデータのない空の行が一つある。__このからの行を削除し__、新たに`iris_rev.data`として保存しておくこと。修正を加えたファイルの中身を覗いてみると以下のとおりである。
# In[3]:
get_ipython().system(' cat data/iris/iris_rev.data | head -n 5')
get_ipython().system(' cat data/iris/iris_rev.data | tail -n 5')
# In[4]:
get_ipython().system(' wc -l data/iris/iris_rev.data')
# データがきちんと150点あることは上記からわかったので、安心して進むことができる。
# In[5]:
NUM_DATA = 150
NUM_TRAIN = 100 # Set manually.
NUM_TEST = NUM_DATA - NUM_TRAIN
NUM_FEATURES = 4
NUM_CLASSES = 3
NUM_LABELS = 1
LABEL_DICT = {"Iris-setosa": 0,
"Iris-versicolor": 1,
"Iris-virginica": 2}
# In[6]:
toread = os.path.join("data", "iris", "iris_rev.data")
data_X = np.zeros((NUM_DATA,NUM_FEATURES), dtype=np.float32)
data_y = np.zeros((NUM_DATA,1), dtype=np.int8)
with open(toread, newline="") as f_table:
f_reader = csv.reader(f_table, delimiter=",")
i = 0
for line in f_reader:
data_X[i,:] = np.array(line[0:-1], dtype=data_X.dtype)
data_y[i,:] = np.array(LABEL_DICT[line[-1]], dtype=data_y.dtype)
i += 1
# 訓練データを読み込んだのだが、検証データとともに一つの階層型ファイルにまとめるために、__PyTables__というパッケージを利用する。
# In[7]:
import tables
# In[8]:
# Open file connection, writing new file to disk.
myh5 = tables.open_file("data/iris/data.h5",
mode="w",
title="Iris data")
print(myh5) # currently empty.
# In[9]:
myh5.create_group(myh5.root, "train", "Training data")
myh5.create_group(myh5.root, "test", "Testing data")
print(myh5)
# In[10]:
# Training data arrays.
a = tables.Int8Atom()
myh5.create_earray(myh5.root.train,
name="labels",
atom=a,
shape=(0,NUM_LABELS),
title="Label values")
a = tables.Float32Atom()
myh5.create_earray(myh5.root.train,
name="inputs",
atom=a,
shape=(0,NUM_FEATURES),
title="Input images")
# Testing data arrays.
a = tables.Int8Atom()
myh5.create_earray(myh5.root.test,
name="labels",
atom=a,
shape=(0,NUM_LABELS),
title="Label values")
a = tables.Float32Atom()
myh5.create_earray(myh5.root.test,
name="inputs",
atom=a,
shape=(0,NUM_FEATURES),
title="Input images")
print(myh5)
# 訓練データと検証データに分ける前に、クラス分布が偏らないようにシャッフルしておく。
# In[11]:
shufidx = np.random.choice(a=NUM_DATA, size=NUM_DATA, replace=False)
idx_tr = shufidx[0:NUM_TRAIN]
idx_te = shufidx[NUM_TRAIN:]
# In[12]:
# Training data
for i in idx_tr:
myh5.root.train.inputs.append([data_X[i,:]])
myh5.root.train.labels.append([data_y[i,:]])
print(myh5)
# In[13]:
# Testing data
for i in idx_te:
myh5.root.test.inputs.append([data_X[i,:]])
myh5.root.test.labels.append([data_y[i,:]])
print(myh5)
# ファイルとの接続をここで打ち切る。
# In[14]:
myh5.close()
# ___