import pandas as pd
try:
import biogeme.database as db
import biogeme.biogeme as bio
from biogeme.expressions import Beta
from biogeme.models import (
loglogit,
logit,
lognested,
nested,
logcnl_avail,
cnl_avail,
)
biogeme_installed = True
except ImportError:
biogeme_installed = False
[docs]
def SwissMetro(dataset_train: pd.DataFrame, for_prob=False):
"""
Create a MNL on the swissmetro dataset.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("swissmetro_train", dataset_train)
globals().update(database_train.variables)
# parameters to be estimated
ASC_CAR = Beta("ASC_CAR", 0, None, None, 0)
ASC_SM = Beta("ASC_SM", 0, None, None, 1)
ASC_TRAIN = Beta("ASC_TRAIN", 0, None, None, 0)
B_COST = Beta("B_COST", 0, None, 0, 0)
B_TIME = Beta("B_TIME", 0, None, 0, 0)
B_HE = Beta("B_HE", 0, None, 0, 0)
B_TIME_CAR = Beta("B_TIME_CAR", 0, None, 0, 0)
B_COST_CAR = Beta("B_COST_CAR", 0, None, 0, 0)
B_TIME_RAIL = Beta("B_TIME_RAIL", 0, None, 0, 0)
B_COST_RAIL = Beta("B_COST_RAIL", 0, None, 0, 0)
B_HE_RAIL = Beta("B_HE_RAIL", 0, None, 0, 0)
B_TIME_SM = Beta("B_TIME_SM", 0, None, 0, 0)
B_COST_SM = Beta("B_COST_SM", 0, None, 0, 0)
B_HE_SM = Beta("B_HE_SM", 0, None, 0, 0)
B_FIRST = Beta("B_FIRST", 0, None, None, 0)
B_MALE = Beta("B_MALE", 0, None, None, 0)
B_SM_SEATS = Beta("B_SM_SEATS", 0, None, None, 0)
B_SEV_LUGGAGES = Beta("B_SEV_LUGGAGES", 0, None, None, 0)
B_ORIG_ROM = Beta("B_ORIG_ROM", 0, None, None, 0)
B_ORIG_TIC = Beta("B_ORIG_TIC", 0, None, None, 0)
B_DEST_ROM = Beta("B_DEST_ROM", 0, None, None, 0)
B_DEST_TIC = Beta("B_DEST_TIC", 0, None, None, 0)
# utilities
V_TRAIN = (
ASC_TRAIN
+ B_TIME * TRAIN_TT
+ B_COST * TRAIN_COST
+ B_HE * TRAIN_HE
+ B_FIRST * FIRST
+ B_MALE * MALE
+ B_SEV_LUGGAGES * SEV_LUGGAGES
+ B_ORIG_ROM * ORIG_ROM
+ B_ORIG_TIC * ORIG_TIC
+ B_DEST_ROM * DEST_ROM
+ B_DEST_TIC * DEST_TIC
)
V_SM = (
ASC_SM
+ B_TIME * SM_TT
+ B_COST * SM_COST
+ B_HE * SM_HE
+ B_MALE * MALE
+ B_SEV_LUGGAGES * SEV_LUGGAGES
+ B_ORIG_ROM * ORIG_ROM
+ B_ORIG_TIC * ORIG_TIC
+ B_DEST_ROM * DEST_ROM
+ B_DEST_TIC * DEST_TIC
) # + B_FIRST * FIRST
V_CAR = (
ASC_CAR
+ B_TIME * CAR_TT
+ B_COST * CAR_CO
+ B_MALE * MALE
+ B_SEV_LUGGAGES * SEV_LUGGAGES
+ B_ORIG_ROM * ORIG_ROM
+ B_ORIG_TIC * ORIG_TIC
+ B_DEST_ROM * DEST_ROM
+ B_DEST_TIC * DEST_TIC
)
# simple model
# V_TRAIN = ASC_TRAIN + B_TIME * TRAIN_TT + B_COST * TRAIN_COST + B_HE * TRAIN_HE
# V_SM = ASC_SM + B_TIME * SM_TT + B_COST * SM_COST + B_HE * SM_HE
# V_CAR = ASC_CAR + B_TIME * CAR_TT + B_COST * CAR_CO
V = {0: V_TRAIN, 1: V_SM, 2: V_CAR}
av = {0: 1, 1: 1, 2: 1}
# choice model
logprob = loglogit(V, av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "SwissmetroMNL"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_train = logit(V, av, 0)
prob_SM = logit(V, av, 1)
prob_car = logit(V, av, 2)
simulate = {
"Prob. train": prob_train,
"Prob. SM": prob_SM,
"Prob. car": prob_car,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "swissmetro_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def SwissMetro_normalised(dataset_train: pd.DataFrame, for_prob=False):
"""
Create a MNL on the swissmetro dataset.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
database_train = db.Database("swissmetro_train", dataset_train)
globals().update(database_train.variables)
# parameters to be estimated
ASC_CAR = Beta("ASC_CAR", 0, None, None, 0)
ASC_SM = Beta("ASC_SM", 0, None, None, 1)
ASC_TRAIN = Beta("ASC_TRAIN", 0, None, None, 0)
B_COST = Beta("B_COST", 0, None, 0, 0)
B_TIME = Beta("B_TIME", 0, None, 0, 0)
B_HE = Beta("B_HE", 0, None, 0, 0)
B_TIME_CAR = Beta("B_TIME_CAR", 0, None, 0, 0)
B_COST_CAR = Beta("B_COST_CAR", 0, None, 0, 0)
B_TIME_RAIL = Beta("B_TIME_RAIL", 0, None, 0, 0)
B_COST_RAIL = Beta("B_COST_RAIL", 0, None, 0, 0)
B_HE_RAIL = Beta("B_HE_RAIL", 0, None, 0, 0)
B_TIME_SM = Beta("B_TIME_SM", 0, None, 0, 0)
B_COST_SM = Beta("B_COST_SM", 0, None, 0, 0)
B_HE_SM = Beta("B_HE_SM", 0, None, 0, 0)
B_FIRST = Beta("B_FIRST", 0, None, None, 0)
B_MALE = Beta("B_MALE", 0, None, None, 0)
B_SM_SEATS = Beta("B_SM_SEATS", 0, None, None, 0)
B_SEV_LUGGAGES = Beta("B_SEV_LUGGAGES", 0, None, None, 0)
B_ORIG_ROM = Beta("B_ORIG_ROM", 0, None, None, 0)
B_ORIG_TIC = Beta("B_ORIG_TIC", 0, None, None, 0)
B_DEST_ROM = Beta("B_DEST_ROM", 0, None, None, 0)
B_DEST_TIC = Beta("B_DEST_TIC", 0, None, None, 0)
B_PURPOSE_1 = Beta("B_PURPOSE_1", 0, None, None, 0)
B_PURPOSE_2 = Beta("B_PURPOSE_2", 0, None, None, 0)
B_PURPOSE_3 = Beta("B_PURPOSE_3", 0, None, None, 0)
B_PURPOSE_4 = Beta("B_PURPOSE_4", 0, None, None, 0)
B_PURPOSE_5 = Beta("B_PURPOSE_5", 0, None, None, 0)
B_PURPOSE_6 = Beta("B_PURPOSE_6", 0, None, None, 0)
B_PURPOSE_7 = Beta("B_PURPOSE_7", 0, None, None, 0)
B_PURPOSE_8 = Beta("B_PURPOSE_8", 0, None, None, 0)
B_AGE_1 = Beta("B_AGE_1", 0, None, None, 0)
B_AGE_2 = Beta("B_AGE_2", 0, None, None, 0)
B_AGE_3 = Beta("B_AGE_3", 0, None, None, 0)
B_AGE_4 = Beta("B_AGE_4", 0, None, None, 0)
# utilities
V_TRAIN = (
ASC_TRAIN
+ B_TIME * TRAIN_TT
+ B_COST * TRAIN_COST
+ B_HE * TRAIN_HE
+ B_FIRST * FIRST
+ B_MALE * MALE
+ B_PURPOSE_1 * PURPOSE_1
+ B_PURPOSE_2 * PURPOSE_2
+ B_PURPOSE_3 * PURPOSE_3
+ B_PURPOSE_4 * PURPOSE_4
+ B_PURPOSE_5 * PURPOSE_5
+ B_PURPOSE_6 * PURPOSE_6
+ B_PURPOSE_7 * PURPOSE_7
+ B_PURPOSE_8 * PURPOSE_8
+ B_AGE_1 * AGE_1
+ B_AGE_2 * AGE_2
) # + B_AGE_3 * AGE_3 + B_AGE_4 * AGE_4 #+ B_ORIG_TIC * ORIG_TIC + B_DEST_TIC * DEST_TIC + B_SEV_LUGGAGES * SEV_LUGGAGES + B_ORIG_ROM * ORIG_ROM + B_DEST_ROM * DEST_ROM
V_SM = (
ASC_SM
+ B_TIME * SM_TT
+ B_COST * SM_COST
+ B_HE * SM_HE
+ B_MALE * MALE
+ B_PURPOSE_1 * PURPOSE_1
+ B_PURPOSE_2 * PURPOSE_2
+ B_PURPOSE_3 * PURPOSE_3
+ B_PURPOSE_4 * PURPOSE_4
+ B_PURPOSE_5 * PURPOSE_5
+ B_PURPOSE_6 * PURPOSE_6
+ B_PURPOSE_7 * PURPOSE_7
+ B_PURPOSE_8 * PURPOSE_8
+ B_AGE_1 * AGE_1
+ B_AGE_2 * AGE_2
) # + B_AGE_3 * AGE_3 + B_AGE_4 * AGE_4 #+ B_ORIG_TIC * ORIG_TIC + B_DEST_TIC * DEST_TIC + B_SEV_LUGGAGES * SEV_LUGGAGES + B_SM_SEATS * SM_SEATS + B_ORIG_ROM * ORIG_ROM + B_DEST_ROM * DEST_ROM
V_CAR = (
ASC_CAR + B_TIME * CAR_TT + B_COST * CAR_CO
) # + B_SEV_LUGGAGES * SEV_LUGGAGES #+ B_MALE * MALE + B_SEV_LUGGAGES * SEV_LUGGAGES + B_ORIG_ROM * ORIG_ROM + B_ORIG_TIC * ORIG_TIC + B_DEST_ROM * DEST_ROM + B_DEST_TIC * DEST_TIC
# simple model
# V_TRAIN = ASC_TRAIN + B_TIME * TRAIN_TT + B_COST * TRAIN_COST + B_HE * TRAIN_HE
# V_SM = ASC_SM + B_TIME * SM_TT + B_COST * SM_COST + B_HE * SM_HE
# V_CAR = ASC_CAR + B_TIME * CAR_TT + B_COST * CAR_CO
V = {0: V_TRAIN, 1: V_SM, 2: V_CAR}
av = {0: 1, 1: 1, 2: 1}
# choice model
logprob = loglogit(V, av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "SwissmetroMNL"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_train = logit(V, av, 0)
prob_SM = logit(V, av, 1)
prob_car = logit(V, av, 2)
simulate = {
"Prob. train": prob_train,
"Prob. SM": prob_SM,
"Prob. car": prob_car,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "swissmetro_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def SwissMetro_nested(dataset_train: pd.DataFrame, for_prob=False):
"""
Create a nested logit model on the swissmetro dataset.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("swissmetro_train", dataset_train)
globals().update(database_train.variables)
# Parameters to be estimated
MU = Beta("MU", 1, 1, 10, 0)
# parameters to be estimated
ASC_CAR = Beta("ASC_CAR", 0, None, None, 0)
ASC_SM = Beta("ASC_SM", 0, None, None, 1)
ASC_TRAIN = Beta("ASC_TRAIN", 0, None, None, 0)
B_COST = Beta("B_COST", 0, None, 0, 0)
B_TIME = Beta("B_TIME", 0, None, 0, 0)
B_HE = Beta("B_HE", 0, None, 0, 0)
B_TIME_CAR = Beta("B_TIME_CAR", 0, None, 0, 0)
B_COST_CAR = Beta("B_COST_CAR", 0, None, 0, 0)
B_TIME_RAIL = Beta("B_TIME_RAIL", 0, None, 0, 0)
B_COST_RAIL = Beta("B_COST_RAIL", 0, None, 0, 0)
B_HE_RAIL = Beta("B_HE_RAIL", 0, None, 0, 0)
B_TIME_SM = Beta("B_TIME_SM", 0, None, 0, 0)
B_COST_SM = Beta("B_COST_SM", 0, None, 0, 0)
B_HE_SM = Beta("B_HE_SM", 0, None, 0, 0)
B_FIRST = Beta("B_FIRST", 0, None, None, 0)
B_MALE = Beta("B_MALE", 0, None, None, 0)
B_SM_SEATS = Beta("B_SM_SEATS", 0, None, None, 0)
B_SEV_LUGGAGES = Beta("B_SEV_LUGGAGES", 0, None, None, 0)
B_ORIG_ROM = Beta("B_ORIG_ROM", 0, None, None, 0)
B_ORIG_TIC = Beta("B_ORIG_TIC", 0, None, None, 0)
B_DEST_ROM = Beta("B_DEST_ROM", 0, None, None, 0)
B_DEST_TIC = Beta("B_DEST_TIC", 0, None, None, 0)
# utilities
V_TRAIN = (
ASC_TRAIN
+ B_TIME * TRAIN_TT
+ B_COST * TRAIN_COST
+ B_HE * TRAIN_HE
+ B_FIRST * FIRST
+ B_MALE * MALE
+ B_SEV_LUGGAGES * SEV_LUGGAGES
+ B_ORIG_ROM * ORIG_ROM
+ B_ORIG_TIC * ORIG_TIC
+ B_DEST_ROM * DEST_ROM
+ B_DEST_TIC * DEST_TIC
)
V_SM = (
ASC_SM
+ B_TIME * SM_TT
+ B_COST * SM_COST
+ B_HE * SM_HE
+ B_MALE * MALE
+ B_SEV_LUGGAGES * SEV_LUGGAGES
+ B_ORIG_ROM * ORIG_ROM
+ B_ORIG_TIC * ORIG_TIC
+ B_DEST_ROM * DEST_ROM
+ B_DEST_TIC * DEST_TIC
) # + B_FIRST * FIRST
V_CAR = (
ASC_CAR
+ B_TIME * CAR_TT
+ B_COST * CAR_CO
+ B_MALE * MALE
+ B_SEV_LUGGAGES * SEV_LUGGAGES
+ B_ORIG_ROM * ORIG_ROM
+ B_ORIG_TIC * ORIG_TIC
+ B_DEST_ROM * DEST_ROM
+ B_DEST_TIC * DEST_TIC
)
V = {0: V_TRAIN, 1: V_SM, 2: V_CAR}
av = {0: 1, 1: 1, 2: 1}
# Definition of nests:
# 1: nests parameter
# 2: list of alternatives
existing = MU, [0, 1]
future = 1.0, [2]
nests = existing, future
# Definition of the model. This is the contribution of each
# observation to the log likelihood function.
# The choice model is a nested logit, with availability conditions
logprob = lognested(V, av, nests, choice)
# Create the Biogeme object
the_biogeme = bio.BIOGEME(database_train, logprob)
the_biogeme.modelName = "b09nested"
the_biogeme.generate_html = False
the_biogeme.generate_pickle = False
if for_prob:
prob_train = nested(V, av, nests, 0)
prob_SM = nested(V, av, nests, 1)
prob_car = nested(V, av, nests, 2)
simulate = {
"Prob. SM": prob_SM,
"Prob. train": prob_train,
"Prob. car": prob_car,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "swissmetro_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return the_biogeme
[docs]
def SwissMetro_MNL(dataset_train: pd.DataFrame, for_prob=False):
"""
Create a simple MNL on the swissmetro dataset.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("swissmetro_train", dataset_train)
globals().update(database_train.variables)
# Parameters to be estimated
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)
# Definition of the utility functions
V1 = ASC_TRAIN + B_TIME * TRAIN_TT + B_COST * TRAIN_COST
V2 = ASC_SM + B_TIME * SM_TT + B_COST * SM_COST
V3 = ASC_CAR + B_TIME * CAR_TT + B_COST * CAR_CO
# Associate utility functions with the numbering of alternatives
V = {0: V1, 1: V2, 2: V3}
# Associate the availability conditions with the alternatives
av = {0: 1, 1: 1, 2: 1}
logprob = loglogit(V, av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "SwissmetroMNL"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_train = logit(V, av, 0)
prob_SM = logit(V, av, 1)
prob_car = logit(V, av, 2)
simulate = {
"Prob. SM": prob_SM,
"Prob. train": prob_train,
"Prob. car": prob_car,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "swissmetro_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def LPMC(dataset_train, for_prob=False):
"""
Create a MNL on the LPMC dataset.
The model is a slightly modified version from teh code that can be found here: https://github.com/JoseAngelMartinB/prediction-behavioural-analysis-ml-travel-mode-choice.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("LTDS_train", dataset_train)
globals().update(database_train.variables)
# several model specifications are available below - the best one is the uncommented one.
# best model until now, 0.6790 with lr = 0.3
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# driving_percentage, congestion charge as a binary variable NEW PB 0.6730 with lr = 0.1
MNL_beta_params_positive = ["B_car_ownership_Car", "B_driving_license_Car"]
MNL_beta_params_negative = [
"B_dur_walking_Walk",
"B_dur_cycling_Bike",
"B_dur_pt_access_Public_Transport",
"B_dur_pt_rail_Public_Transport",
"B_dur_pt_bus_Public_Transport",
"B_dur_pt_int_waiting_Public_Transport",
"B_dur_pt_int_walking_Public_Transport",
"B_pt_n_interchanges_Public_Transport",
"B_cost_transit_Public_Transport",
"B_dur_driving_Car",
"B_cost_driving_fuel_Car",
"B_distance_Walk",
"B_distance_Bike",
"B_distance_Public_Transport",
"B_distance_Car",
"B_con_charge_Car",
"B_traffic_perc_Car",
]
MNL_beta_params_neutral = [
"ASC_Bike",
"ASC_Public_Transport",
"ASC_Car",
"B_car_ownership_Walk",
"B_car_ownership_Bike",
"B_car_ownership_Public_Transport",
"B_driving_license_Walk",
"B_driving_license_Bike",
"B_driving_license_Public_Transport",
"B_age_Walk",
"B_age_Bike",
"B_age_Public_Transport",
"B_age_Car",
"B_female_Walk",
"B_female_Bike",
"B_female_Public_Transport",
"B_female_Car",
"B_day_of_week_Walk",
"B_day_of_week_Bike",
"B_day_of_week_Public_Transport",
"B_day_of_week_Car",
"B_start_time_linear_Walk",
"B_start_time_linear_Bike",
"B_start_time_linear_Public_Transport",
"B_start_time_linear_Car",
"B_purpose_B_Walk",
"B_purpose_B_Bike",
"B_purpose_B_Public_Transport",
"B_purpose_B_Car",
"B_purpose_HBE_Walk",
"B_purpose_HBE_Bike",
"B_purpose_HBE_Public_Transport",
"B_purpose_HBE_Car",
"B_purpose_HBO_Walk",
"B_purpose_HBO_Bike",
"B_purpose_HBO_Public_Transport",
"B_purpose_HBO_Car",
"B_purpose_HBW_Walk",
"B_purpose_HBW_Bike",
"B_purpose_HBW_Public_Transport",
"B_purpose_HBW_Car",
"B_purpose_NHBO_Walk",
"B_purpose_NHBO_Bike",
"B_purpose_NHBO_Public_Transport",
"B_purpose_NHBO_Car",
"B_fueltype_Avrg_Walk",
"B_fueltype_Avrg_Bike",
"B_fueltype_Avrg_Public_Transport",
"B_fueltype_Avrg_Car",
"B_fueltype_Diesel_Walk",
"B_fueltype_Diesel_Bike",
"B_fueltype_Diesel_Public_Transport",
"B_fueltype_Diesel_Car",
"B_fueltype_Hybrid_Walk",
"B_fueltype_Hybrid_Bike",
"B_fueltype_Hybrid_Public_Transport",
"B_fueltype_Hybrid_Car",
"B_fueltype_Petrol_Walk",
"B_fueltype_Petrol_Bike",
"B_fueltype_Petrol_Public_Transport",
"B_fueltype_Petrol_Car",
]
MNL_utilities = {
0: "B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking",
1: "ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling",
2: "ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit",
3: "ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_fuel_Car*cost_driving_fuel + B_con_charge_Car*congestion_charge + B_traffic_perc_Car*driving_traffic_percent",
}
# driving_percentage, congestion charge as a binary variable start time linear and travel month as cyclical variable (also day of travel need to be cyclical) removed car ownership in the cost of driving, worse results somehow
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_fuel_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car', 'B_con_charge_Car', 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_cos_Walk', 'B_start_time_linear_cos_Bike', 'B_start_time_linear_cos_Public_Transport', 'B_start_time_linear_cos_Car', 'B_start_time_linear_sin_Walk', 'B_start_time_linear_sin_Bike', 'B_start_time_linear_sin_Public_Transport', 'B_start_time_linear_sin_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car', 'B_travel_month_cos_Walk', 'B_travel_month_cos_Bike', 'B_travel_month_cos_Public_Transport', 'B_travel_month_cos_Car', 'B_travel_month_sin_Walk', 'B_travel_month_sin_Bike', 'B_travel_month_sin_Public_Transport', 'B_travel_month_sin_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_cos_Walk*start_time_linear_cos + B_start_time_linear_sin_Walk*start_time_linear_sin + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking + B_travel_month_cos_Walk*travel_month_cos + B_travel_month_sin_Walk*travel_month_sin',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_cos_Bike*start_time_linear_cos + B_start_time_linear_sin_Bike*start_time_linear_sin + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling + B_travel_month_cos_Bike*travel_month_cos + B_travel_month_sin_Bike*travel_month_sin',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_cos_Public_Transport*start_time_linear_cos + B_start_time_linear_sin_Public_Transport*start_time_linear_sin + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit + B_travel_month_cos_Public_Transport*travel_month_cos + B_travel_month_sin_Public_Transport*travel_month_sin',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_cos_Car*start_time_linear_cos + B_start_time_linear_sin_Car*start_time_linear_sin + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_fuel_Car*cost_driving_fuel + B_con_charge_Car*congestion_charge + B_traffic_perc_Car*driving_traffic_percent + B_travel_month_cos_Car*travel_month_cos + B_travel_month_sin_Car*travel_month_sin'}
# driving_percentage, congestion charge as a binary variable + distance not monotonic 0.6731 no good
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_fuel_Car', 'B_con_charge_Car', 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car','B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_fuel_Car*cost_driving_fuel + B_con_charge_Car*congestion_charge + B_traffic_perc_Car*driving_traffic_percent'}
# 0.6805
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_age_Bike', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car','B_driving_license_Public_Transport', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Bike', 'B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car','B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit + B_distance_Public_Transport*distance',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total + B_distance_Car*distance'}
# EXTREME-alternative specific model 0.683
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6796
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6789 with lr 0.3 --- change with above model; B_age_Bike and B_age_Walk in negative mono, got rid of driving license in cycling, got rid of fueltype in other features than car, got rid of car ownership in walk
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_age_Walk', 'B_age_Bike', 'B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Public_Transport', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6789 with lr 0.3 --- change with above model; got rid of start time linear
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_age_Walk', 'B_age_Bike', 'B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Public_Transport', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_car_ownership_Bike*car_ownership + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# with travel month and traffic percentage
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car', 'B_travel_month_Walk', 'B_travel_month_Bike', 'B_travel_month_Public_Transport', 'B_travel_month_Car']
# MNL_utilities = {0: 'B_travel_month_Walk*travel_month + B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_travel_month_Bike*travel_month + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_travel_month_Public_Transport*travel_month + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_travel_month_Car*travel_month + B_traffic_perc_Car*driving_traffic_percent + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# market segmentation with weekend
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_weekend_Walk', 'B_weekend_Bike', 'B_weekend_Public_Transport', 'B_weekend_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_weekend_Walk*weekend + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_weekend_Bike*weekend + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_weekend_Public_Transport*weekend + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_weekend_Car*weekend + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# construct the model parameters
for beta in MNL_beta_params_positive:
exec("{} = Beta('{}', 0, 0, None, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_negative:
exec("{} = Beta('{}', 0, None, 0, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_neutral:
exec("{} = Beta('{}', 0, None, None, 0)".format(beta, beta), globals())
# define utility functions
for utility_idx in MNL_utilities.keys():
exec("V_{} = {}".format(utility_idx, MNL_utilities[utility_idx]), globals())
# assign utility functions to utility indices
exec("V_dict = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("V_dict[{}] = V_{}".format(utility_idx, utility_idx), globals())
# associate the availability conditions with the alternatives
exec("av = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("av[{}] = 1".format(utility_idx), globals())
# definition of the model
logprob = loglogit(V_dict, av, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "LPMC"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(V_dict, av, 0)
prob_1 = logit(V_dict, av, 1)
prob_2 = logit(V_dict, av, 2)
prob_3 = logit(V_dict, av, 3)
simulate = {
"Prob. 0": prob_0,
"Prob. 1": prob_1,
"Prob. 2": prob_2,
"Prob. 3": prob_3,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "LPMC_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def LPMC_normalised(dataset_train, for_prob=False):
"""
Create a MNL on the LPMC dataset, normalised for biogeme estimation.
The model is a slightly modified version from teh code that can be found here: https://github.com/JoseAngelMartinB/prediction-behavioural-analysis-ml-travel-mode-choice.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("LTDS_train", dataset_train)
globals().update(database_train.variables)
# several model specifications are available below - the best one is the uncommented one.
# driving_percentage, congestion charge as a binary variable NEW PB 0.6730 with lr = 0.1
MNL_beta_params_positive = ["B_car_ownership_Car", "B_driving_license_Car"]
MNL_beta_params_negative = [
"B_dur_walking_Walk",
"B_dur_cycling_Bike",
"B_dur_pt_access_Public_Transport",
"B_dur_pt_rail_Public_Transport",
"B_dur_pt_bus_Public_Transport",
"B_dur_pt_int_waiting_Public_Transport",
"B_dur_pt_int_walking_Public_Transport",
"B_pt_n_interchanges_Public_Transport",
"B_cost_transit_Public_Transport",
"B_dur_driving_Car",
"B_cost_driving_fuel_Car",
"B_distance_Walk",
"B_distance_Bike",
"B_distance_Public_Transport",
"B_distance_Car",
"B_con_charge_Car",
"B_traffic_perc_Car",
]
MNL_beta_params_neutral = [
"ASC_Bike",
"ASC_Public_Transport",
"ASC_Car",
"B_car_ownership_Walk",
"B_car_ownership_Bike",
"B_car_ownership_Public_Transport",
"B_driving_license_Walk",
"B_driving_license_Bike",
"B_driving_license_Public_Transport",
"B_age_Walk",
"B_age_Bike",
"B_age_Public_Transport",
"B_age_Car",
"B_female_Walk",
"B_female_Bike",
"B_female_Public_Transport",
"B_female_Car",
"B_day_of_week_Walk",
"B_day_of_week_Bike",
"B_day_of_week_Public_Transport",
"B_day_of_week_Car",
"B_start_time_linear_Walk",
"B_start_time_linear_Bike",
"B_start_time_linear_Public_Transport",
"B_start_time_linear_Car",
"B_purpose_B_Walk",
"B_purpose_B_Bike",
"B_purpose_B_Public_Transport",
"B_purpose_B_Car",
"B_purpose_HBE_Walk",
"B_purpose_HBE_Bike",
"B_purpose_HBE_Public_Transport",
"B_purpose_HBE_Car",
"B_purpose_HBO_Walk",
"B_purpose_HBO_Bike",
"B_purpose_HBO_Public_Transport",
"B_purpose_HBO_Car",
"B_purpose_HBW_Walk",
"B_purpose_HBW_Bike",
"B_purpose_HBW_Public_Transport",
"B_purpose_HBW_Car",
"B_purpose_NHBO_Walk",
"B_purpose_NHBO_Bike",
"B_purpose_NHBO_Public_Transport",
"B_purpose_NHBO_Car",
"B_fueltype_Avrg_Walk",
"B_fueltype_Avrg_Bike",
"B_fueltype_Avrg_Public_Transport",
"B_fueltype_Avrg_Car",
"B_fueltype_Diesel_Walk",
"B_fueltype_Diesel_Bike",
"B_fueltype_Diesel_Public_Transport",
"B_fueltype_Diesel_Car",
"B_fueltype_Hybrid_Walk",
"B_fueltype_Hybrid_Bike",
"B_fueltype_Hybrid_Public_Transport",
"B_fueltype_Hybrid_Car",
"B_fueltype_Petrol_Walk",
"B_fueltype_Petrol_Bike",
"B_fueltype_Petrol_Public_Transport",
"B_fueltype_Petrol_Car",
]
MNL_utilities = {
0: "B_dur_walking_Walk*dur_walking", # + B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance',
1: "ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling",
2: "ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit",
3: "ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_fuel_Car*cost_driving_fuel + B_con_charge_Car*congestion_charge + B_traffic_perc_Car*driving_traffic_percent",
}
# construct the model parameters
for beta in MNL_beta_params_positive:
exec("{} = Beta('{}', 0, 0, None, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_negative:
exec("{} = Beta('{}', 0, None, 0, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_neutral:
exec("{} = Beta('{}', 0, None, None, 0)".format(beta, beta), globals())
# define utility functions
for utility_idx in MNL_utilities.keys():
exec("V_{} = {}".format(utility_idx, MNL_utilities[utility_idx]), globals())
# assign utility functions to utility indices
exec("V_dict = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("V_dict[{}] = V_{}".format(utility_idx, utility_idx), globals())
# associate the availability conditions with the alternatives
exec("av = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("av[{}] = 1".format(utility_idx), globals())
# definition of the model
logprob = loglogit(V_dict, av, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "LPMC"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(V_dict, av, 0)
prob_1 = logit(V_dict, av, 1)
prob_2 = logit(V_dict, av, 2)
prob_3 = logit(V_dict, av, 3)
simulate = {
"Prob. 0": prob_0,
"Prob. 1": prob_1,
"Prob. 2": prob_2,
"Prob. 3": prob_3,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "LPMC_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def LPMC_nested(dataset_train, for_prob=False):
"""
Create a nested logit model on the LPMC dataset.
The model is a slightly modified version from teh code that can be found here: https://github.com/JoseAngelMartinB/prediction-behavioural-analysis-ml-travel-mode-choice.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("LTDS_train", dataset_train)
globals().update(database_train.variables)
# several model specifications are available below - the best one is the uncommented one.
# driving_percentage, congestion charge as a binary variable NEW PB 0.6730 with lr = 0.1
MNL_beta_params_positive = ["B_car_ownership_Car", "B_driving_license_Car"]
MNL_beta_params_negative = [
"B_dur_walking_Walk",
"B_dur_cycling_Bike",
"B_dur_pt_access_Public_Transport",
"B_dur_pt_rail_Public_Transport",
"B_dur_pt_bus_Public_Transport",
"B_dur_pt_int_waiting_Public_Transport",
"B_dur_pt_int_walking_Public_Transport",
"B_pt_n_interchanges_Public_Transport",
"B_cost_transit_Public_Transport",
"B_dur_driving_Car",
"B_cost_driving_fuel_Car",
"B_distance_Walk",
"B_distance_Bike",
"B_distance_Public_Transport",
"B_distance_Car",
"B_con_charge_Car",
"B_traffic_perc_Car",
]
MNL_beta_params_neutral = [
"ASC_Bike",
"ASC_Public_Transport",
"ASC_Car",
"B_car_ownership_Walk",
"B_car_ownership_Bike",
"B_car_ownership_Public_Transport",
"B_driving_license_Walk",
"B_driving_license_Bike",
"B_driving_license_Public_Transport",
"B_age_Walk",
"B_age_Bike",
"B_age_Public_Transport",
"B_age_Car",
"B_female_Walk",
"B_female_Bike",
"B_female_Public_Transport",
"B_female_Car",
"B_day_of_week_Walk",
"B_day_of_week_Bike",
"B_day_of_week_Public_Transport",
"B_day_of_week_Car",
"B_start_time_linear_Walk",
"B_start_time_linear_Bike",
"B_start_time_linear_Public_Transport",
"B_start_time_linear_Car",
"B_purpose_B_Walk",
"B_purpose_B_Bike",
"B_purpose_B_Public_Transport",
"B_purpose_B_Car",
"B_purpose_HBE_Walk",
"B_purpose_HBE_Bike",
"B_purpose_HBE_Public_Transport",
"B_purpose_HBE_Car",
"B_purpose_HBO_Walk",
"B_purpose_HBO_Bike",
"B_purpose_HBO_Public_Transport",
"B_purpose_HBO_Car",
"B_purpose_HBW_Walk",
"B_purpose_HBW_Bike",
"B_purpose_HBW_Public_Transport",
"B_purpose_HBW_Car",
"B_purpose_NHBO_Walk",
"B_purpose_NHBO_Bike",
"B_purpose_NHBO_Public_Transport",
"B_purpose_NHBO_Car",
"B_fueltype_Avrg_Walk",
"B_fueltype_Avrg_Bike",
"B_fueltype_Avrg_Public_Transport",
"B_fueltype_Avrg_Car",
"B_fueltype_Diesel_Walk",
"B_fueltype_Diesel_Bike",
"B_fueltype_Diesel_Public_Transport",
"B_fueltype_Diesel_Car",
"B_fueltype_Hybrid_Walk",
"B_fueltype_Hybrid_Bike",
"B_fueltype_Hybrid_Public_Transport",
"B_fueltype_Hybrid_Car",
"B_fueltype_Petrol_Walk",
"B_fueltype_Petrol_Bike",
"B_fueltype_Petrol_Public_Transport",
"B_fueltype_Petrol_Car",
]
MNL_utilities = {
0: "B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking",
1: "ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling",
2: "ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit",
3: "ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_fuel_Car*cost_driving_fuel + B_con_charge_Car*congestion_charge + B_traffic_perc_Car*driving_traffic_percent",
}
# best model until now, 0.6790 with lr = 0.3
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_dur_walking_Walk*dur_walking', #B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6805
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_age_Bike', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car','B_driving_license_Public_Transport', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Bike', 'B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car','B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit + B_distance_Public_Transport*distance',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total + B_distance_Car*distance'}
# 0.6791 but misspecification
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6796
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6789 with lr 0.3 --- change with above model; B_age_Bike and B_age_Walk in negative mono, got rid of driving license in cycling, got rid of fueltype in other features than car, got rid of car ownership in walk
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_age_Walk', 'B_age_Bike', 'B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Public_Transport', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# 0.6789 with lr 0.3 --- change with above model; got rid of start time linear
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_age_Walk', 'B_age_Bike', 'B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Public_Transport', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_car_ownership_Bike*car_ownership + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# with travel month and traffic percentage
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car', 'B_day_of_week_Walk', 'B_day_of_week_Bike', 'B_day_of_week_Public_Transport', 'B_day_of_week_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car', 'B_travel_month_Walk', 'B_travel_month_Bike', 'B_travel_month_Public_Transport', 'B_travel_month_Car']
# MNL_utilities = {0: 'B_travel_month_Walk*travel_month + B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_travel_month_Bike*travel_month + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_travel_month_Public_Transport*travel_month + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_travel_month_Car*travel_month + B_traffic_perc_Car*driving_traffic_percent + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# market segmentation with weekend
# MNL_beta_params_positive = ['B_car_ownership_Car', 'B_driving_license_Car']
# MNL_beta_params_negative = ['B_dur_walking_Walk', 'B_dur_cycling_Bike', 'B_dur_pt_access_Public_Transport', 'B_dur_pt_rail_Public_Transport', 'B_dur_pt_bus_Public_Transport', 'B_dur_pt_int_waiting_Public_Transport', 'B_dur_pt_int_walking_Public_Transport', 'B_pt_n_interchanges_Public_Transport', 'B_cost_transit_Public_Transport', 'B_dur_driving_Car', 'B_cost_driving_total_Car', 'B_distance_Walk', 'B_distance_Bike', 'B_distance_Public_Transport', 'B_distance_Car']#, 'B_traffic_perc_Car']
# MNL_beta_params_neutral = ['ASC_Bike', 'ASC_Public_Transport', 'ASC_Car', 'B_car_ownership_Walk', 'B_car_ownership_Bike', 'B_car_ownership_Public_Transport', 'B_driving_license_Walk', 'B_driving_license_Bike', 'B_driving_license_Public_Transport', 'B_age_Walk', 'B_age_Bike', 'B_age_Public_Transport', 'B_age_Car', 'B_female_Walk', 'B_female_Bike', 'B_female_Public_Transport', 'B_female_Car', 'B_weekend_Walk', 'B_weekend_Bike', 'B_weekend_Public_Transport', 'B_weekend_Car', 'B_start_time_linear_Walk', 'B_start_time_linear_Bike', 'B_start_time_linear_Public_Transport', 'B_start_time_linear_Car', 'B_purpose_B_Walk', 'B_purpose_B_Bike', 'B_purpose_B_Public_Transport', 'B_purpose_B_Car', 'B_purpose_HBE_Walk', 'B_purpose_HBE_Bike', 'B_purpose_HBE_Public_Transport', 'B_purpose_HBE_Car', 'B_purpose_HBO_Walk', 'B_purpose_HBO_Bike', 'B_purpose_HBO_Public_Transport', 'B_purpose_HBO_Car', 'B_purpose_HBW_Walk', 'B_purpose_HBW_Bike', 'B_purpose_HBW_Public_Transport', 'B_purpose_HBW_Car', 'B_purpose_NHBO_Walk', 'B_purpose_NHBO_Bike', 'B_purpose_NHBO_Public_Transport', 'B_purpose_NHBO_Car', 'B_fueltype_Avrg_Walk', 'B_fueltype_Avrg_Bike', 'B_fueltype_Avrg_Public_Transport', 'B_fueltype_Avrg_Car', 'B_fueltype_Diesel_Walk', 'B_fueltype_Diesel_Bike', 'B_fueltype_Diesel_Public_Transport', 'B_fueltype_Diesel_Car', 'B_fueltype_Hybrid_Walk', 'B_fueltype_Hybrid_Bike', 'B_fueltype_Hybrid_Public_Transport', 'B_fueltype_Hybrid_Car', 'B_fueltype_Petrol_Walk', 'B_fueltype_Petrol_Bike', 'B_fueltype_Petrol_Public_Transport', 'B_fueltype_Petrol_Car']
# MNL_utilities = {0: 'B_age_Walk*age + B_female_Walk*female + B_weekend_Walk*weekend + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
# 1: 'ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_weekend_Bike*weekend + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling',
# 2: 'ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_weekend_Public_Transport*weekend + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit',
# 3: 'ASC_Car + B_age_Car*age + B_female_Car*female + B_weekend_Car*weekend + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_total_Car*cost_driving_total'}
# construct the model parameters
for beta in MNL_beta_params_positive:
exec("{} = Beta('{}', 0, 0, None, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_negative:
exec("{} = Beta('{}', 0, None, 0, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_neutral:
exec("{} = Beta('{}', 0, None, None, 0)".format(beta, beta), globals())
# define utility functions
for utility_idx in MNL_utilities.keys():
exec("V_{} = {}".format(utility_idx, MNL_utilities[utility_idx]), globals())
# assign utility functions to utility indices
exec("V_dict = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("V_dict[{}] = V_{}".format(utility_idx, utility_idx), globals())
# associate the availability conditions with the alternatives
exec("av = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("av[{}] = 1".format(utility_idx), globals())
MU_nm = Beta("MU_nm", 1, 1, 10, 0)
MU_m = Beta("MU_m", 1, 1, 10, 0)
non_motorised = MU_nm, [0, 1]
motorised = MU_m, [2, 3]
nests = non_motorised, motorised
# definition of the model
logprob = lognested(V_dict, av, nests, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "LPMC"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(V_dict, av, 0)
prob_1 = logit(V_dict, av, 1)
prob_2 = logit(V_dict, av, 2)
prob_3 = logit(V_dict, av, 3)
simulate = {
"Prob. 0": prob_0,
"Prob. 1": prob_1,
"Prob. 2": prob_2,
"Prob. 3": prob_3,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "LPMC_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def LPMC_nested_normalised(dataset_train, for_prob=False):
"""
Create a nested logit model on the LPMC dataset, normalised for biogeme estimation.
The model is a slightly modified version from teh code that can be found here: https://github.com/JoseAngelMartinB/prediction-behavioural-analysis-ml-travel-mode-choice.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("LTDS_train", dataset_train)
globals().update(database_train.variables)
# several model specifications are available below - the best one is the uncommented one.
# driving_percentage, congestion charge as a binary variable NEW PB 0.6730 with lr = 0.1
MNL_beta_params_positive = ["B_car_ownership_Car", "B_driving_license_Car"]
MNL_beta_params_negative = [
"B_dur_walking_Walk",
"B_dur_cycling_Bike",
"B_dur_pt_access_Public_Transport",
"B_dur_pt_rail_Public_Transport",
"B_dur_pt_bus_Public_Transport",
"B_dur_pt_int_waiting_Public_Transport",
"B_dur_pt_int_walking_Public_Transport",
"B_pt_n_interchanges_Public_Transport",
"B_cost_transit_Public_Transport",
"B_dur_driving_Car",
"B_cost_driving_fuel_Car",
"B_distance_Walk",
"B_distance_Bike",
"B_distance_Public_Transport",
"B_distance_Car",
"B_con_charge_Car",
"B_traffic_perc_Car",
]
MNL_beta_params_neutral = [
"ASC_Bike",
"ASC_Public_Transport",
"ASC_Car",
"B_car_ownership_Walk",
"B_car_ownership_Bike",
"B_car_ownership_Public_Transport",
"B_driving_license_Walk",
"B_driving_license_Bike",
"B_driving_license_Public_Transport",
"B_age_Walk",
"B_age_Bike",
"B_age_Public_Transport",
"B_age_Car",
"B_female_Walk",
"B_female_Bike",
"B_female_Public_Transport",
"B_female_Car",
"B_day_of_week_Walk",
"B_day_of_week_Bike",
"B_day_of_week_Public_Transport",
"B_day_of_week_Car",
"B_start_time_linear_Walk",
"B_start_time_linear_Bike",
"B_start_time_linear_Public_Transport",
"B_start_time_linear_Car",
"B_purpose_B_Walk",
"B_purpose_B_Bike",
"B_purpose_B_Public_Transport",
"B_purpose_B_Car",
"B_purpose_HBE_Walk",
"B_purpose_HBE_Bike",
"B_purpose_HBE_Public_Transport",
"B_purpose_HBE_Car",
"B_purpose_HBO_Walk",
"B_purpose_HBO_Bike",
"B_purpose_HBO_Public_Transport",
"B_purpose_HBO_Car",
"B_purpose_HBW_Walk",
"B_purpose_HBW_Bike",
"B_purpose_HBW_Public_Transport",
"B_purpose_HBW_Car",
"B_purpose_NHBO_Walk",
"B_purpose_NHBO_Bike",
"B_purpose_NHBO_Public_Transport",
"B_purpose_NHBO_Car",
"B_fueltype_Avrg_Walk",
"B_fueltype_Avrg_Bike",
"B_fueltype_Avrg_Public_Transport",
"B_fueltype_Avrg_Car",
"B_fueltype_Diesel_Walk",
"B_fueltype_Diesel_Bike",
"B_fueltype_Diesel_Public_Transport",
"B_fueltype_Diesel_Car",
"B_fueltype_Hybrid_Walk",
"B_fueltype_Hybrid_Bike",
"B_fueltype_Hybrid_Public_Transport",
"B_fueltype_Hybrid_Car",
"B_fueltype_Petrol_Walk",
"B_fueltype_Petrol_Bike",
"B_fueltype_Petrol_Public_Transport",
"B_fueltype_Petrol_Car",
]
MNL_utilities = {
0: "B_dur_walking_Walk*dur_walking", # B_age_Walk*age + B_female_Walk*female + B_day_of_week_Walk*day_of_week + B_start_time_linear_Walk*start_time_linear + B_car_ownership_Walk*car_ownership + B_driving_license_Walk*driving_license + B_purpose_B_Walk*purpose_B + B_purpose_HBE_Walk*purpose_HBE + B_purpose_HBO_Walk*purpose_HBO + B_purpose_HBW_Walk*purpose_HBW + B_purpose_NHBO_Walk*purpose_NHBO + B_fueltype_Avrg_Walk*fueltype_Average + B_fueltype_Diesel_Walk*fueltype_Diesel + B_fueltype_Hybrid_Walk*fueltype_Hybrid + B_fueltype_Petrol_Walk*fueltype_Petrol + B_distance_Walk*distance + B_dur_walking_Walk*dur_walking',
1: "ASC_Bike + B_age_Bike*age + B_female_Bike*female + B_day_of_week_Bike*day_of_week + B_start_time_linear_Bike*start_time_linear + B_car_ownership_Bike*car_ownership + B_driving_license_Bike*driving_license + B_purpose_B_Bike*purpose_B + B_purpose_HBE_Bike*purpose_HBE + B_purpose_HBO_Bike*purpose_HBO + B_purpose_HBW_Bike*purpose_HBW + B_purpose_NHBO_Bike*purpose_NHBO + B_fueltype_Avrg_Bike*fueltype_Average + B_fueltype_Diesel_Bike*fueltype_Diesel + B_fueltype_Hybrid_Bike*fueltype_Hybrid + B_fueltype_Petrol_Bike*fueltype_Petrol + B_distance_Bike*distance + B_dur_cycling_Bike*dur_cycling",
2: "ASC_Public_Transport + B_age_Public_Transport*age + B_female_Public_Transport*female + B_day_of_week_Public_Transport*day_of_week + B_start_time_linear_Public_Transport*start_time_linear + B_car_ownership_Public_Transport*car_ownership + B_driving_license_Public_Transport*driving_license + B_purpose_B_Public_Transport*purpose_B + B_purpose_HBE_Public_Transport*purpose_HBE + B_purpose_HBO_Public_Transport*purpose_HBO + B_purpose_HBW_Public_Transport*purpose_HBW + B_purpose_NHBO_Public_Transport*purpose_NHBO + B_fueltype_Avrg_Public_Transport*fueltype_Average + B_fueltype_Diesel_Public_Transport*fueltype_Diesel + B_fueltype_Hybrid_Public_Transport*fueltype_Hybrid + B_fueltype_Petrol_Public_Transport*fueltype_Petrol + B_distance_Public_Transport*distance + B_dur_pt_access_Public_Transport*dur_pt_access + B_dur_pt_rail_Public_Transport*dur_pt_rail + B_dur_pt_bus_Public_Transport*dur_pt_bus + B_dur_pt_int_waiting_Public_Transport*dur_pt_int_waiting + B_dur_pt_int_walking_Public_Transport*dur_pt_int_walking + B_pt_n_interchanges_Public_Transport*pt_n_interchanges + B_cost_transit_Public_Transport*cost_transit",
3: "ASC_Car + B_age_Car*age + B_female_Car*female + B_day_of_week_Car*day_of_week + B_start_time_linear_Car*start_time_linear + B_car_ownership_Car*car_ownership + B_driving_license_Car*driving_license + B_purpose_B_Car*purpose_B + B_purpose_HBE_Car*purpose_HBE + B_purpose_HBO_Car*purpose_HBO + B_purpose_HBW_Car*purpose_HBW + B_purpose_NHBO_Car*purpose_NHBO + B_fueltype_Avrg_Car*fueltype_Average + B_fueltype_Diesel_Car*fueltype_Diesel + B_fueltype_Hybrid_Car*fueltype_Hybrid + B_fueltype_Petrol_Car*fueltype_Petrol + B_distance_Car*distance + B_dur_driving_Car*dur_driving + B_cost_driving_fuel_Car*cost_driving_fuel + B_con_charge_Car*congestion_charge + B_traffic_perc_Car*driving_traffic_percent",
}
# construct the model parameters
for beta in MNL_beta_params_positive:
exec("{} = Beta('{}', 0, 0, None, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_negative:
exec("{} = Beta('{}', 0, None, 0, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_neutral:
exec("{} = Beta('{}', 0, None, None, 0)".format(beta, beta), globals())
# define utility functions
for utility_idx in MNL_utilities.keys():
exec("V_{} = {}".format(utility_idx, MNL_utilities[utility_idx]), globals())
# assign utility functions to utility indices
exec("V_dict = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("V_dict[{}] = V_{}".format(utility_idx, utility_idx), globals())
# associate the availability conditions with the alternatives
exec("av = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("av[{}] = 1".format(utility_idx), globals())
# MU_nm = Beta('MU_nm', 1, 1, 10, 0)
MU_m = Beta("MU_m", 1, 1, 10, 0)
walk = 1, [0]
cycle = 1, [1]
motorised = MU_m, [2, 3]
nests = walk, cycle, motorised
# definition of the model
logprob = lognested(V_dict, av, nests, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "LPMC"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = nested(V_dict, av, nests, 0)
prob_1 = nested(V_dict, av, nests, 1)
prob_2 = nested(V_dict, av, nests, 2)
prob_3 = nested(V_dict, av, nests, 3)
simulate = {
"Prob. 0": prob_0,
"Prob. 1": prob_1,
"Prob. 2": prob_2,
"Prob. 3": prob_3,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "LPMC_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def Optima(dataset_train, for_prob=False):
"""
Create a MNL on the OPTIMA dataset.
The model is a slightly modified version from the code that can be found here: https://github.com/JoseAngelMartinB/prediction-behavioural-analysis-ml-travel-mode-choice.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("OP", dataset_train)
globals().update(database_train.variables)
# model
MNL_beta_params_negative = [
"B_TimePT_PT",
"B_MarginalCostPT_PT",
"B_distance_km_PT",
"B_TimeCar_PM",
"B_CostCarCHF_PM",
"B_distance_km_PM",
"B_distance_km_SM",
]
MNL_beta_params_neutral = [
"ASC_PM",
"ASC_SM",
"B_age_PT",
"B_age_PM",
"B_age_SM",
"B_NbChild_PT",
"B_NbChild_PM",
"B_NbChild_SM",
"B_NbCar_PT",
"B_NbCar_PM",
"B_NbCar_SM",
"B_NbMoto_PT",
"B_NbMoto_PM",
"B_NbMoto_SM",
"B_NbBicy_PT",
"B_NbBicy_PM",
"B_NbBicy_SM",
"B_OccupStat_fulltime_PT",
"B_OccupStat_fulltime_PM",
"B_OccupStat_fulltime_SM",
"B_Gender_man_PT",
"B_Gender_man_PM",
"B_Gender_man_SM",
"B_Gender_woman_PT",
"B_Gender_woman_PM",
"B_Gender_woman_SM",
"B_Gender_unreported_PT",
"B_Gender_unreported_PM",
"B_Gender_unreported_SM",
]
MNL_utilities = {
0: "B_age_PT*age + B_NbChild_PT*NbChild + B_NbCar_PT*NbCar + B_NbMoto_PT*NbMoto + B_NbBicy_PT*NbBicy + B_OccupStat_fulltime_PT*OccupStat_fulltime + B_Gender_man_PT*Gender_man + B_Gender_woman_PT*Gender_woman + B_Gender_unreported_PT*Gender_unreported + B_TimePT_PT*TimePT + B_MarginalCostPT_PT*MarginalCostPT + B_distance_km_PT*distance_km",
1: "ASC_PM + B_age_PM*age + B_NbChild_PM*NbChild + B_NbCar_PM*NbCar + B_NbMoto_PM*NbMoto + B_NbBicy_PM*NbBicy + B_OccupStat_fulltime_PM*OccupStat_fulltime + B_Gender_man_PM*Gender_man + B_Gender_woman_PM*Gender_woman + B_Gender_unreported_PM*Gender_unreported + B_TimeCar_PM*TimeCar + B_CostCarCHF_PM*CostCarCHF + B_distance_km_PM*distance_km",
2: "ASC_SM + B_age_SM*age + B_NbChild_SM*NbChild + B_NbCar_SM*NbCar + B_NbMoto_SM*NbMoto + B_NbBicy_SM*NbBicy + B_OccupStat_fulltime_SM*OccupStat_fulltime + B_Gender_man_SM*Gender_man + B_Gender_woman_SM*Gender_woman + B_Gender_unreported_SM*Gender_unreported + B_distance_km_SM*distance_km",
}
# construct the model parameters
for beta in MNL_beta_params_negative:
exec("{} = Beta('{}', 0, None, 0, 0)".format(beta, beta), globals())
for beta in MNL_beta_params_neutral:
exec("{} = Beta('{}', 0, None, None, 0)".format(beta, beta), globals())
# define utility functions
for utility_idx in MNL_utilities.keys():
exec("V_{} = {}".format(utility_idx, MNL_utilities[utility_idx]), globals())
# assign utility functions to utility indices
exec("V_dict = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("V_dict[{}] = V_{}".format(utility_idx, utility_idx), globals())
# associate the availability conditions with the alternatives
exec("av = {}", globals())
for utility_idx in MNL_utilities.keys():
exec("av[{}] = 1".format(utility_idx), globals())
# definition of the model
logprob = loglogit(V_dict, av, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "Optima"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(V_dict, av, 0)
prob_1 = logit(V_dict, av, 1)
prob_2 = logit(V_dict, av, 2)
simulate = {"Prob. 0": prob_0, "Prob. 1": prob_1, "Prob. 2": prob_2}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "optima_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def Netherlands(df_train, for_prob=False):
database_train = db.Database("netherlands_train", df_train)
pd.options.display.float_format = "{:.3g}".format
globals().update(database_train.variables)
# Parameters to be estimated
# Arguments:
# 1 Name for report. Typically, the same as the variable
# 2 Starting value
# 3 Lower bound
# 4 Upper bound
# 5 0: estimate the parameter, 1: keep it fixed
ASC_CAR = Beta("ASC_CAR", 0, None, None, 0)
ASC_RAIL = Beta("ASC_RAIL", 0, None, None, 1)
BETA_COST_CAR = Beta("BETA_COST_CAR", 0, None, 0, 0)
BETA_COST_RAIL = Beta("BETA_COST_RAIL", 0, None, 0, 0)
# BETA_TT = Beta('BETA_TT',0,None,None,0)
BETA_TT_CAR = Beta("BETA_TT_CAR", 0, None, 0, 0)
BETA_TT_RAIL = Beta("BETA_TT_RAIL", 0, None, 0, 0)
BETA_PURPOSE = Beta("BETA_PURPOSE", 0, None, None, 1)
BETA_NPERSONS = Beta("BETA_NPERSONS", 0, None, None, 1)
BETA_AGE = Beta("BETA_AGE", 0, None, None, 1)
BETA_EMPLOY_STATUS = Beta("BETA_EMPLOY_STATUS", 0, None, None, 1)
BETA_MAINEARN = Beta("BETA_MAINEARN", 0, None, None, 1)
BETA_ARRIVAL_TIME = Beta("BETA_ARRIVAL_TIME", 0, None, None, 1)
BETA_GENDER = Beta("BETA_GENDER", 0, None, None, 1)
BETA_TRANSFERS = Beta("BETA_TRANSFERS", 0, None, None, 1)
BETA_SEAT_STATUS = Beta("BETA_SEAT_STATUS", 0, None, None, 1)
# Utilities
__Car = (
ASC_CAR + BETA_COST_CAR * car_cost_euro + BETA_TT_CAR * car_time
) # + BETA_GENDER * gender + BETA_PURPOSE * purpose + BETA_NPERSONS * npersons + BETA_AGE * age + BETA_EMPLOY_STATUS * employ_status + BETA_MAINEARN * mainearn + BETA_ARRIVAL_TIME * arrival_time
__Rail = (
ASC_RAIL + BETA_COST_RAIL * rail_cost_euro + BETA_TT_RAIL * rail_time
) # + BETA_TRANSFERS * rp_transfer + BETA_SEAT_STATUS * seat_status
__V = {0: __Car, 1: __Rail}
__av = {0: 1, 1: 1}
# The choice model is a logit, with availability conditions
logprob = loglogit(__V, __av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "binary_specific_netherlands"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(__V, __av, 0)
prob_1 = logit(__V, __av, 1)
simulate = {"Prob. 0": prob_0, "Prob. 1": prob_1}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "netherlands_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def Airplane(df_train, for_prob=False):
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("airlane_train", df_train)
pd.options.display.float_format = "{:.3g}".format
globals().update(database_train.variables)
# Parameters to be estimated
# Arguments:
# 1 Name for report. Typically, the same as the variable
# 2 Starting value
# 3 Lower bound
# 4 Upper bound
# 5 0: estimate the parameter, 1: keep it fixed
ASC_NOSTOP = Beta("ASC_NOSTOP", 0, None, None, 1)
ASC_TRANSFER = Beta("ASC_TRANSFER", 0, None, None, 0)
ASC_TRANSFER_TWOAIRLINES = Beta("ASC_TRANSFER_TWOAIRLINES", 0, None, None, 0)
BETA_FARE_NOSTOP = Beta("BETA_FARE_NOSTOP", 0, None, 0, 0)
BETA_FARE_TRANSFER = Beta("BETA_FARE_TRANSFER", 0, None, 0, 0)
BETA_FARE_TRANSFER_TWOAIRLINES = Beta(
"BETA_FARE_TRANSFER_TWOAIRLINES", 0, None, 0, 0
)
# BETA_TTDIFF_NOSTOP = Beta('BETA_TTDIFF_NOSTOP',0,None,None,1)
BETA_TTDIFF_TRANSFER = Beta("BETA_TTDIFF_TRANSFER", 0, None, 0, 0)
BETA_TTDIFF_TRANSFER_TWOAIRLINES = Beta(
"BETA_TTDIFF_TRANSFER_TWOAIRLINES", 0, None, 0, 0
)
BETA_DEP_NOSTOP = Beta("BETA_DEP_NOSTOP", 0, None, None, 1)
BETA_DEP_TRANSFER = Beta("BETA_DEP_TRANSFER", 0, None, None, 1)
BETA_DEP_TRANSFER_TWOAIRLINES = Beta(
"BETA_DEP_TRANSFER_TWOAIRLINES", 0, None, None, 1
)
BETA_ARR_NOSTOP = Beta("BETA_ARR_NOSTOP", 0, None, None, 1)
BETA_ARR_TRANSFER = Beta("BETA_ARR_TRANSFER", 0, None, None, 1)
BETA_ARR_TRANSFER_TWOAIRLINES = Beta(
"BETA_ARR_TRANSFER_TWOAIRLINES", 0, None, None, 1
)
BETA_LEG_NOSTOP = Beta("BETA_LEG_NOSTOP", 0, None, None, 0)
BETA_LEG_TRANSFER = Beta("BETA_LEG_TRANSFER", 0, None, None, 0)
BETA_LEG_TRANSFER_TWOAIRLINES = Beta(
"BETA_LEG_TRANSFER_TWOAIRLINES", 0, None, None, 0
)
# Utilities
V_NOSTOP = (
ASC_NOSTOP
+ BETA_FARE_NOSTOP * Fare_1_scaled
+ BETA_LEG_NOSTOP * Legroom_1
+ BETA_DEP_NOSTOP * DepartureTimeHours_1
) # + BETA_ARR_NOSTOP * ArrivalTimeHours_1
V_TRANSFER = (
ASC_TRANSFER
+ BETA_FARE_TRANSFER * Fare_2_scaled
+ BETA_TTDIFF_TRANSFER * TTDIFF_TRANSFER
+ BETA_LEG_TRANSFER * Legroom_2
+ BETA_DEP_TRANSFER * DepartureTimeHours_2
) # + BETA_ARR_TRANSFER * ArrivalTimeHours_2
V_TRANSFER_TWOAIRLINES = (
ASC_TRANSFER_TWOAIRLINES
+ BETA_FARE_TRANSFER_TWOAIRLINES * Fare_3_scaled
+ BETA_TTDIFF_TRANSFER_TWOAIRLINES * TTDIFF_TRANSFER_TWOAIRLINES
+ BETA_LEG_TRANSFER_TWOAIRLINES * Legroom_3
+ BETA_DEP_TRANSFER_TWOAIRLINES * DepartureTimeHours_3
) # + BETA_ARR_TRANSFER_TWOAIRLINES * ArrivalTimeHours_3
__V = {0: V_NOSTOP, 1: V_TRANSFER, 2: V_TRANSFER_TWOAIRLINES}
__av = {0: 1, 1: 1, 2: 1}
# The choice model is a logit, with availability conditions
logprob = loglogit(__V, __av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "MNL_Airplane"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(__V, __av, 0)
prob_1 = logit(__V, __av, 1)
prob_2 = logit(__V, __av, 2)
simulate = {"Prob. 0": prob_0, "Prob. 1": prob_1, "Prob. 2": prob_2}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "airplane_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def Telephone(df_train, for_prob=False):
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("telephone_train", df_train)
pd.options.display.float_format = "{:.3g}".format
globals().update(database_train.variables)
# Parameters to be estimated
# Arguments:
# 1 Name for report. Typically, the same as the variable
# 2 Starting value
# 3 Lower bound
# 4 Upper bound
# 5 0: estimate the parameter, 1: keep it fixed
ASC_budg_meas = Beta("ASC_budg_meas", 0, None, None, 0)
ASC_stand_meas = Beta("ASC_stand_meas", 0, None, None, 0)
ASC_loc_flat = Beta("ASC_loc_flat", 0, None, None, 0)
ASC_ext_flat = Beta("ASC_ext_flat", 0, None, None, 0)
ASC_metro_flat = Beta("ASC_metro_flat", 0, None, None, 0)
BETA_employ_budg_meas = Beta("BETA_employ_budg_meas", 0, None, None, 0)
BETA_employ_stand_meas = Beta("BETA_employ_stand_meas", 0, None, None, 0)
BETA_employ_loc_flat = Beta("BETA_employ_loc_flat", 0, None, None, 0)
BETA_employ_ext_flat = Beta("BETA_employ_ext_flat", 0, None, None, 0)
BETA_employ_metro_flat = Beta("BETA_employ_metro_flat", 0, None, None, 0)
BETA_users_budg_meas = Beta("BETA_users_budg_meas", 0, None, None, 0)
BETA_users_stand_meas = Beta("BETA_users_stand_meas", 0, None, None, 0)
BETA_users_loc_flat = Beta("BETA_users_loc_flat", 0, None, None, 0)
BETA_users_ext_flat = Beta("BETA_users_ext_flat", 0, None, None, 0)
BETA_users_metro_flat = Beta("BETA_users_metro_flat", 0, None, None, 0)
# BETA_cost_budg_meas = Beta('BETA_cost_budg_meas',0,None,0,0)
# BETA_cost_stand_meas = Beta('BETA_cost_stand_meas',0,None,0,0)
# BETA_cost_loc_flat = Beta('BETA_cost_loc_flat',0,None,0,0)
# BETA_cost_ext_flat = Beta('BETA_cost_ext_flat',0,None,0,0)
# BETA_cost_metro_flat = Beta('BETA_cost_metro_flat',0,None,0,0)
BETA_cost = Beta("BETA_cost", 0, None, None, 0)
# Utilities
V_budg_meas = (
ASC_budg_meas + BETA_cost * cost1_scaled
) # + BETA_users_budg_meas * users + BETA_employ_budg_meas * employ #+ BETA_users_budg_meas * users + BETA_cost_budg_meas * cost1_scaled
V_stand_meas = (
ASC_stand_meas + BETA_cost * cost2_scaled
) # + BETA_users_stand_meas * users + BETA_employ_stand_meas * employ #+ BETA_users_stand_meas * users + BETA_cost_stand_meas * cost2_scaled
V_loc_flat = (
ASC_loc_flat + BETA_cost * cost3_scaled + BETA_users_loc_flat * users
) # + BETA_employ_loc_flat * employ #+ BETA_users_loc_flat * users + BETA_cost_loc_flat * cost3_scaled
V_ext_flat = (
ASC_ext_flat + BETA_cost * cost4_scaled + BETA_users_ext_flat * users
) # + BETA_employ_ext_flat * employ #+ BETA_users_ext_flat * users + BETA_cost_ext_flat * cost4_scaled
V_metro_flat = (
ASC_metro_flat + BETA_cost * cost5_scaled
) # + BETA_users_metro_flat * users + BETA_employ_metro_flat * employ #+ BETA_users_metro_flat * users + BETA_cost_metro_flat * cost5_scaled
__V = {
0: V_budg_meas,
1: V_stand_meas,
2: V_loc_flat,
3: V_ext_flat,
4: V_metro_flat,
}
__av = {0: 1, 1: 1, 2: 1, 3: 1, 4: 1}
# The choice model is a logit, with availability conditions
logprob = loglogit(__V, __av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "MNL_Telephone"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(__V, __av, 0)
prob_1 = logit(__V, __av, 1)
prob_2 = logit(__V, __av, 2)
prob_3 = logit(__V, __av, 3)
prob_4 = logit(__V, __av, 4)
simulate = {
"Prob. 0": prob_0,
"Prob. 1": prob_1,
"Prob. 2": prob_2,
"Prob. 3": prob_3,
"Prob. 4": prob_4,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "telephone_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def Parking(df_train, for_prob=False):
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("parking_train", df_train)
pd.options.display.float_format = "{:.3g}".format
globals().update(database_train.variables)
# Parameters to be estimated
# Arguments:
# 1 Name for report. Typically, the same as the variable
# 2 Starting value
# 3 Lower bound
# 4 Upper bound
# 5 0: estimate the parameter, 1: keep it fixed
ASC_FSP = Beta("ASC_FSP", 0, None, None, 1)
ASC_PSP = Beta("ASC_PSP", 0, None, None, 0)
ASC_PUP = Beta("ASC_PUP", 0, None, None, 0)
BETA_AT_FSP = Beta("BETA_AT_FSP", 0, None, 0, 0)
BETA_AT_PSP = Beta("BETA_AT_PSP", 0, None, 0, 0)
BETA_AT_PUP = Beta("BETA_AT_PUP", 0, None, 0, 0)
BETA_TD = Beta("BETA_TD", 0, None, 0, 0)
# BETA_TD_FSP = Beta('BETA_TD_FSP',0,None,None,0)
# BETA_TD_PSP = Beta('BETA_TD_PSP',0,None,None,0)
# BETA_TD_PUP = Beta('BETA_TD_PUP',0,None,None,0)
BETA_FEE_FSP = Beta("BETA_FEE_FSP", 0, None, 0, 1)
BETA_FEE_PSP = Beta("BETA_FEE_PSP", 0, None, 0, 0)
BETA_FEE_PUP = Beta("BETA_FEE_PUP", 0, None, 0, 0)
BETA_GENDER_FSP = Beta("BETA_GENDER_FSP", 0, None, None, 1)
BETA_GENDER_PSP = Beta("BETA_GENDER_PSP", 0, None, None, 1)
BETA_GENDER_PUP = Beta("BETA_GENDER_PUP", 0, None, None, 1)
BETA_INCH_FSP = Beta("BETA_INCH_FSP", 0, None, None, 1)
BETA_INCH_PSP = Beta("BETA_INCH_PSP", 0, None, None, 0)
BETA_INCH_PUP = Beta("BETA_INCH_PUP", 0, None, None, 0)
# Utilities
V_FSP = (
ASC_FSP
+ BETA_AT_FSP * AT1
+ BETA_TD * TD1
+ BETA_FEE_FSP * FEE1
+ BETA_INCH_FSP * INCH
+ BETA_GENDER_FSP * GENDER
)
V_PSP = (
ASC_PSP
+ BETA_AT_PSP * AT2
+ BETA_TD * TD2
+ BETA_FEE_PSP * FEE2
+ BETA_INCH_PSP * INCH
+ BETA_GENDER_PSP * GENDER
)
V_PUP = (
ASC_PUP
+ BETA_AT_PUP * AT3
+ BETA_TD * TD3
+ BETA_FEE_PUP * FEE3
+ BETA_INCH_PUP * INCH
+ BETA_GENDER_PUP * GENDER
)
__V = {0: V_FSP, 1: V_PSP, 2: V_PUP}
__av = {0: 1, 1: 1, 2: 1}
# The choice model is a logit, with availability conditions
logprob = loglogit(__V, __av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "MNL_Parking"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_0 = logit(__V, __av, 0)
prob_1 = logit(__V, __av, 1)
prob_2 = logit(__V, __av, 2)
simulate = {"Prob. 0": prob_0, "Prob. 1": prob_1, "Prob. 2": prob_2}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "parking_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def Vaccines(dataset_train: pd.DataFrame, for_prob=False):
"""
Create a MNL on the Vaccine dataset.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database_train = db.Database("vaccine_train", dataset_train)
globals().update(database_train.variables)
# parameters to be estimated
ASC_V1 = Beta("ASC_V1", 0, None, None, 1)
ASC_V2 = Beta("ASC_V2", 0, None, None, 0)
# optout alternative
ASC_OPTOUT = Beta("ASC_OPTOUT", 0, None, None, 0)
ASC_MALE = Beta("ASC_MALE", 0, None, None, 0)
ASC_BBOLD = Beta("ASC_BBOLD", 0, None, None, 0)
ASC_MIL = Beta("ASC_MIL", 0, None, None, 0)
ASC_GENX = Beta("ASC_GENX", 0, None, None, 0)
ASC_BMI = Beta("ASC_BMI", 0, None, None, 0)
ASC_FUL = Beta("ASC_FUL", 0, None, None, 0)
ASC_OHH = Beta("ASC_OHH", 0, None, None, 0)
ASC_CHH = Beta("ASC_CHH", 0, None, None, 0)
ASC_NIN = Beta("ASC_NIN", 0, None, None, 0)
ASC_TES = Beta("ASC_TES", 0, None, None, 0)
ASC_VCO = Beta("ASC_VCO", 0, None, None, 0)
ASC_REP = Beta("ASC_REP", 0, None, None, 0)
ASC_ASI = Beta("ASC_ASI", 0, None, None, 0)
ASC_HIS = Beta("ASC_HIS", 0, None, None, 0)
ASC_AGE = Beta("ASC_AGE", 0, None, None, 0)
ASC_BSC = Beta("ASC_BSC", 0, None, None, 0)
ASC_PGDT = Beta("ASC_PGDT", 0, None, None, 0)
ASC_HHINC = Beta("ASC_HHINC", 0, None, None, 0)
ASC_BLACKAFRAMERICAN = Beta("ASC_BLACKAFRAMERICAN", 0, None, None, 0)
ASC_DEMOCRAT = Beta("ASC_DEMOCRAT", 0, None, None, 0)
ASC_COVID = Beta("ASC_COVID", 0, None, None, 0)
ASC_FLUSHOT = Beta("ASC_FLUSHOT", 0, None, None, 0)
ASC_CONDITIONS = Beta("ASC_CONDITIONS", 0, None, None, 0)
# vaccines parameters
B_COST = Beta("B_COST", 0, None, 0, 0)
B_EFFECTIVE = Beta("B_EFFECTIVE", 0, 0, None, 0)
B_PROTECT = Beta("B_PROTECT", 0, 0, None, 0)
B_INCUB = Beta("B_INCUB", 0, None, 0, 0)
B_SEVERESIDE = Beta("B_SEVERESIDE", 0, None, 0, 0)
B_MILDSIDE_1 = Beta("B_MILDSIDE_1", 0, None, 0, 0)
B_MILDSIDE_3 = Beta("B_MILDSIDE_3", 0, None, 0, 0)
B_DOSE_1 = Beta("B_DOSE_1", 0, None, 0, 0)
B_DOSE_3 = Beta("B_DOSE_3", 0, None, 0, 0)
B_USA = Beta("B_USA", 0, None, None, 0)
B_BOOST = Beta("B_BOOST", 0, None, 0, 0)
B_CHI = Beta("B_CHI", 0, None, None, 0)
# utilities
# V_V1 = ASC_V1 + B_COST * cost1 + B_EFFECTIVE * effectiveness1 + B_PROTECT * protection1 + B_INCUB * incubation1 + B_SEVERESIDE * severe1 + B_MILDSIDE * mild1 + B_DOSE * doses1 + B_USA * USA1
# V_OPTOUT = ASC_OPTOUT + ASC_MALE * Male + ASC_BLACKAFRAMERICAN * Black + ASC_BSC * BSc + ASC_PGDT * PostGrad + ASC_HHINC * HHInc10K + ASC_BBOLD * babyboomolder + ASC_DEMOCRAT * Democrat + ASC_COVID * covidpos + ASC_FLUSHOT * FluShot + ASC_CONDITIONS * Underlying
# V_V2 = ASC_V2 + B_COST * cost3 + B_EFFECTIVE * effectiveness3 + B_PROTECT * protection3 + B_INCUB * incubation3 + B_SEVERESIDE * severe3 + B_MILDSIDE * mild3 + B_DOSE * doses3 + B_USA * USA3
# utilities
V_V1 = (
ASC_V1
+ B_COST * cost1
+ B_EFFECTIVE * effectiveness1
+ B_PROTECT * protection1
+ B_INCUB * incubation1
+ B_SEVERESIDE * severe1
+ B_USA * USA1
) # + B_MILDSIDE_1 * mild1 #+ B_DOSE_1 * doses1#+ ASC_AGE * Age + ASC_BMI * BMI #+ ASC_MALE * Male + ASC_BLACKAFRAMERICAN * Black + ASC_BSC * BSc + ASC_PGDT * PostGrad + ASC_HHINC * HHInc10K + ASC_BBOLD * babyboomolder + ASC_DEMOCRAT * Democrat + ASC_COVID * covidpos + ASC_FLUSHOT * FluShot + ASC_CONDITIONS * Underlying + ASC_MIL * millenial + ASC_GENX * genX + ASC_BMI * BMI + ASC_FUL * FullTime + ASC_OHH * olderinHH + ASC_CHH * chilinHH + ASC_TES * Tested + ASC_HIS * Hispanic + ASC_AGE * Age + ASC_ASI * Asian + ASC_NIN * noIns + ASC_VCO * VeryConservative + ASC_REP * Republican + B_BOOST * booster1 + B_CHI * China1 #+ B_UK * UK1 + B_GER * Germany1 + B_RUS * Russia1
V_OPTOUT = (
ASC_OPTOUT
+ ASC_MALE * Male
+ ASC_BLACKAFRAMERICAN * Black
+ ASC_BSC * BSc
+ ASC_PGDT * PostGrad
+ ASC_HHINC * HHInc10K
+ ASC_BBOLD * babyboomolder
+ ASC_DEMOCRAT * Democrat
+ ASC_FLUSHOT * FluShot
+ ASC_CONDITIONS * Underlying
) # + ASC_MIL * millenial + ASC_GENX * genX + ASC_OHH * olderinHH + ASC_CHH * chilinHH + ASC_TES * Tested + ASC_AGE * Age + ASC_VCO * VeryConservative #+ ASC_REP * Republican + ASC_NIN * noIns + ASC_HIS * Hispanic + ASC_ASI * Asian + ASC_FUL * FullTime + ASC_BMI * BMI + ASC_COVID * covidpos
V_V2 = (
ASC_V2
+ B_COST * cost3
+ B_EFFECTIVE * effectiveness3
+ B_PROTECT * protection3
+ B_INCUB * incubation3
+ B_SEVERESIDE * severe3
+ B_USA * USA3
) # + B_MILDSIDE_3 * mild3 #+ B_DOSE_3 * doses3#+ ASC_AGE * Age + ASC_BMI * BMI #+ ASC_MALE * Male + ASC_BLACKAFRAMERICAN * Black + ASC_BSC * BSc + ASC_PGDT * PostGrad + ASC_HHINC * HHInc10K + ASC_BBOLD * babyboomolder + ASC_DEMOCRAT * Democrat + ASC_COVID * covidpos + ASC_FLUSHOT * FluShot + ASC_CONDITIONS * Underlying + ASC_MIL * millenial + ASC_GENX * genX + ASC_BMI * BMI + ASC_FUL * FullTime + ASC_OHH * olderinHH + ASC_CHH * chilinHH + ASC_TES * Tested + ASC_HIS * Hispanic + ASC_AGE * Age + ASC_ASI * Asian + ASC_NIN * noIns + ASC_VCO * VeryConservative + ASC_REP * Republican + B_BOOST * booster3 + B_CHI * China3 #+ B_UK * UK3 + B_GER * Germany3 + B_RUS * Russia3
V = {0: V_V1, 1: V_OPTOUT, 2: V_V2}
av = {0: 1, 1: 1, 2: 1}
# choice model
logprob = loglogit(V, av, choice)
biogeme = bio.BIOGEME(database_train, logprob)
biogeme.modelName = "VaccineMNL"
biogeme.generate_html = False
biogeme.generate_pickle = False
if for_prob:
prob_V1 = logit(V, av, 0)
prob_OPTOUT = logit(V, av, 1)
prob_V2 = logit(V, av, 2)
simulate = {
"Prob. V1": prob_V1,
"Prob. OPTOUT": prob_OPTOUT,
"Prob. V2": prob_V2,
}
biosim = bio.BIOGEME(database_train, simulate)
biosim.modelName = "vaccine_logit_test"
biosim.generate_html = False
biosim.generate_pickle = False
return biosim
return biogeme
[docs]
def MTMC_lausanne_MNL(dataset_train: pd.DataFrame, for_prob=False, results=None):
"""
Estimation of a MNL model.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
for_prob : bool, optional
If True, the function returns a BIOGEME object for probability calculation.
results : bio.BIOGEME, optional (default=None)
The biogeme model estimated.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database = db.Database("mtmc_train", dataset_train)
globals().update(database.variables)
alt = 88
ASC_c = Beta("ASC_c", 0, None, None, 0)
ASC_pt = Beta("ASC_pt", 0, None, None, 0)
ASC_act = Beta("ASC_act", 0, None, None, 1)
# car specific
B_TIME_c = Beta("B_TIME_c", 0, None, None, 0)
# pt specific
B_TIME_pt = Beta("B_TIME_pt", 0, None, None, 0)
# soft modes specific
B_TIME_act = Beta("B_TIME_act", 0, None, None, 0)
# activity specific
B_JobD_WORK = Beta("B_JobD_WORK", 0, None, None, 0)
B_PopD_EDUC = Beta("B_PopD_EDUC", 0, None, None, 0)
B_PopD_LEIS = Beta("B_PopD_LEIS", 0, None, None, 0)
B_JobD_PopD_SHOP = Beta("B_JobD_PopD_SHOP", 0, None, None, 0)
B_PopD_ESC = Beta("B_PopD_ESC", 0, None, None, 0)
B_PopD_ERR = Beta("B_PopD_ERR", 0, None, None, 0)
# utilities
V_CAR = [
ASC_c
+ B_TIME_c * globals()["CAR_TT_" + str(i + 6334)]
+ work * B_JobD_WORK * globals()["job_density_" + str(i)]
+ education * B_PopD_EDUC * globals()["pop_density_" + str(i)]
+ leisure * B_PopD_LEIS * (globals()["pop_density_" + str(i)])
+ shopping
* B_JobD_PopD_SHOP
* (globals()["pop_density_" + str(i)] + globals()["job_density_" + str(i)])
+ escort * B_PopD_ESC * globals()["pop_density_" + str(i)]
+ errands * B_PopD_ERR * globals()["pop_density_" + str(i)]
for i in range(0, alt)
]
V_PT = [
ASC_pt
+ B_TIME_pt * globals()["PT_TT_" + str(i + 6334)]
+ work * B_JobD_WORK * globals()["job_density_" + str(i)]
+ education * B_PopD_EDUC * globals()["pop_density_" + str(i)]
+ leisure * B_PopD_LEIS * (globals()["pop_density_" + str(i)])
+ shopping
* B_JobD_PopD_SHOP
* (globals()["pop_density_" + str(i)] + globals()["job_density_" + str(i)])
+ escort * B_PopD_ESC * globals()["pop_density_" + str(i)]
+ errands * B_PopD_ERR * globals()["pop_density_" + str(i)]
for i in range(0, alt)
]
V_ACT = [
ASC_act
+ B_TIME_act * globals()["ACT_TT_" + str(i + 6334)]
+ work * B_JobD_WORK * globals()["job_density_" + str(i)]
+ education * B_PopD_EDUC * globals()["pop_density_" + str(i)]
+ leisure * B_PopD_LEIS * (globals()["pop_density_" + str(i)])
+ shopping
* B_JobD_PopD_SHOP
* (globals()["pop_density_" + str(i)] + globals()["job_density_" + str(i)])
+ escort * B_PopD_ESC * globals()["pop_density_" + str(i)]
+ errands * B_PopD_ERR * globals()["pop_density_" + str(i)]
for i in range(0, alt)
]
# assignment of utility function to alternatives
V_car = {i: V_CAR[i] for i in range(0, alt)}
V_pt = {i + alt: V_PT[i] for i in range(0, alt)}
V_act = {i + 2 * alt: V_ACT[i] for i in range(0, alt)}
# combining different modes together
V = {**V_car, **V_pt, **V_act}
# define alternatives availability -> here everything is available
avail = {i: 1 for i in range(0, alt * 3)}
# for predicting
# if for_prob:
# simulate ={'Prob. '+str(i):logit(V, None, i) for i in range(0, 3*alt)}
# biosim = bio.BIOGEME(database, simulate)
# biosim.modelName = "MTMC_Lausanne_MNL_test"
# biosim.generate_html = False
# biosim.generate_pickle = False
# return biosim
if for_prob:
logprob = logit(V, avail, choice)
simulated_choices = logprob.getValue_c(
betas=results.getBetaValues(), database=database, prepareIds=True
)
return simulated_choices
# define model
logprob = loglogit(V, avail, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database, logprob)
biogeme.modelName = "MTMC_Lausanne_MNL"
return biogeme
[docs]
def MTMC_lausanne_CNL(dataset_train: pd.DataFrame, for_prob=False, results=None):
"""
Estimation of a CNL model.
Parameters
----------
dataset_train : pandas DataFrame
The training dataset.
for_prob : bool, optional
If True, the function returns a BIOGEME object for probability calculation.
results : bio.BIOGEME, optional (default=None)
The biogeme model estimated.
Returns
-------
biogeme : bio.BIOGEME
The BIOGEME object containing the model.
"""
if not biogeme_installed:
raise ImportError(
"Biogeme is not installed and required to load DCMs. Please install it with `pip install biogeme` to use this function."
)
database = db.Database("mtmc_train", dataset_train)
globals().update(database.variables)
alt = 88
# defining groups of destinations for the cross-nested logit model
west_loz = list(range(0, 25))
east_loz = [27, 30, 46, 50, 54] + list(range(68, 88))
city_center = [i for i in range(0, 88) if i not in west_loz if i not in east_loz]
ASC_c = Beta("ASC_c", 0, None, None, 0)
ASC_pt = Beta("ASC_pt", 0, None, None, 0)
ASC_act = Beta("ASC_act", 0, None, None, 1)
# nest parameter
MU_CAR = Beta("MU_CAR", 1, 1, 10, 0)
MU_PT = Beta("MU_PT", 1, 1, 10, 0)
MU_ACT = Beta("MU_ACT", 1, 1, 10, 1)
MU_WEST = Beta("MU_WEST", 1, 1, 10, 0)
MU_CENTER = Beta("MU_CENTER", 1, 1, 10, 0)
MU_EAST = Beta("MU_EAST", 1, 1, 10, 0)
# car specific
B_TIME_c = Beta("B_TIME_c", 0, None, None, 0)
# pt specific
B_TIME_pt = Beta("B_TIME_pt", 0, None, None, 0)
# soft modes specific
B_TIME_act = Beta("B_TIME_act", 0, None, None, 0)
# activity specific
B_JobD_WORK = Beta("B_JobD_WORK", 0, None, None, 0)
B_PopD_EDUC = Beta("B_PopD_EDUC", 0, None, None, 0)
B_PopD_LEIS = Beta("B_PopD_LEIS", 0, None, None, 0)
B_JobD_PopD_SHOP = Beta("B_JobD_PopD_SHOP", 0, None, None, 0)
B_PopD_ESC = Beta("B_PopD_ESC", 0, None, None, 0)
B_PopD_ERR = Beta("B_PopD_ERR", 0, None, None, 0)
# utilities
V_CAR = [
ASC_c
+ B_TIME_c * globals()["CAR_TT_" + str(i + 6334)]
+ work * B_JobD_WORK * globals()["job_density_" + str(i)]
+ education * B_PopD_EDUC * globals()["pop_density_" + str(i)]
+ leisure * B_PopD_LEIS * (globals()["pop_density_" + str(i)])
+ shopping
* B_JobD_PopD_SHOP
* (globals()["pop_density_" + str(i)] + globals()["job_density_" + str(i)])
+ escort * B_PopD_ESC * globals()["pop_density_" + str(i)]
+ errands * B_PopD_ERR * globals()["pop_density_" + str(i)]
for i in range(0, alt)
]
V_PT = [
ASC_pt
+ B_TIME_pt * globals()["PT_TT_" + str(i + 6334)]
+ work * B_JobD_WORK * globals()["job_density_" + str(i)]
+ education * B_PopD_EDUC * globals()["pop_density_" + str(i)]
+ leisure * B_PopD_LEIS * (globals()["pop_density_" + str(i)])
+ shopping
* B_JobD_PopD_SHOP
* (globals()["pop_density_" + str(i)] + globals()["job_density_" + str(i)])
+ escort * B_PopD_ESC * globals()["pop_density_" + str(i)]
+ errands * B_PopD_ERR * globals()["pop_density_" + str(i)]
for i in range(0, alt)
]
V_ACT = [
ASC_act
+ B_TIME_act * globals()["ACT_TT_" + str(i + 6334)]
+ work * B_JobD_WORK * globals()["job_density_" + str(i)]
+ education * B_PopD_EDUC * globals()["pop_density_" + str(i)]
+ leisure * B_PopD_LEIS * (globals()["pop_density_" + str(i)])
+ shopping
* B_JobD_PopD_SHOP
* (globals()["pop_density_" + str(i)] + globals()["job_density_" + str(i)])
+ escort * B_PopD_ESC * globals()["pop_density_" + str(i)]
+ errands * B_PopD_ERR * globals()["pop_density_" + str(i)]
for i in range(0, alt)
]
# assignment of utility function to alternatives
V_car = {i: V_CAR[i] for i in range(0, alt)}
V_pt = {i + alt: V_PT[i] for i in range(0, alt)}
V_act = {i + 2 * alt: V_ACT[i] for i in range(0, alt)}
# combining different modes together
V = {**V_car, **V_pt, **V_act}
# define alternatives availability -> here everything is available
avail = {i: 1 for i in range(0, alt * 3)}
# define which alternatives belong to which nest
ALPHA_CAR = {i: 0.5 if i < alt else 0.0 for i in range(0, 3 * alt)}
ALPHA_PT = {i: 0.5 if i >= alt and i < 2 * alt else 0.0 for i in range(0, 3 * alt)}
ALPHA_ACT = {i: 0.5 if i >= 2 * alt else 0.0 for i in range(0, 3 * alt)}
# using modulo to get zones for all 3 modes belonging to each groups
ALPHA_WEST = {i: 0.5 if i % alt in west_loz else 0.0 for i in range(0, 3 * alt)}
ALPHA_CENTER = {
i: 0.5 if i % alt in city_center else 0.0 for i in range(0, 3 * alt)
}
ALPHA_EAST = {i: 0.5 if i % alt in east_loz else 0.0 for i in range(0, 3 * alt)}
# nest definition
nest_car = MU_CAR, ALPHA_CAR
nest_pt = MU_PT, ALPHA_PT
nest_act = MU_ACT, ALPHA_ACT
nest_west = MU_WEST, ALPHA_WEST
nest_center = MU_CENTER, ALPHA_CENTER
nest_east = MU_EAST, ALPHA_EAST
nests = nest_car, nest_pt, nest_act, nest_west, nest_center, nest_east
# for predicting
# if for_prob:
# simulate ={'Prob. '+str(i):cnl_avail(V, avail, i) for i in range(0, 3*alt)}
# biosim = bio.BIOGEME(database, simulate)
# biosim.modelName = "MTMC_Lausanne_CNL_test"
# biosim.generate_html = False
# biosim.generate_pickle = False
# return biosim
if for_prob:
logprob = cnl_avail(V, None, nests, choice)
simulated_choices = logprob.getValue_c(
betas=results.getBetaValues(), database=database, prepareIds=True
)
return simulated_choices
# define model
logprob = logcnl_avail(V, avail, nests, choice)
# create the Biogeme object
biogeme = bio.BIOGEME(database, logprob)
biogeme.modelName = "MTMC_Lausanne_CNL"
return biogeme