def test_PoissonRegression_settings(self):
        """...Test PoissonRegression basic settings
        """
        # solver
        solver_class_map = PoissonRegression._solvers
        for solver in PoissonRegression._solvers.keys():
            learner = PoissonRegression(solver=solver)
            solver_class = solver_class_map[solver]
            self.assertTrue(isinstance(learner._solver_obj, solver_class))

        msg = '^``solver`` must be one of agd, bfgs, gd, sgd, svrg, ' \
              'got wrong_name$'
        with self.assertRaisesRegex(ValueError, msg):
            PoissonRegression(solver='wrong_name')

        prox_class_map = PoissonRegression._penalties
        for penalty in PoissonRegression._penalties.keys():
            if penalty == 'binarsity':
                learner = PoissonRegression(penalty=penalty, blocks_start=[0],
                                            blocks_length=[1])
            else:
                learner = PoissonRegression(penalty=penalty)
            prox_class = prox_class_map[penalty]
            self.assertTrue(isinstance(learner._prox_obj, prox_class))

        msg = '^``penalty`` must be one of binarsity, elasticnet, l1, l2, ' \
              'none, tv, got wrong_name$'
        with self.assertRaisesRegex(ValueError, msg):
            PoissonRegression(penalty='wrong_name')
 def test_loglik(self):
     """...Test PoissonRegression loglik function
     """
     X_train, y_train, _, _ = self.get_train_data(n_samples=200,
                                                  n_features=12)
     learner = PoissonRegression(random_state=32789, tol=1e-9)
     learner.fit(X_train, y_train)
     X_test, y_test, _, _ = self.get_train_data(n_samples=5, n_features=12)
     np.testing.assert_array_almost_equal(
         learner.loglik(X_test, y_test), 1.8254, decimal=4)
 def test_predict(self):
     """...Test PoissonRegression predict
     """
     X_train, y_train, _, _ = self.get_train_data(n_samples=200,
                                                  n_features=12)
     learner = PoissonRegression(random_state=32789, tol=1e-9)
     learner.fit(X_train, y_train)
     X_test, y_test, _, _ = self.get_train_data(n_samples=5, n_features=12)
     y_pred = np.array([1., 5., 0., 5., 6.])
     np.testing.assert_array_almost_equal(learner.predict(X_test), y_pred)
 def test_decision_function(self):
     """...Test PoissonRegression decision function
     """
     X_train, y_train, _, _ = self.get_train_data(n_samples=200,
                                                  n_features=12)
     learner = PoissonRegression(random_state=32789, tol=1e-9)
     learner.fit(X_train, y_train)
     X_test, y_test, _, _ = self.get_train_data(n_samples=5, n_features=12)
     y_pred = np.array([1.1448, 5.2194, 0.2624, 4.5525, 6.4168])
     np.testing.assert_array_almost_equal(
         learner.decision_function(X_test), y_pred, decimal=4)
    def test_safe_array_cast(self):
        """...Test error and warnings raised by LogLearner constructor
        """
        msg = '^Copying array of size \(5, 5\) to convert it in the ' \
              'right format$'
        with self.assertWarnsRegex(RuntimeWarning, msg):
            PoissonRegression._safe_array(self.X.astype(int))

        msg = '^Copying array of size \(3, 5\) to create a ' \
              'C-contiguous version of it$'
        with self.assertWarnsRegex(RuntimeWarning, msg):
            PoissonRegression._safe_array(self.X[::2])

        np.testing.assert_array_equal(self.X,
                                      PoissonRegression._safe_array(self.X))
    def test_PoissonRegression_fit(self):
        """...Test PoissonRegression fit with default parameters
        """
        n_samples = 2000
        n_features = 20

        for fit_intercept in [False, True]:
            X, y, weights0, intercept0 = self.get_train_data(
                n_samples=n_samples, n_features=n_features,
                fit_intercept=fit_intercept)

            learner = PoissonRegression(C=1e3, verbose=False,
                                        fit_intercept=fit_intercept,
                                        solver='bfgs')
            learner.fit(X, y)
            err = np.linalg.norm(learner.weights - weights0) / n_features
            self.assertLess(err, 1e-2)
            if fit_intercept:
                self.assertLess(np.abs(learner.intercept - intercept0), 1e-1)
