scikit-learnの学習データセットをchainerで(学習・予測に)使う


Scikit-learnで使っていたnp.arrayデータセットをChainer (1.11)ですぐに使えなかったのでメモ.

用意するのは

  • 学習データセット:train_X, train_y
  • テストデータセット:test_X, test_y

ここで

  • train_X, test_Xは(サンプル数, 次元)のnp.array.通常float32.
  • train_y, test_yは(サンプル数, )のnp.array.おそらくデフォルトでint64.

sklearnの場合

sklearnでSVMの例
from sklearn import svm
clf = svm.SVC()
clf.fit(train_X, train_y) # 学習
clf.score(test_X, test_y) # 予測・スコア計算
prob_X = clf.predict_proba(test_X) # 確率予測

Chainerの場合

chainerのtrainerを使う

# まずクラスを作る.
class sk_dataset(chainer.dataset.DatasetMixin):
    def __init__(self, X, y):
        self.X = X.astype('float32') # float32を要求されるのでここで変換
        self.y = y.astype('int32')   # int32を要求されるのでここで変換
    def __len__(self):
        return self.X.shape[0]
    def get_example(self, i):
        return self.X[i], self.y[i]

# np.arrayをsk_dataset型に変換
train = sk_dataset(train_X, train_y)
test  = sk_dataset(test_X, test_y)

# あとはtutorial通り
model = L.Classifier(MLP())
optimizer = chainer.optimizers.SGD()
optimizer.setup(model)

train_iter = iterators.SerialIterator(train, batch_size=100)
test_iter  = iterators.SerialIterator(test,  batch_size=100, repeat=False, shuffle=False)

updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (20, 'epoch'), out='result')

trainer.run() # 学習


### 予測
i = 10 # i番目のデータ
dim = 4096 # データの次元

print("predict:", model.predictor(Variable(test[i][0].reshape((1,dim)))).data) # 生の出力

print("probability:", F.softmax(model.predictor(Variable(test[i][0].reshape((1,dim)))).data).data) # 確率予測

print("label:", F.softmax(model.predictor(Variable(test[i][0].reshape((1,dim)))).data).data.argmax()) # ラベル予測