どのようにデータセットを作ればよいのか
画像のデータセットに関しての情報は出ていますが、
CSVデータのデータセット作成方法の情報が見つからず、教えていただきたいです。
画像でも数値データでも同じです。
分類問題ということは、(データ、クラス) で1つのサンプルになります。
今回は横軸が時間、縦軸が力のグラフ
とのことなので、データは数値データになるかと思います。
- CSV からデータを読み込むところは、
np.loadtxt()
を使ってください。
- 横軸の時刻はデータに含めなくてもいいかもしれません。
- 時系列の長さがサンプルによって異なる場合は、指定の長さを決め、それより長いものは打ち切る、短いものは0埋め等して、揃えてください。(ミニバッチとして流すため)
サンプルコード
ノイズを含む sin/cos 関数列を2000個生成してデータセットを作り、2クラス分類する問題を考えてみました。
Keras による例を以下に示します。
python
1import matplotlib.pyplot as plt
2import numpy as np
3from keras.layers import Dense
4from keras.models import Sequential
5from keras.utils import np_utils
6from sklearn.metrics import accuracy_score
7from sklearn.model_selection import train_test_split
8
9time_len = 1000
10time = np.linspace(0, 100, time_len)
11
12class Label:
13 SIN = 0
14 COS = 1
15
16data = []
17labels = []
18for i in range(1000):
19 y1 = np.sin(time) + np.random.randn(time_len)
20 y2 = np.cos(time) + np.random.randn(time_len)
21 data.extend([y1, y2]) # データ
22 labels.extend([Label.SIN, Label.COS]) # 正解ラベル
23data = np.array(data)
24labels = np.array(labels)
25
26print('data.shape', data.shape) # data.shape (2000, 1000)
27print('labels.shape', labels.shape) # labels.shape (2000,)
28
29# データをそれぞれ学習データ75%、テストデータ25%の割合で分割する。
30# 同時にシャッフルもされる。
31x_train, x_test, y_train, y_test = \
32 train_test_split(data, labels, test_size=0.2)
33
34# y_train を one-hot 表現にする。
35y_train = np_utils.to_categorical(y_train)
36
37# モデルを作成する。
38model = Sequential()
39model.add(Dense(100, activation='relu', input_dim=1000))
40model.add(Dense(100, activation='relu'))
41model.add(Dense(2, activation='softmax'))
42model.compile(
43 optimizer='adam',
44 loss='categorical_crossentropy',
45 metrics=['accuracy'])
46
47# 学習を実行する。
48model.fit(x_train, y_train, batch_size=8, epochs=30)
49
50# モデルを保存する。
51model.save('model.h5')
52
53# 推論する。
54prob = model.predict(x_test, batch_size=len(x))
55
56# 最も確率が高いのを推定クラスとする。
57y_pred = np.argmax(prob, axis=1)
58
59# 精度を検証する。
60accuracy = accuracy_score(y_test, y_pred)
61print('accuracy: {:.2%}'.format(accuracy)) # accuracy: 100.00%
別のアプローチ
グラフを matplotlib 等で画像化して、CNN モデルを使用するのもありです。