LoginSignup
15
15

More than 5 years have passed since last update.

機械学習(分類)のためのデータセットの準備(CSVファイル編)

Last updated at Posted at 2018-11-30

はじめに

画像分類のためのデータセットの準備方法に触れている記事は多いが、csvファイルのデータセットの準備に触れている記事は少なくないか?と思い記事を書きました。
(実際datasetにするのに検索しまくり、とても時間がかかった…)

自分の備忘録も兼ねています。
また初心者のため、このやり方の方が効率的などのご意見、感想等ありましたらコメント頂けますと幸いです。

2018/12/05 一部編集しました。

なぜCSV形式?

CSV(Comma Separated Value)は文字列や数字をカンマ(,)のみで区切ったファイルです。
拡張子を「.csv」にすることでCSVファイルとして保存することができます。

データセットが数字のみの場合は、txtファイルよりもCSVファイルで保存した方が簡単にデータセットを作れます。
numpyを使うときにCSVファイルの方が扱いやすいからです。
またpandasなどもCSVファイルの方が扱いやすいと思います。

入力したいデータ

ここでは、data1.csv、data2.csvいう2つのファイルを扱うことを考えます。
1行が入力したい1データで、1つのデータは5つの要素から成り立っています。
data1は「前半」、data2は「後半」と分類したいとして話を進めます。

data1.csv
100, 101, 102, 103, 104
110, 111, 112, 113, 114
120, 121, 122, 123, 124
130, 131, 132, 133, 134
140, 141, 142, 143, 144
data2.csv
105, 106, 107, 108, 109
115, 116, 117, 118, 119
125, 126, 127, 128, 129
135, 136, 137, 138, 139
145, 146, 147, 148, 149

numpyで二次元配列にする

numpyを用いると簡単にCSVファイルを配列(リスト)に変換することができます。

import numpy as np

#データの読み込み及び配列に変換
f = np.loadtxt('data1.csv', delimiter=',', dtype='int32')
g = np.loadtxt('data2.csv', delimiter=',', dtype='int32')

#配列の保存
np.save('data1.npy', f)
np.save('data2.npy', g)

loadtxtでcsvファイルの読み込みが行えます。
delimiterでカンマ(,)で区切った配列を作ることができます。 
またnp.saveで保存したファイルは次回からはnp.load('data1.npy')で呼び出すことができます。

data1.npy
array([[100, 101, 102, 103, 104],
       [110, 111, 112, 113, 114],
       [120, 121, 122, 123, 124],
       [130, 131, 132, 133, 134],
       [140, 141, 142, 143, 144]])
data2.npy
array([[105, 106, 107, 108, 109],
       [115, 116, 117, 118, 119],
       [125, 126, 127, 128, 129],
       [135, 136, 137, 138, 139],
       [145, 146, 147, 148, 149]])

dataとlabelを紐づける

data1には「前半」、data2には「後半」というラベルをつけたいです。
そこで、0=「前半」、1=「後半」とし、配列の6行目に0または1を付けることでラベルと紐づけることにします。

#0または1の配列の作成
a = np.full((6, 1), 0, dtype='int32')
b = np.full((6, 1), 1, dtype='int32')

#作成した配列とdataの配列を結合させる(0または1の配列を6行目に追加させる)
data1 = np.hstack((f, a))
data2 = np.hstack((g, b))

#data1とdata2を一つのdatasetにまとめる
dataset = data1
dataset = np.append(dataset, data2, axis=0)

#datasetをランダムに並び替える
np.random.shuffle(dataset)

#trainとtestに分割(train data=7, test data=3)
train = dataset[:7]
test = dataset[7:]

#dataとlabelに分割
train_data, train_label = np.split(train, [-1], axis=1)
test_data, test_label = np.split(test, [-1], axis=1)

#datasetの保存
x = (train_data, train_label, test_data, test_label)
np.save('dataset.npy', x)

#次回呼び出し
train_data, train_label, test_data, test_label = np.load('dataset.npy')

np.fullで任意の値、形の配列を作成することができます。
np.hstackで横方向に配列を結合することができます。
dataとlabelを結合してからシャッフルすることで、dataとlabelを対応させつつ、ランダムな配列にすることができます。
その後、np.splitでdataとlabelに分けることでデータセットとして活用できます。

以上でデータセットの準備を行うことができました。
後は、labelをone-hot表現に変更したり、正規化を行うことで機械学習を行うことができます。

まとめ

この方法を調べるのに時間がかかり進捗が遅いと怒られたのですが、意外と簡単にデータセットにすることができました。
numpyに感謝です。

15
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
15