LoginSignup
14
13

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-20

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()) # ラベル予測


14
13
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
14
13