Chainerを用いてCSVから学習し、入力用のCSVが有効か無効かを0か1で判定したい
はじめまして。ディープラーニングを初めて勉強する者です。
ディープラーニング自体触れたことのない分野で全くわからずの状態です。
とあるECサイトを想定して、ユーザーの購入履歴のCSVからChainerで購入履歴を学習させ、入力用のユーザーのCSVが買うか買わないかの判定を0, 1で行いたいと思っています。
ウェブ上でCSVを読み込むサンプルなどを見つけ、自分なりに書いてみたものの、下記のようなエラーが出てしまい、困っている状態です。
実際のCSVは下記です。
性別,"職業 (1=学生, 2=勤めてる, 3=主婦)",年齢,年収,利用可能なお金,購入日,購入時間帯,前に閲覧していた商品id,"季節(0=春, 1=夏, 2=秋, 3=冬)",地域 (JIS),購入時付与ポイント,屋外温度,"気候(0=晴れ, 1=くもり, 2=雨)",ドル円(外為),ユーロ円(外為),送料,"知った方法(1=ネット検索, 2=口コミ)","趣味(1=インドア, 2=アウトドア)","流入元(0=スマフォ, 1=PC, 2=実店舗)"
1,3,23,400,3000000,1456758000,79200,2,0,1,0.03,16,1,103,103,0,1,1,0
1,2,34,1000,5000000,1468508400,68400,3,1,13,0.01,16,0,112,114,100,1,2,0
1,2,60,1000,5000000,1470150000,61200,2,1,13,0.05,18,0,103,112,100,2,1,1
2,1,22,400,300000,1470236400,61200,3,1,13,0.05,24,0,100,109,100,2,2,2
2,2,22,400,300000,1481641200,57600,2,3,13,0.05,3,2,101,100,0,1,1,1
入力データは下記です
1,3,23,400,3000000,1456758000,79200,2,0,1,0.03,16,1,103,103,0,1,1,0
下記がコードです。
# -*- coding: utf-8 -*-
import numpy as np
import chainer
from chainer import cuda, Function, gradient_check, report, training, utils, Variable
from chainer import datasets, iterators, optimizers, serializers
from chainer import Link, Chain, ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions
import pandas as pd
mnist = pd.read_csv('./data/bought_histories_utf8.csv')
mnist_data, mnist_label = np.split(mnist, [1], axis=1)
x_train,x_test = np.split(mnist_data, [50000])
y_train,y_test = np.split(mnist_label, [50000])
x_train = np.array(x_train , dtype=np.float32)
y_train = np.array(y_train , dtype=np.int32)
x_test = np.array(x_test , dtype=np.float32)
y_test = np.array(y_test , dtype=np.int32)
print('x_train:' + str(x_train.shape))
print('y_train:' + str(y_train.shape))
print('x_test:' + str(x_test.shape))
print('y_test:' + str(y_test.shape))
# 100回訓練させる
train_iter = iterators.SerialIterator(x_train, batch_size=100)
test_iter = iterators.SerialIterator(x_test, batch_size=100, repeat=False, shuffle=False)
class MLP(chainer.Chain):
def __init__(self, n_units, n_out):
super(MLP, self).__init__(
# the size of the inputs to each layer will be inferred
l1=L.Linear(None, n_units), # n_in -> n_units
l2=L.Linear(None, n_units), # n_units -> n_units
l3=L.Linear(None, n_out), # n_units -> n_out
)
def __call__(self, x):
h1 = F.relu(self.l1(x))
h2 = F.relu(self.l2(h1))
return self.l3(h2)
model = L.Classifier(MLP(1000, 1))
# Setup an optimizer
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)
updater = training.StandardUpdater(train_iter, optimizer)
trainer = training.Trainer(updater, (20, 'epoch'), out='result')
trainer.extend(extensions.Evaluator(test_iter, model))
trainer.run()
エラーの内容
x_train:(5, 1)
y_train:(5, 18)
x_test:(0, 1)
y_test:(0, 18)
Traceback (most recent call last):
File "DynamicPricing.py", line 55, in <module>
trainer.run()
File "/usr/lib64/python2.7/site-packages/chainer/training/trainer.py", line 266, in run
update()
File "/usr/lib64/python2.7/site-packages/chainer/training/updater.py", line 170, in update
self.update_core()
File "/usr/lib64/python2.7/site-packages/chainer/training/updater.py", line 189, in update_core
optimizer.update(loss_func, in_var)
File "/usr/lib64/python2.7/site-packages/chainer/optimizer.py", line 392, in update
loss = lossfun(*args, **kwds)
File "/usr/lib64/python2.7/site-packages/chainer/links/model/classifier.py", line 61, in __call__
assert len(args) >= 2
AssertionError
恐縮ですが、エラーの解決方法と0と1で出力する方法などのアドバイスいただければ幸いです。
よろしくお願いいたします。