def pre_train(predict_day=date(2017, 11, 13), name="F"): idou_week_n = 5 nn_train_num = 100 n_epochs = 50 batch_size = 10 mid = 30 hosei_rate = None trend = func.make_trend_idou(name, idou_week_n, predict_day, hosei_rate) dates = trend[0] X_pred = [] for j in range(len(dates)): holi = [] target_day = dates[j] for k in range(1, 12): if k == 5 or k == 6 or func.holiday_hantei(target_day + dt.timedelta(days=k)): holi.append(1) else: holi.append(0) X_pred.append(holi) #NNの定義 tf.reset_default_graph() layers = [Dense(11, mid, tf.nn.sigmoid), Dense(mid, 1)] x = tf.placeholder(tf.float32, [None, 11]) t = tf.placeholder(tf.float32, [None, 1]) def f_props(layers, x): for layer in layers: x = layer.f_prop(x) return x y_valid = f_props(layers, x) cost = tf.reduce_mean((t - y_valid)**2) #,axis=0) #train = tf.train.GradientDescentOptimizer(0.01).minimize(cost) #train = tf.train.GradientDescentOptimizer(0.1).minimize(cost) train = tf.train.AdamOptimizer().minimize(cost) valid = tf.nn.relu(y_valid) saver = tf.train.Saver() sess = tf.Session() # init = tf.global_variables_initializer() init = tf.initialize_all_variables() sess.run(init) for i in range(nn_train_num): #データセットの生成 trend = func.make_trend_idou(name, idou_week_n, predict_day, hosei_rate) dates = trend[0] order_num = trend[1] trend_num = trend[2] X = [] y = [] for j in range(idou_week_n, len(dates) - idou_week_n): target_day = dates[j] rate = 1.0 + func.special_rate(target_day) holi = [] for k in range(1, 12): if k == 5 or k == 6 or func.holiday_hantei( target_day + dt.timedelta(days=k)): holi.append(1) else: holi.append(0) train_rate = order_num[j] / trend_num[j] - rate if abs(train_rate) < 0.4 and sum(holi) != 2: X.append(holi) if train_rate < 0: train_rate = 0 y.append(train_rate) #学習 X = np.array(X) y = np.array(y).reshape((len(y), 1)) n_batches = X.shape[0] // batch_size for epoch in range(n_epochs): train_X, train_y = shuffle(X, y, random_state=random_state) for j in range(n_batches): start = j * batch_size end = start + batch_size _, train_cost = sess.run([train, cost], feed_dict={ x: train_X[start:end], t: train_y[start:end] }) #補正レートの再定義 hosei_rate = [] pred_y = sess.run(valid, feed_dict={x: np.array(X_pred)}) for j in range(len(dates)): target_day = dates[j] rate = 1.0 + func.special_rate(target_day) if sum(X_pred[j]) == 2: pred_y[j] = 0 hosei_rate.append(rate + pred_y[j]) # test_y = sess.run(valid, feed_dict={x: np.array(func.test_X)}) # for p,q in zip(func.test_X,test_y): # print(p,q) # saver.save(sess, "./model/model_ckpt") saver.save(sess, "./model_" + name + "/model_ckpt") sess.close()
def weeksum(predict_day, predict_week_num=1, name="F"): idou_week_n = 5 kaiki_week_n = 15 mid = 30 hosei_rate = None trend = func.make_trend_idou(name, idou_week_n, predict_day, hosei_rate) dates = trend[0] X_pred = [] for j in range(len(dates)): holi = [] target_day = dates[j] for k in range(1, 12): if k == 5 or k == 6 or func.holiday_hantei(target_day + dt.timedelta(days=k)): holi.append(1) else: holi.append(0) X_pred.append(holi) #NNの定義 tf.reset_default_graph() layers = [Dense(11, mid, tf.nn.sigmoid), Dense(mid, 1)] x = tf.placeholder(tf.float32, [None, 11]) def f_props(layers, x): for layer in layers: x = layer.f_prop(x) return x y_valid = f_props(layers, x) valid = tf.nn.relu(y_valid) saver = tf.train.Saver() #補正レートの再定義 sess = tf.Session() saver.restore(sess, "./model_" + name + "/model_ckpt") hosei_rate = [] pred_y = sess.run(valid, feed_dict={x: np.array(X_pred)}) for j in range(len(dates)): target_day = dates[j] rate = 1 + func.special_rate(target_day) if sum(X_pred[j]) == 2: pred_y[j] = 0 hosei_rate.append(rate + pred_y[j]) #予測対象のトレンド値の取得 pred_trend = func.make_trend(name, kaiki_week_n, predict_day, predict_week_num, rate=hosei_rate) trend_num = pred_trend[2][-1] #予測対象の補正値の取得 hosei_rate = [] pred = [] target_day = predict_day for j in range(predict_week_num): rate = 1 holi = [] for i in range(1, 12): if i == 5 or i == 6 or func.holiday_hantei(target_day + dt.timedelta(days=i)): holi.append(1) else: holi.append(0) if sum(holi) != 2: rate += sess.run(valid, feed_dict={x: np.array([holi])})[0][0] rate += func.special_rate(target_day) hosei_rate.append(rate) pred.append(trend_num[j] * rate) target_day += dt.timedelta(days=7) sess.close() return trend_num, hosei_rate, pred