from _api_doc_utils import *MultinomialLogit
Multiclass logistic regression
1 Where it fits
Group: Regression
MultinomialLogit generalizes binary logit to \(K\) classes with softmax probabilities:
\[ \Pr(Y_i=k\mid X_i=x_i)=\frac{\exp(\alpha_k+x_i'\beta_k)}{\sum_\ell \exp(\alpha_\ell+x_i'\beta_\ell)}. \]
The summary identifies the last sorted class as reference_class and reports identifiable class-versus-reference coefficient contrasts. Fisher-information standard errors are available only for alpha=0.
2 Python API
Constructor: cm.MultinomialLogit
Use integer class labels in fit(x, y_int32). predict(x) returns class labels. summary() returns contrast rows aligned with class_labels; penalized fits mark inference unavailable and omit se/vcov.
print(inspect.signature(cm.MultinomialLogit))(alpha=0.0, max_iterations=100, gradient_tolerance=0.0001)
cls = cm.MultinomialLogit
display(HTML(html_table(["Public method"], public_methods(cls))))| Public method |
|---|
bootstrap(self, /, n_bootstrap, seed=None) |
fit(self, /, x, y) |
predict(self, /, x) |
predict_label(self, /, x) |
predict_lin(self, /, x) |
summary(self, /) |
3 Minimal example
rng = np.random.default_rng(6)
x = rng.normal(size=(240, 2))
logits = x @ np.array([[0.6, -0.3], [-0.4, 0.5], [0.2, 0.2]]).T + np.array([0.1, -0.2, 0.0])
p = np.exp(logits - logits.max(axis=1, keepdims=True))
p = p / p.sum(axis=1, keepdims=True)
y = np.array([rng.choice(3, p=row) for row in p], dtype=np.int32)
model = cm.MultinomialLogit(max_iterations=200)
model.fit(x, y)
print(model.summary()['coef'])
print(model.predict(x[:5]))[[ 0.25831465 0.53237638 -0.55020945]
[-0.15395855 -0.36374717 0.31279086]]
[[0.29713333 0.35470927 0.3481574 ]
[0.10437553 0.60469433 0.29093014]
[0.35652526 0.30570265 0.33777209]
[0.27898794 0.37429093 0.34672113]
[0.36790269 0.30230945 0.32978787]]
4 summary() contract
The table below is generated by fitting the live class in this repository and then inspecting summary(). Shapes are shown because most values are plain NumPy arrays or scalars.
rng = np.random.default_rng(106)
x = rng.normal(size=(100, 2))
logits = x @ np.array([[0.6, -0.3], [-0.4, 0.5], [0.2, 0.2]]).T
p = np.exp(logits - logits.max(1, keepdims=True))
p = p / p.sum(1, keepdims=True)
y = np.array([rng.choice(3, p=row) for row in p], dtype=np.int32)
model = cm.MultinomialLogit(max_iterations=200)
model.fit(x, y)
summary = model.summary()
display(HTML(html_table(["summary() key", "shape"], summary_shape_rows(summary))))| summary() key | shape |
|---|---|
coef |
(2, 3) |
class_labels |
(2,) |
reference_class |
() |
penalty |
() |
inference_available |
() |
se |
(2, 3) |
vcov |
(6, 6) |