In order to test this I ran both models, one with all betas ~N(0,1) and one with the approach you just proposed, implemented as below:
vars_to_set = ["http-backdoor", "invoke-ssidexfil", "add-regbackdoor",
"powershellscript"]
X1_train = X_train.drop(columns=vars_to_set)
X2_train = X_train[vars_to_set]
X1_test = X_test.drop(columns=vars_to_set) # all - vars_to_set
X2_test = X_test[vars_to_set] # vars_to_set
coords = {"normal_pred":X1.columns, "bad_pred":X2.columns}
with pm.Model(coords=coords) as model_2:
X1 = pm.MutableData('X1', X1_train)
X2 = pm.MutableData('X2', X2_train)
y = pm.MutableData('y', y_train)
constant = pm.Normal('constant', mu=-0.5, sigma=0.1)
beta_normal = pm.Normal('beta_normal', mu=0, sigma=1, dims='normal_pred')
beta_bad = pm.Normal('beta_bad', mu=0, sigma=1, dims='bad_pred')
score = pm.Deterministic('score', X1 @ beta_normal + X2 @ beta_bad)
noisy_score = pm.Normal('noisy_score', mu=score, sigma=5)
p = pm.Deterministic('p', pm.math.sigmoid(constant + noisy_score))
# define likelihood
observed = pm.Bernoulli('obs', p, observed=y)
step = pm.NUTS()
idata = pm.sample(step=step)
idata_prior = pm.sample_prior_predictive(samples=50)
with model_2:
pm.set_data({'X1':X1_test,'X2':X2_test, 'y':np.zeros_like(y_test)})
y_pred = pm.sample_posterior_predictive(idata)
idata2 = idata.copy()
idata_prior2 = idata_prior.copy()
The difference that I got in the probabilities of my 79 test samples range from [-0.03, 0.02] which I guess is what you expected.
Thanks for your help! ![]()