How to set different priors to different features?

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! :slight_smile:

1 Like