import numpy as np
from pprint import pprint
from crabbymetrics import Logit
np.set_printoptions(precision=4, suppress=True)Logit Example
This page mirrors examples/logit_example.py.
1 Fit A Binary Logit Model
rng = np.random.default_rng(2)
n = 800
k = 4
beta = np.array([1.2, -0.8, 0.4, -1.1])
intercept = 0.3
x = rng.normal(size=(n, k))
logits = intercept + x @ beta
probs = 1.0 / (1.0 + np.exp(-logits))
y = rng.binomial(1, probs).astype(np.int32)
model = Logit(alpha=1.0, max_iterations=200)
model.fit(x, y)
print("true intercept:", intercept)
print("true coef:", beta)
pprint(model.summary())true intercept: 0.3
true coef: [ 1.2 -0.8 0.4 -1.1]
{'coef': array([ 1.1245, -0.785 , 0.4493, -1.1894]),
'coef_se': None,
'converged': True,
'inference_available': False,
'intercept': 0.2866745643642198,
'intercept_se': None,
'iterations': 10,
'objective': 377.0085941645407,
'penalty': 1.0,
'termination_reason': 'Solver converged',
'vcov': None}
2 Prediction surfaces
predict_lin() returns the latent index \(x_i'\hat\beta + \hat\alpha\). predict() applies the inverse-logit link to return fitted probabilities. predict_label() thresholds those probabilities into class labels.
check = x[:8]
out = {
"eta": model.predict_lin(check),
"probability": model.predict(check),
"label@0.50": model.predict_label(check),
"label@0.35": model.predict_label(check, cutoff=0.35),
}
pprint(out){'eta': array([ 3.628 , 0.3457, 1.8463, 0.8611, 2.4948, 0.7456, 1.4082,
-0.2518]),
'label@0.35': array([1, 1, 1, 1, 1, 1, 1, 1], dtype=int32),
'label@0.50': array([1, 1, 1, 1, 1, 1, 1, 0], dtype=int32),
'probability': array([0.9741, 0.5856, 0.8637, 0.7029, 0.9238, 0.6782, 0.8035, 0.4374])}