def test_scaleX(self): c = get_preproc_config(use_exog=True) d = prepare_data(c) # train self.assertEqual(0, int(d.trainX[0][0])) self.assertEqual(1, int(d.trainX[-1][1]))
def test_input_and_output_shapes(self): c = get_preproc_config(deseason=False) df = get_df3() d = data.Data2d(df, c) y2 = d._deseasonalize(df['dep_var'], 4) self.assertEqual(df['dep_var'].shape, y2.shape)
def test_2d_feature_importances_(self): pc = get_preproc_config(lags=3, horizon=1) d = prepare_data(pc) mockConfigSVR = get_mock_svr(d, pc) r = run_config([d, mockConfigSVR, 'val']) self.assertEqual(len(r.feature_scores), 3) self.assertEqual(r.feature_scores[0], ('lag1', 2))
def test_scaleX(self): c = get_preproc_config(use_exog=True) d = prepare_data(c) d = prepare_data(c, dim="3d") # train self.assertAlmostEqual(0.0, d.trainX[0][0][0], 2) self.assertAlmostEqual(1.0, d.trainX[-1][-1][-1], 2)
def test_scaleYref(self): # assert original Y's are not changed after scaling c = get_preproc_config(use_exog=True, horizon=1) d = prepare_data(c) self.assertEqual(52.0, d.trainYref[0]) self.assertEqual(242.0, d.trainYref[-1]) self.assertEqual(292.0, d.valYref[0]) self.assertEqual(322.0, d.valYref[-1]) self.assertEqual(372.0, d.testYref[0]) self.assertEqual(402.0, d.testYref[-1])
def test_get_data_with_exog__intent2(self): c = get_preproc_config(lags=3, use_exog=True, intent_distance=2) d = prepare_data(c) # 12, 22, 32 are endogs, 2 and 21 are exogs at distance=2 self.assertEqual(d.trainX[0].tolist(), [12, 22, 32, 20, 21]) self.assertEqual(d.trainY[0], 42) self.assertEqual(d.valX[0].tolist(), [252, 262, 272, 260, 261]) self.assertEqual(d.valY[0], 282) self.assertEqual(d.testX[0].tolist(), [332, 342, 352, 340, 341]) self.assertEqual(d.testY[0], 362)
def test_get_data_with_exog__intent2(self): c = get_preproc_config(lags=3, use_exog=True, intent_distance=2) d = prepare_data(c, dim="3d") self.assertEqual(d.trainX[0].tolist(), [[10, 11, 32], [20, 21, 42], [30, 31, 52]]) self.assertEqual(d.trainY[0], 62) self.assertEqual(d.valX[0].tolist(), [[250, 251, 272], [260, 261, 282], [270, 271, 292]]) self.assertEqual(d.valY[0], 302) self.assertEqual(d.testX[0].tolist(), [[330, 331, 352], [340, 341, 362], [350, 351, 372]]) self.assertEqual(d.testY[0], 382)
def test_deseasonalized_reference_values(self): c = get_preproc_config(deseason=True, seasonal_period=4, horizon=1, lags=1) df = get_df3() d = data.Data2d(df, c) # all deseasonalized values equal to 10.0 self.assertTrue(np.array_equal(d.trainYref, [10.0] * 11)) self.assertTrue(np.array_equal(d.valYref, [10.0] * 3)) self.assertTrue(np.array_equal(d.testYref, [10.0] * 3))
def get_forecast(self, config, config_dict): pc = get_preproc_config(lags=3, use_exog=True, horizon=1, feature_selection=0.5, rfe_step=1, random_state=1) d = prepare_data(pc) c = config(config_dict, pc) model = c.train(d) yhat = c.forecast(model, np.array([d.testX[0]])) return yhat
def test_get_data__no_exog(self): c = get_preproc_config(lags=3) d = prepare_data(c) self.assertEqual(d.trainX.shape, (21, 3)) self.assertEqual(d.valX.shape, (5, 3)) self.assertEqual(d.testX.shape, (5, 3)) self.assertEqual(d.trainX[0].tolist(), [12, 22, 32]) self.assertEqual(d.trainY[0], 42) self.assertEqual(d.valX[0].tolist(), [252, 262, 272]) self.assertEqual(d.valY[0], 282) self.assertEqual(d.testX[0].tolist(), [332, 342, 352]) self.assertEqual(d.testY[0], 362)
def test_get_data_with_exog__intent0(self): c = get_preproc_config(lags=3, use_exog=True) d = prepare_data(c) self.assertEqual(d.trainX.shape, (21, 5)) self.assertEqual(d.valX.shape, (5, 5)) self.assertEqual(d.testX.shape, (5, 5)) self.assertEqual(d.trainX[0].tolist(), [12, 22, 32, 40, 41]) self.assertEqual(d.trainY[0], 42) self.assertEqual(d.valX[0].tolist(), [252, 262, 272, 280, 281]) self.assertEqual(d.valY[0], 282) self.assertEqual(d.testX[0].tolist(), [332, 342, 352, 360, 361]) self.assertEqual(d.testY[0], 362)
def test_sets(self): c = get_preproc_config(lags=3) d_ml = prepare_data(c) d_lstm = prepare_data(c, dim="3d") # same shapes self.assertEqual(d_ml.trainY.shape[0], d_lstm.trainY.shape[0]) self.assertEqual(d_ml.valY.shape[0], d_lstm.valY.shape[0]) self.assertEqual(d_ml.testY.shape[0], d_lstm.testY.shape[0]) # same values self.assertEqual(d_ml.trainY[0], d_lstm.trainY[0]) self.assertEqual(d_ml.valY[0], d_lstm.valY[0]) self.assertEqual(d_ml.testY[0], d_lstm.testY[0])
def test_get_data__no_exog(self): c = get_preproc_config(lags=3) d = prepare_data(c, dim="3d") self.assertEqual(d.trainX.shape, (21, 3, 1)) self.assertEqual(d.valX.shape, (5, 3, 1)) self.assertEqual(d.testX.shape, (5, 3, 1)) self.assertEqual(d.trainX[0].tolist(), [[12], [22], [32]]) self.assertEqual(d.trainY[0], 42) self.assertEqual(d.valX[0].tolist(), [[252], [262], [272]]) self.assertEqual(d.valY[0], 282) self.assertEqual(d.testX[0].tolist(), [[332], [342], [352]]) self.assertEqual(d.testY[0], 362)
def test_scoring(self): c = get_preproc_config(lags=2, use_exog=True, feature_selection=0.5, random_state=1) d = prepare_data(c) # ensure that the lags + most informative exogs are kept self.assertEqual(tuple(d.trainX[0].tolist()), (100, 20, 20, 100)) # ensure relevant feature_names is left self.assertEqual(tuple(d.feature_names), ('lag2', 'lag1', 'dim1_0', 'dim1_1'))
def test_select_features(self): c = get_preproc_config(lags=2, use_exog=True, feature_selection=0.5, random_state=1) d = prepare_data(c) # keeping 4 features after selection: 2 original lags and 2 exogs self.assertEqual(d.trainX.shape[1], 4) self.assertEqual(d.valX.shape[1], 4) self.assertEqual(d.testX.shape[1], 4) # ensure that feature_names is updated too self.assertEqual(len(d.feature_names), 4)
def test_3d_test_mode(self): pc = get_preproc_config(lags=3, horizon=1) d = prepare_data(pc, dim="3d") mockConfigLSTM = get_mock_lstm(d, pc) r = run_config([d, mockConfigLSTM, 'test']) self.assertTrue(r.train_mse > 0.0) self.assertTrue(r.test_mse > 0.0) self.assertTrue(r.train_mae > 0.0) self.assertTrue(r.train_mae > 0.0) # yhat are scaled self.assertTrue(r.yhat_is[0] <= 1.0) self.assertTrue(r.yhat_oos[0] <= 1.0)
def test_2d_val_mode(self): pc = get_preproc_config(lags=3, horizon=1) d = prepare_data(pc) mockConfigSVR = get_mock_svr(d, pc) r = run_config([d, mockConfigSVR, 'val']) self.assertTrue(r.train_mse > 0.0) self.assertTrue(r.test_mse > 0.0) self.assertTrue(r.train_mae > 0.0) self.assertTrue(r.train_mae > 0.0) # yhat are scaled self.assertTrue(r.yhat_is[0] <= 1.0) self.assertTrue(r.yhat_oos[0] <= 1.0)
def test_get_data_with_exog__intent0(self): c = get_preproc_config(lags=3, use_exog=True) d = prepare_data(c, dim="3d") self.assertEqual(d.trainX.shape, (21, 3, 3)) self.assertEqual(d.valX.shape, (5, 3, 3)) self.assertEqual(d.testX.shape, (5, 3, 3)) self.assertEqual(d.trainX[0].tolist(), [[10, 11, 12], [20, 21, 22], [30, 31, 32]]) self.assertEqual(d.trainY[0], 42) self.assertEqual(d.valX[0].tolist(), [[250, 251, 252], [260, 261, 262], [270, 271, 272]]) self.assertEqual(d.valY[0], 282) self.assertEqual(d.testX[0].tolist(), [[330, 331, 332], [340, 341, 342], [350, 351, 352]]) self.assertEqual(d.testY[0], 362)
def test_get_data_with_exog__all_exog_lags(self): c = get_preproc_config(lags=3, use_exog=True) d = prepare_data(c) self.assertEqual(d.trainX.shape, (21, 9)) self.assertEqual(d.valX.shape, (5, 9)) self.assertEqual(d.testX.shape, (5, 9)) self.assertEqual(d.trainX[0].tolist(), [12, 22, 32, 10, 11, 20, 21, 30, 31]) self.assertEqual(d.trainY[0], 42) self.assertEqual(d.valX[0].tolist(), [252, 262, 272, 250, 251, 260, 261, 270, 271]) self.assertEqual(d.valY[0], 282) self.assertEqual(d.testX[0].tolist(), [332, 342, 352, 330, 331, 340, 341, 350, 351]) self.assertEqual(d.testY[0], 362)
def test_scaleY(self): # ensure scaling works c = get_preproc_config(use_exog=True, horizon=1) d = prepare_data(c) # train self.assertEqual(0.0, d.trainY[0]) self.assertEqual(1.0, d.trainY[-1]) # val self.assertTrue(d.valY[c['horizon'] - 1] != d.valYref[0]) self.assertTrue(d.valY[-1] != d.valYref[-1]) # test self.assertTrue(d.testY[c['horizon'] - 1] != d.testYref[0]) self.assertTrue(d.testY[-1] != d.testYref[-1])
def test_3d_val_mode(self): pc = get_preproc_config(lags=3, horizon=1) d = prepare_data(pc, dim="3d") mockConfigLSTM = get_mock_lstm(d, pc) print(mockConfigLSTM.__class__.__dict__.keys()) r = run_config([d, mockConfigLSTM, 'val']) self.assertTrue(r.train_mse > 0.0) self.assertTrue(r.test_mse > 0.0) self.assertTrue(r.train_mae > 0.0) self.assertTrue(r.train_mae > 0.0) # yhat are scaled self.assertTrue(r.yhat_is[0] <= 1.0) self.assertTrue(r.yhat_oos[0] <= 1.0)
def test_horizon(self): model = Mock() model.predict = Mock(return_value=[1.]) testX = np.array([ [1, 2, 3, 4, 5, 20, 21], [2, 3, 4, 5, 6, 20, 22], [3, 4, 5, 6, 7, 20, 23], [4, 5, 6, 7, 8, 20, 24], [5, 6, 7, 8, 9, 20, 25], [6, 7, 8, 9, 10, 20, 26] ]) pc = get_preproc_config(lags=3, horizon=5) c = ConfigLSVR({'c': 1., 'eps': 1.}, pc) yhat = c.forecast(model, testX) self.assertEqual(yhat.tolist(), [[1], [1]])
def test_instances(self): """Ensure predictions are inserted in the right places for new instances """ model = Mock() model.predict = Mock(return_value=[[1.0]]) # the first col is exogenous vars, the last col is endogenous testX = np.array([ [[0.0, 0.1, 1.5], [0.0, 0.2, 1.6]], [[0.0, 0.2, 1.6], [0.0, 0.3, 1.7]], [[0.0, 0.3, 1.7], [0.0, 0.4, 1.8]], [[0.0, 0.4, 1.8], [0.0, 0.5, 1.9]], [[0.0, 0.5, 1.9], [0.0, 0.6, 2.0]], [[0.0, 0.6, 2.0], [0.0, 0.7, 2.1]], ]) pc = get_preproc_config(lags=2, horizon=2) adict= {"bidirectional": False, "topology": [3, 4], "epochs": 100, "batch_size": 10, "activation": None, "dropout_rate": 0., "optimizer": None, "kernel_regularizer": (0.0, 0.0), "bias_regularization": (0.0, 0.0), "early_stopping": None, "stateful": False} c = ConfigLSTM(adict, pc) yhat = c.forecast(model, testX) calls = model.predict.call_args_list self.assertEqual(get_call_args(calls[0][0]), [[0., 0.1, 1.5], [0., 0.2, 1.6]]) self.assertEqual(get_call_args(calls[1][0]), [[0., 0.2, 1.6], [0., 0.3, 1.]]) self.assertEqual(get_call_args(calls[2][0]), [[0., 0.2, 1.6], [0., 0.3, 1.7]]) self.assertEqual(get_call_args(calls[3][0]), [[0., 0.3, 1.7], [0., 0.4, 1.]]) self.assertEqual(get_call_args(calls[4][0]), [[0., 0.3, 1.7], [0., 0.4, 1.8]]) self.assertEqual(get_call_args(calls[5][0]), [[0., 0.4, 1.8], [0., 0.5, 1.]]) self.assertEqual(get_call_args(calls[6][0]), [[0., 0.4, 1.8], [0., 0.5, 1.9]]) self.assertEqual(get_call_args(calls[7][0]), [[0., 0.5, 1.9], [0., 0.6, 1.]]) self.assertEqual(get_call_args(calls[8][0]), [[0., 0.5, 1.9], [0., 0.6, 2.]]) self.assertEqual(get_call_args(calls[9][0]), [[0., 0.6, 2.], [0., 0.7, 1.]])
def test_general_case(self): model = Mock() model.predict = Mock(return_value=[[1.0]]) testX = np.array([ [[0.0, 0.1, 1.5], [0.0, 0.2, 1.6]], [[0.0, 0.2, 1.6], [0.0, 0.3, 1.7]], [[0.0, 0.3, 1.7], [0.0, 0.4, 1.8]], [[0.0, 0.4, 1.8], [0.0, 0.5, 1.9]], [[0.0, 0.5, 1.9], [0.0, 0.6, 2.0]], [[0.0, 0.6, 2.0], [0.0, 0.7, 2.1]] ]) pc = get_preproc_config(lags=2, horizon=1) adict= {"bidirectional": False, "topology": [3, 4], "epochs": 100, "batch_size": 10, "activation": None, "dropout_rate": 0., "optimizer": None, "kernel_regularizer": (0.0, 0.0), "bias_regularization": (0.0, 0.0), "early_stopping": None, "stateful": False} c = ConfigLSTM(adict, pc) yhat = c.forecast(model, testX) self.assertEqual(yhat.tolist(), [[1], [1], [1], [1], [1], [1]])
def test_instances(self): """Ensure predictions are inserted in the right places for new instances """ model = Mock() model.predict = Mock(return_value=[1.]) # the first 3 cols are endogenous vars (from earlier to later), # the last col is exogenous testX = np.array([ [.1, .2, .3, 1.5], [.2, .3, .4, 1.6], [.3, .4, .5, 1.7], [.4, .5, .6, 1.8], [.5, .6, .7, 1.9], [.6, .7, .8, 2.], ]) pc = get_preproc_config(lags=3, horizon=2, use_exog=True) c = ConfigLSVR({'c': 1., 'eps': 1.}, pc) yhat = c.forecast(model, testX) calls = model.predict.call_args_list self.assertEqual(get_call_args(calls[0][0]), [0.1, 0.2, 0.3, 1.5]) self.assertEqual(get_call_args(calls[1][0]), [0.2, 0.3, 1, 1.6]) self.assertEqual(get_call_args(calls[2][0]), [0.2, 0.3, 0.4, 1.6]) self.assertEqual(get_call_args(calls[3][0]), [0.3, 0.4, 1, 1.7]) self.assertEqual(get_call_args(calls[4][0]), [0.3, 0.4, 0.5, 1.7]) self.assertEqual(get_call_args(calls[5][0]), [0.4, 0.5, 1, 1.8]) self.assertEqual(get_call_args(calls[6][0]), [0.4, 0.5, 0.6, 1.8]) self.assertEqual(get_call_args(calls[7][0]), [0.5, 0.6, 1, 1.9]) self.assertEqual(get_call_args(calls[8][0]), [0.5, 0.6, 0.7, 1.9]) self.assertEqual(get_call_args(calls[9][0]), [0.6, 0.7, 1, 2.0])
def test_Yref(self): c = get_preproc_config(lags=3, horizon=1) d = prepare_data(c, dim="3d") self.assertEqual(d.trainY[c['horizon'] - 1], d.trainYref[0]) self.assertEqual(d.valY[c['horizon'] - 1], d.valYref[0]) self.assertEqual(d.testY[c['horizon'] - 1], d.testYref[0])
def test_scale_revert(self): c = get_preproc_config(use_exog=True) d = prepare_data(c) d = prepare_data(c, dim="3d") self.assertTrue(d.revert(d.trainY)[5], d.trainYref[5])
def test_scale_revert(self): c = get_preproc_config(use_exog=True) d = prepare_data(c) self.assertAlmostEqual(d.revert(d.trainY)[5 + c['horizon'] - 1], d.trainYref[5], delta=0.9)