示例#1
0
    def test_decreasing_mse_for_increased_partition_prior(self):
        for data_matrix_transform in data_matrix_transforms:
            mu = 0
            sd_prior = 1
            prior_obs = 0.01
            kappa = prior_obs
            alpha = prior_obs / 2
            var_prior = sd_prior**2
            tau_prior = 1 / var_prior
            beta = alpha / tau_prior

            prior = np.array([mu, kappa, alpha, beta])

            x = np.linspace(-np.pi / 2, np.pi / 2, 20)
            y = np.linspace(-np.pi / 2, np.pi / 2, 20)
            X = np.array([x, y]).T
            y = np.sin(x) + 3 * np.cos(y)

            X = data_matrix_transform(X)

            for i_model in range(len(create_regression_trees(prior, 0.5))):
                mse_list = []
                for partition_prior in [0.1, 0.5, 0.9, 0.99]:
                    model = create_regression_trees(prior,
                                                    partition_prior)[i_model]
                    print('Testing {}'.format(type(model).__name__))
                    model.fit(X, y)
                    print(model)
                    mse = mean_squared_error(y, model.predict(X))
                    mse_list.append(mse)

                self.assertTrue(mse_list[-1] < mse_list[0])
                for i in range(0, len(mse_list) - 1):
                    self.assertTrue(mse_list[i + 1] <= mse_list[i])
示例#2
0
    def test_cannot_predict_with_bad_input_dimensions(self):
        mu = 0
        sd_prior = 1
        prior_obs = 0.01
        kappa = prior_obs
        alpha = prior_obs / 2
        var_prior = sd_prior**2
        tau_prior = 1 / var_prior
        beta = alpha / tau_prior

        prior = np.array([mu, kappa, alpha, beta])

        for data_matrix_transform in data_matrix_transforms:
            for model in create_regression_trees(prior, 0.5):
                Xy = np.array([
                    [0.0, 0.0, 0],
                    [0.0, 1.0, 1],
                    [1.0, 1.0, 0],
                    [1.0, 0.0, 1],
                    [1.0, 0.0, 0],
                ])
                X = Xy[:, :-1]
                y = Xy[:, -1]

                X = data_matrix_transform(X)

                print('Testing {}'.format(type(model).__name__))
                model.fit(X, y)
                print(model)

                model.predict([0, 0])

                try:
                    model.predict(0)
                    self.fail()
                except ValueError:
                    pass

                try:
                    model.predict([0])
                    self.fail()
                except ValueError:
                    pass

                try:
                    model.predict([0, 0, 0])
                    self.fail()
                except ValueError:
                    pass
示例#3
0
    def test_cannot_predict_before_training(self):
        mu = 0
        sd_prior = 1
        prior_obs = 0.01
        kappa = prior_obs
        alpha = prior_obs / 2
        var_prior = sd_prior**2
        tau_prior = 1 / var_prior
        beta = alpha / tau_prior

        prior = np.array([mu, kappa, alpha, beta])

        for model in create_regression_trees(prior, 0.5):
            # can't predict yet
            try:
                model.predict([])
                self.fail()
            except ValueError:
                pass
示例#4
0
    def test_no_split(self):
        for data_matrix_transform in data_matrix_transforms:
            mu = 0
            sd_prior = 1
            prior_obs = 0.01
            kappa = prior_obs
            alpha = prior_obs / 2
            var_prior = sd_prior**2
            tau_prior = 1 / var_prior
            beta = alpha / tau_prior

            prior = np.array([mu, kappa, alpha, beta])

            for model in create_regression_trees(prior, 0.5):
                Xy = np.array([
                    [0.0, 0.0, 0],
                    [0.1, 0.1, 1.3],
                    [0.9, 0.9, 0],
                    [1.0, 1.0, 1.2],
                    [1.0, 1.0, 0],
                ])
                X = Xy[:, :-1]
                y = Xy[:, -1]

                X = data_matrix_transform(X)

                print('Testing {}'.format(type(model).__name__))
                model.fit(X, y)
                print(model)

                self.assertEqual(model.get_depth(), 0)
                self.assertEqual(model.get_n_leaves(), 1)
                self.assertEqual(model.n_data, 5)

                self.assertIsNone(model.child1)
                self.assertIsNone(model.child2)

                if isinstance(model, PerpendicularRegressionTree):
                    self.assertEqual(model.split_dimension, -1)
                    self.assertEqual(model.split_value, None)
                else:
                    self.assertEqual(model.best_hyperplane_origin, None)

                n = len(y)
                mean = y.mean()
                mu, kappa, alpha, beta = prior
                kappa_post = kappa + n
                mu_post = (kappa * mu + n * mean) / kappa_post

                expected = np.array([mu_post, mu_post, mu_post, mu_post])
                self.assertEqual(model.predict([0.0, 0.5]),
                                 np.expand_dims(expected[0], 0))
                self.assertEqual(model.predict([0.49, 0.5]),
                                 np.expand_dims(expected[1], 0))
                self.assertEqual(model.predict([0.51, 0.5]),
                                 np.expand_dims(expected[2], 0))
                self.assertEqual(model.predict([1.0, 0.5]),
                                 np.expand_dims(expected[3], 0))

                for data_matrix_transform2 in data_matrix_transforms:
                    assert_array_equal(
                        model.predict(
                            data_matrix_transform2([[0.0, 0.5], [0.49, 0.5],
                                                    [0.51, 0.5], [1.0, 0.5]])),
                        expected)
示例#5
0
 def test_print_empty_model(self):
     for model in create_regression_trees(np.array([1, 1]), 0.5):
         print(model)