Example #7
0
    def test_PoissonRegression_penalty_elastic_net_ratio(self):
        """...Test PoissonRegression setting of parameter of elastic_net_ratio
        """
        ratio_1 = 0.6
        ratio_2 = 0.3
        for penalty in PoissonRegression._penalties.keys():
            if penalty == 'elasticnet':
                learner = PoissonRegression(penalty=penalty,
                                            C=self.float_1,
                                            elastic_net_ratio=ratio_1)
                self.assertEqual(learner.C, self.float_1)
                self.assertEqual(learner.elastic_net_ratio, ratio_1)
                self.assertEqual(learner._prox_obj.strength, 1. / self.float_1)
                self.assertEqual(learner._prox_obj.ratio, ratio_1)

                learner.elastic_net_ratio = ratio_2
                self.assertEqual(learner.C, self.float_1)
                self.assertEqual(learner.elastic_net_ratio, ratio_2)
                self.assertEqual(learner._prox_obj.ratio, ratio_2)

            else:
                msg = '^Penalty "%s" has no elastic_net_ratio attribute$$' % \
                      penalty
                with self.assertWarnsRegex(RuntimeWarning, msg):
                    if penalty == 'binarsity':
                        PoissonRegression(penalty=penalty,
                                          elastic_net_ratio=0.8,
                                          blocks_start=[0],
                                          blocks_length=[1])
                    else:
                        PoissonRegression(penalty=penalty,
                                          elastic_net_ratio=0.8)

                if penalty == 'binarsity':
                    learner = PoissonRegression(penalty=penalty,
                                                blocks_start=[0],
                                                blocks_length=[1])
                else:
                    learner = PoissonRegression(penalty=penalty)

                with self.assertWarnsRegex(RuntimeWarning, msg):
                    learner.elastic_net_ratio = ratio_1
    def test_PoissonRegression_run(self):
        """...Test PoissonRegression runs with different solvers and penalties
        """
        n_samples = 200
        n_features = 10

        for fit_intercept in [False, True]:
            X, y, weights0, intercept0 = self.get_train_data(
                n_samples=n_samples, n_features=n_features,
                fit_intercept=fit_intercept)
            for solver, penalty in product(PoissonRegression._solvers,
                                           PoissonRegression._penalties):
                if solver == 'bfgs' and (penalty not in ['zero', 'l2']):
                    continue

                if penalty == 'binarsity':
                    learner = PoissonRegression(
                        verbose=False, fit_intercept=fit_intercept,
                        solver=solver, penalty=penalty, max_iter=1, step=1e-5,
                        blocks_start=[0], blocks_length=[1])
                else:
                    learner = PoissonRegression(
                        verbose=False, fit_intercept=fit_intercept,
                        solver=solver, penalty=penalty, max_iter=1, step=1e-5)

                learner.fit(X, y)
                self.assertTrue(np.isfinite(learner.weights).all())
                if fit_intercept:
                    self.assertTrue(np.isfinite(learner.intercept))
 def test_PoissonRegression_solver_step(self):
     """...Test LogisticRegression setting of step parameter of solver
     """
     for solver in PoissonRegression._solvers.keys():
         if solver == 'bfgs':
             learner = PoissonRegression(solver=solver)
             self.assertIsNone(learner.step)
             learner = PoissonRegression(solver=solver, step=self.float_1)
             self.assertIsNone(learner.step)
             msg = '^Solver "bfgs" has no settable step$'
             with self.assertWarnsRegex(RuntimeWarning, msg):
                 learner.step = self.float_2
                 self.assertIsNone(learner.step)
         else:
             learner = PoissonRegression(solver=solver, step=self.float_1)
             self.assertEqual(learner.step, self.float_1)
             self.assertEqual(learner._solver_obj.step, self.float_1)
             learner.step = self.float_2
             self.assertEqual(learner.step, self.float_2)
             self.assertEqual(learner._solver_obj.step, self.float_2)
    def test_PoissonRegression_solver_random_state(self):
        """...Test PoissonRegression setting of random_state parameter of solver
        """
        for solver in PoissonRegression._solvers.keys():
            if solver in ['agd', 'gd', 'bfgs']:
                msg = '^Solver "%s" has no settable random_state$' % solver
                with self.assertWarnsRegex(RuntimeWarning, msg):
                    learner = PoissonRegression(solver=solver, random_state=1)

                    self.assertIsNone(learner.random_state)
            else:
                learner = PoissonRegression(solver=solver,
                                            random_state=self.int_1)
                self.assertEqual(learner.random_state, self.int_1)
                self.assertEqual(learner._solver_obj.seed, self.int_1)

                msg = '^random_state must be positive, got -1$'
                with self.assertRaisesRegex(ValueError, msg):
                    PoissonRegression(solver=solver, random_state=-1)

            msg = '^random_state is readonly in PoissonRegression$'
            with self.assertRaisesRegex(AttributeError, msg):
                learner = PoissonRegression(solver=solver)
                learner.random_state = self.int_2
    def test_PoissonRegression_model_settings(self):
        """...Test LogisticRegression setting of parameters of model
        """
        for solver in PoissonRegression._solvers.keys():
            learner = PoissonRegression(fit_intercept=True, solver=solver)
            self.assertEqual(learner.fit_intercept, True)
            self.assertEqual(learner._model_obj.fit_intercept, True)
            learner.fit_intercept = False
            self.assertEqual(learner.fit_intercept, False)
            self.assertEqual(learner._model_obj.fit_intercept, False)

            learner = PoissonRegression(fit_intercept=False, solver=solver)
            self.assertEqual(learner.fit_intercept, False)
            self.assertEqual(learner._model_obj.fit_intercept, False)
            learner.fit_intercept = True
            self.assertEqual(learner.fit_intercept, True)
            self.assertEqual(learner._model_obj.fit_intercept, True)
    def test_PoissonRegression_solver_basic_settings(self):
        """...Test LogisticRegression setting of basic parameters of solver
        """
        for solver in PoissonRegression._solvers.keys():
            # tol
            learner = PoissonRegression(solver=solver, tol=self.float_1)
            self.assertEqual(learner.tol, self.float_1)
            self.assertEqual(learner._solver_obj.tol, self.float_1)
            learner.tol = self.float_2
            self.assertEqual(learner.tol, self.float_2)
            self.assertEqual(learner._solver_obj.tol, self.float_2)

            # max_iter
            learner = PoissonRegression(solver=solver, max_iter=self.int_1)
            self.assertEqual(learner.max_iter, self.int_1)
            self.assertEqual(learner._solver_obj.max_iter, self.int_1)
            learner.max_iter = self.int_2
            self.assertEqual(learner.max_iter, self.int_2)
            self.assertEqual(learner._solver_obj.max_iter, self.int_2)

            # verbose
            learner = PoissonRegression(solver=solver, verbose=True)
            self.assertEqual(learner.verbose, True)
            self.assertEqual(learner._solver_obj.verbose, True)
            learner.verbose = False
            self.assertEqual(learner.verbose, False)
            self.assertEqual(learner._solver_obj.verbose, False)

            learner = PoissonRegression(solver=solver, verbose=False)
            self.assertEqual(learner.verbose, False)
            self.assertEqual(learner._solver_obj.verbose, False)
            learner.verbose = True
            self.assertEqual(learner.verbose, True)
            self.assertEqual(learner._solver_obj.verbose, True)

            # print_every
            learner = PoissonRegression(solver=solver, print_every=self.int_1)
            self.assertEqual(learner.print_every, self.int_1)
            self.assertEqual(learner._solver_obj.print_every, self.int_1)
            learner.print_every = self.int_2
            self.assertEqual(learner.print_every, self.int_2)
            self.assertEqual(learner._solver_obj.print_every, self.int_2)

            # record_every
            learner = PoissonRegression(solver=solver, record_every=self.int_1)
            self.assertEqual(learner.record_every, self.int_1)
            self.assertEqual(learner._solver_obj.record_every, self.int_1)
            learner.record_every = self.int_2
            self.assertEqual(learner.record_every, self.int_2)
            self.assertEqual(learner._solver_obj.record_every, self.int_2)
    def test_PoissonRegression_penalty_C(self):
        """...Test PoissonRegression setting of parameter of C
        """
        for penalty in PoissonRegression._penalties.keys():
            if penalty != 'none':
                if penalty == 'binarsity':
                    learner = PoissonRegression(
                        penalty=penalty, C=self.float_1, blocks_start=[0],
                        blocks_length=[1])
                else:
                    learner = PoissonRegression(penalty=penalty,
                                                C=self.float_1)
                self.assertEqual(learner.C, self.float_1)
                self.assertEqual(learner._prox_obj.strength, 1. / self.float_1)
                learner.C = self.float_2
                self.assertEqual(learner.C, self.float_2)
                self.assertEqual(learner._prox_obj.strength, 1. / self.float_2)

                msg = '^``C`` must be positive, got -1$'
                with self.assertRaisesRegex(ValueError, msg):
                    if penalty == 'binarsity':
                        PoissonRegression(penalty=penalty, C=-1,
                                          blocks_start=[0], blocks_length=[1])
                    else:
                        PoissonRegression(penalty=penalty, C=-1)
            else:
                msg = '^You cannot set C for penalty "%s"$' % penalty
                with self.assertWarnsRegex(RuntimeWarning, msg):
                    PoissonRegression(penalty=penalty, C=self.float_1)

                learner = PoissonRegression(penalty=penalty)
                with self.assertWarnsRegex(RuntimeWarning, msg):
                    learner.C = self.float_1

            msg = '^``C`` must be positive, got -2$'
            with self.assertRaisesRegex(ValueError, msg):
                learner.C = -2
Example #14
0
import matplotlib.pyplot as plt

from tick.simulation import weights_sparse_gauss
from tick.linear_model import SimuPoisReg, PoissonRegression
from tick.plot import plot_history


n_samples = 50000
n_features = 100
np.random.seed(123)
weight0 = weights_sparse_gauss(n_features, nnz=int(n_features-1)) / 20.
intercept0 = -0.1
X, y = SimuPoisReg(weight0, intercept0, n_samples=n_samples,
                   verbose=False, seed=123).simulate()

opts = {'verbose': False, 'record_every': 1, 'tol': 1e-8, 'max_iter': 40}

poisson_regressions = [
    PoissonRegression(solver='gd', **opts),
    PoissonRegression(solver='agd', **opts),
    PoissonRegression(solver='svrg', random_state=1234, **opts),
    PoissonRegression(solver='bfgs', **opts)
]

for poisson_regression in poisson_regressions:
    poisson_regression.fit(X, y)

plot_history(poisson_regressions, log_scale=True, dist_min=True)
plt.title('Solvers comparison for Poisson regression', fontsize=16)
plt.tight_layout()