.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/swissmetro/plot_b01logit_all_algos.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_swissmetro_plot_b01logit_all_algos.py: Logit model =========== Estimation of a logit model with several algorithms. :author: Michel Bierlaire, EPFL :date: Tue Nov 7 17:00:09 2023 .. GENERATED FROM PYTHON SOURCE LINES 12-20 .. code-block:: default import itertools import pandas as pd from biogeme.tools import format_timedelta import biogeme.biogeme as bio from biogeme import models import biogeme.exceptions as excep from biogeme.expressions import Beta .. GENERATED FROM PYTHON SOURCE LINES 21-22 See the data processing script: :ref:`swissmetro_data`. .. GENERATED FROM PYTHON SOURCE LINES 22-36 .. code-block:: default from swissmetro_data import ( database, CHOICE, SM_AV, CAR_AV_SP, TRAIN_AV_SP, TRAIN_TT_SCALED, TRAIN_COST_SCALED, SM_TT_SCALED, SM_COST_SCALED, CAR_TT_SCALED, CAR_CO_SCALED, ) .. GENERATED FROM PYTHON SOURCE LINES 37-38 Parameters to be estimated. .. GENERATED FROM PYTHON SOURCE LINES 38-44 .. code-block:: default ASC_CAR = Beta('ASC_CAR', 0, None, None, 0) ASC_TRAIN = Beta('ASC_TRAIN', 0, None, None, 0) ASC_SM = Beta('ASC_SM', 0, None, None, 1) B_TIME = Beta('B_TIME', 0, None, None, 0) B_COST = Beta('B_COST', 0, None, None, 0) .. GENERATED FROM PYTHON SOURCE LINES 45-46 Definition of the utility functions. .. GENERATED FROM PYTHON SOURCE LINES 46-50 .. code-block:: default V1 = ASC_TRAIN + B_TIME * TRAIN_TT_SCALED + B_COST * TRAIN_COST_SCALED V2 = ASC_SM + B_TIME * SM_TT_SCALED + B_COST * SM_COST_SCALED V3 = ASC_CAR + B_TIME * CAR_TT_SCALED + B_COST * CAR_CO_SCALED .. GENERATED FROM PYTHON SOURCE LINES 51-52 Associate utility functions with the numbering of alternatives. .. GENERATED FROM PYTHON SOURCE LINES 52-54 .. code-block:: default V = {1: V1, 2: V2, 3: V3} .. GENERATED FROM PYTHON SOURCE LINES 55-56 Associate the availability conditions with the alternatives. .. GENERATED FROM PYTHON SOURCE LINES 56-58 .. code-block:: default av = {1: TRAIN_AV_SP, 2: SM_AV, 3: CAR_AV_SP} .. GENERATED FROM PYTHON SOURCE LINES 59-61 Definition of the model. This is the contribution of each observation to the log likelihood function. .. GENERATED FROM PYTHON SOURCE LINES 61-63 .. code-block:: default logprob = models.loglogit(V, av, CHOICE) .. GENERATED FROM PYTHON SOURCE LINES 64-66 Options for the optimization algorithm -------------------------------------- .. GENERATED FROM PYTHON SOURCE LINES 68-69 The conjugate gradient iteration can be constrained to stay feasible, or not. .. GENERATED FROM PYTHON SOURCE LINES 69-71 .. code-block:: default infeasible_cg_values = [True, False] .. GENERATED FROM PYTHON SOURCE LINES 72-73 The radius of the first trust region is tested with three different values. .. GENERATED FROM PYTHON SOURCE LINES 73-75 .. code-block:: default initial_radius_values = [0.1, 1.0, 10.0] .. GENERATED FROM PYTHON SOURCE LINES 76-77 The percentage of iterations such that the analytical second derivatives is evaluated. .. GENERATED FROM PYTHON SOURCE LINES 77-79 .. code-block:: default second_derivatives_values = [0.0, 0.5, 1.0] .. GENERATED FROM PYTHON SOURCE LINES 80-81 We run the optimization algorithm with all possible combinations of the parameters. The results are stored in a Pandas DataFrame called ``summary``. .. GENERATED FROM PYTHON SOURCE LINES 81-148 .. code-block:: default results = {} summary = pd.DataFrame( columns=[ 'LogLikelihood', 'GradientNorm', 'Optimization time', 'TerminationCause', 'Status', ] ) for infeasible_cg, initial_radius, second_derivatives in itertools.product( infeasible_cg_values, initial_radius_values, second_derivatives_values ): # Create the Biogeme object the_biogeme = bio.BIOGEME(database, logprob, parameter_file='few_draws.toml') # We set the parameters of the optimization algorithm the_biogeme.infeasible_cg = infeasible_cg the_biogeme.initial_radius = initial_radius the_biogeme.second_derivatives = second_derivatives # We cancel the generation of the outputfiles the_biogeme.generate_html = False the_biogeme.generate_pickle = False name = ( f'cg_{infeasible_cg}_radius_{initial_radius}_second_deriv_{second_derivatives}' ) the_biogeme.modelName = f'b05normal_mixture_algo_{name}'.strip() result_data = { 'InfeasibleCG': infeasible_cg, 'InitialRadius': initial_radius, 'SecondDerivatives': second_derivatives, 'Status': 'Success', # Assume success unless an exception is caught } try: results[name] = the_biogeme.estimate() opt_time = format_timedelta( results[name].data.optimizationMessages["Optimization time"] ) result_data.update( { 'LogLikelihood': results[name].data.logLike, 'GradientNorm': results[name].data.gradientNorm, 'Optimization time': opt_time, 'TerminationCause': results[name].data.optimizationMessages[ "Cause of termination" ], } ) except excep.BiogemeError as e: print(e) result_data.update( { 'Status': 'Failed', 'LogLikelihood': None, 'GradientNorm': None, 'Optimization time': None, 'TerminationCause': str(e), } ) results[name] = None summary = pd.concat([summary, pd.DataFrame([result_data])], ignore_index=True) .. rst-class:: sphx-glr-script-out .. code-block:: none /Users/bierlair/OnlineFiles/FilesOnGoogleDrive/github/biogeme/docs/examples/swissmetro/plot_b01logit_all_algos.py:146: FutureWarning: The behavior of DataFrame concatenation with empty or all-NA entries is deprecated. In a future version, this will no longer exclude empty or all-NA columns when determining the result dtypes. To retain the old behavior, exclude the relevant entries before the concat operation. summary = pd.concat([summary, pd.DataFrame([result_data])], ignore_index=True) .. GENERATED FROM PYTHON SOURCE LINES 149-151 .. code-block:: default summary .. raw:: html
LogLikelihood GradientNorm Optimization time TerminationCause Status InfeasibleCG InitialRadius SecondDerivatives
0 -5331.252008 0.024730 184ms Relative gradient = 3.3e-06 <= 6.1e-06 Success True 0.1 0.0
1 -5331.252007 0.017823 44ms Relative gradient = 3e-06 <= 6.1e-06 Success True 0.1 0.5
2 -5331.252007 0.000231 55ms Relative gradient = 3.9e-08 <= 6.1e-06 Success True 0.1 1.0
3 -5331.252008 0.025605 134ms Relative gradient = 3.6e-06 <= 6.1e-06 Success True 1.0 0.0
4 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success True 1.0 0.5
5 -5331.252008 0.025605 4ms Relative gradient = 4.8e-06 <= 6.1e-06 Success True 1.0 1.0
6 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success True 10.0 0.0
7 -5331.252008 0.025605 4ms Relative gradient = 4.8e-06 <= 6.1e-06 Success True 10.0 0.5
8 -5331.252008 0.025605 5ms Relative gradient = 4.8e-06 <= 6.1e-06 Success True 10.0 1.0
9 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 0.1 0.0
10 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 0.1 0.5
11 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 0.1 1.0
12 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 1.0 0.0
13 -5331.252008 0.025605 4ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 1.0 0.5
14 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 1.0 1.0
15 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 10.0 0.0
16 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 10.0 0.5
17 -5331.252008 0.025605 3ms Relative gradient = 4.8e-06 <= 6.1e-06 Success False 10.0 1.0


.. GENERATED FROM PYTHON SOURCE LINES 152-155 .. code-block:: default SUMMARY_FILE = '01logit_all_algos.csv' summary.to_csv(SUMMARY_FILE, index=False) print(f'Summary reported in file {SUMMARY_FILE}') .. rst-class:: sphx-glr-script-out .. code-block:: none Summary reported in file 01logit_all_algos.csv .. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 2.593 seconds) .. _sphx_glr_download_auto_examples_swissmetro_plot_b01logit_all_algos.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_b01logit_all_algos.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_b01logit_all_algos.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_