Regularized GLMs

web.stanford.edu/class/stats305b

Jonathan Taylor

Winter 2022

Penalized regression

\[ \Lambda(X\beta) - \beta'(X'Y) = - \log L(\beta|Y) = \ell(\beta|Y). \]

\[ \Lambda(\alpha) = \sum_{i=1}^n \Lambda(\alpha_i) \]

and \(\Lambda\) is the log MGF of \(Y\)’s as a function of the natural parameter.

Penalized regression

\[ \Lambda(X\beta) - \beta'(X'Y) + {\cal P}(\beta) \]

Three examples we’ve seen:

Ridge regression

\[ {\cal P}(\beta) = \frac{\lambda}{2} \|\beta\|_2^2 = \frac{\lambda}{2} \sum_{j=1}^p \beta_j^2. \]

\[ \hat{\beta}_{\lambda} = \text{argmin}_{\beta} \Lambda(X\beta) -\beta'(X'Y) + \frac{\lambda}{2} \|\beta\|^2_2 \]

“Bayesian” interpretation

\[ -(X\beta)'Y + \Lambda(X\beta) + \frac{\lambda}{2} \|\beta\|^2_2 \]

Easy to add weights

\[ {\cal P}(\beta) = \frac{1}{2} \sum_{j=1}^p \lambda_j \beta_j^2 \]

unpenalized variables have \(\lambda_j=0\).

General quadratics also fine

\[ {\cal P}(\beta) = \frac{1}{2}\beta'Q\beta \]

Overall objective

\[ \beta \mapsto \Lambda(X\beta) - \beta'(X'Y) + {\cal P}(\beta) = \ell(\beta) + \frac{1}{2} \beta'Q\beta \]

Solving for the ridge estimator

\[ \begin{aligned} \nabla {\cal P}(\beta) &= Q \beta \\ \nabla^2 {\cal P}(\beta) &= Q \end{aligned} \]

Newton-Raphson / Fisher scoring

\[ \hat{\beta}^{(t)} = \hat{\beta}^{(t-1)} - (X'W^{(t-1)}X + Q)^{-1} \left(X'(E_{\hat{\beta}^{(t-1)}}(Y) - Y) + Q \hat{\beta}^{(t-1)}\right) \]

\[ \hat{\beta}^{(t)} = \hat{\beta}^{(t-1)} - (X'W^{(t-1)}X + Q)^{-1} \left(X'W^{(t-1)}g'(\hat{\mu}^{(t-1)})(\hat{\mu}^{(t-1)} - Y) + Q \hat{\beta}^{(t-1)}\right) \]

Why do we regularize?

\[ \hat{\beta} = (X'X+\lambda I)^{-1}X'Y \sim N\left((X'X+\lambda I)^{-1}X'X\beta, \sigma^2 (X'X+\lambda I)^{-1}X'X(X'X+\lambda I)^{-1}\right) \]

\[ \begin{aligned} (X'X+\lambda I)^{-1}X'X &= \sum_{i=1}^p \frac{d^2_i}{d^2_i+\lambda} V_iV_i' \\ (X'X+\lambda I)^{-1}X'X(X'X+\lambda I)^{-1} &= \sum_{i=1}^p \frac{d^2_i}{(d^2_i+\lambda)^2} V_iV_i' \\ \end{aligned} \]

Bias

\[ \|E[\hat{\beta}]-\beta\|^2_2 = \lambda^2 \sum_{i=1}^p \frac{\alpha_i^2}{(d_i^2 + \lambda)^2} \\ \]

Variance

\[ \text{Tr}(\text{Var}(\hat{\beta})) = \sum_{i=1}^p \frac{d^2_i}{(d^2_i+\lambda)^2} \leq \sum_{i=1}^p \frac{1}{d_i^2} \]

MSE

\[ MSE(\hat{\beta}) = E[\|\hat{\beta}-\beta\|^2_2] = \|E[\hat{\beta}]-\beta\|^2_2 + \text{Tr}(\text{Var}(\hat{\beta})) \]

\[\frac{d}{d\lambda}\left(\|E[\hat{\beta}]-\beta\|^2_2 + \text{Tr}(\text{Var}(\hat{\beta}))\right)\biggl|_{\lambda=0} < 0 \]

Ridge solution path for SPAM data

library(glmnet)
## Loading required package: Matrix
## Loaded glmnet 4.0-2
library(ElemStatLearn)
data(spam)
X_spam = scale(model.matrix(glm(spam ~ ., 
                                family=binomial, 
                                data=spam))[,-1]) # drop intercept
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Y_spam = spam$spam == 'spam'
G_spam = glmnet(X_spam,
                Y_spam,
                alpha=0, # this makes it ridge
                family='binomial')
plot(G_spam)

Cross-validation to choose \(\lambda\)

cvG_spam = cv.glmnet(X_spam,
                     Y_spam,
                     alpha=0,
                     family='binomial')
plot(cvG_spam)

Re-solve at \(\lambda_{\min}\)

beta_CV_spam = coef(G_spam, 
                    s=cvG_spam$lambda.min, 
                    exact=TRUE, 
                    x=X_spam, 
                    y=Y_spam,
                    alpha=0)

Ridge solution path for South African heart data

data(SAheart)
X_heart = scale(model.matrix(glm(chd ~ ., family=binomial, data=SAheart))[,-1]) # drop intercept
Y_heart = SAheart$chd
G_heart = glmnet(X_heart,
                 Y_heart,
                 alpha=0,
                 family='binomial')
plot(G_heart)

Cross-validation to choose \(\lambda\)

cvG_heart = cv.glmnet(X_heart,
                      Y_heart,
                      alpha=0,
                      family='binomial')
plot(cvG_heart)

Re-solve at \(\lambda_{1SE}\)

beta_1se_heart = coef(G_heart, 
                      s=cvG_heart$lambda.1se, 
                      exact=TRUE, 
                      alpha=0,
                      x=X_heart, 
                      y=Y_heart)

LASSO

\[ {\cal P}(\beta) = \lambda \|\beta\|_1 = \sum_{j=1}^p \lambda_j |\beta_j|. \]

The LASSO picture

Why LASSO?

  1. Solvable even in very high dimensions. (“same” for SCAD, MCP, etc.)

  2. KKT conditions give an exact description of the solution however we decide to solve it (not same for SCAD, MCP, etc), at least under uniqueness.

Will the LASSO solution be unique?

In broad generality, yes. Uniqueness of the LASSO.

Solving the LASSO

Coordinate descent

\[ {\cal P}(\beta) = \sum_{i=1}^p p_i(\beta_i). \]

Basic iteration

\[ \hat{\beta}^{(t+1)}_j = \text{argmin}_{\beta_j \in \mathbb{R}} \left[\beta_j \mapsto \Lambda (X_{-j}\hat{\beta}^{(t)}_{-j} + X_j \beta_j) - \beta_j(X_j'Y) + p_j(\beta_j) \right] \]

Coordinate descent and Gibbs sampler

\[ \beta_j \mapsto \exp\left(-\left[\Lambda (X_{-j}\hat{\beta}^{(t)}_{-j} + X_j \beta_j) - \beta_j(X_j'Y) + p_j(\beta_j)\right] \right) \]

Gibbs: sample

Coordinate Descent: optimize

Coordinate descent

coordinate_descent = function() {
    beta = rep(0, num_features)
    for (i in 1:enough_iterations) {
        for (j in 1:num_features) {
            cur_obj = objective(X, Y, penalty, "binomial", beta, j)
            beta[j] = argmax(cur_obj)
        }
    }
}

Gibbs sampler

gibbs_sampler = function() {
    beta = rep(0, num_features)
    for (i in 1:enough_iterations) {
        for (j in 1:num_features) {
            cur_post = objective(X, Y, prior, "binomial", beta, j)
            beta[j] = sample_univariate(exp(cur_post))
        }
    }
}

Logistic regression with offset

\[ \beta \mapsto -(X\beta + Z)'Y + \sum_{i=1}^n \log(1 + \exp(X_i'\beta + Z_i)) \]

\[ X' \left(Y - \frac{\exp(X\widehat{\beta} + Z)}{1 + \exp(X\widehat{\beta} + Z)} \right) = 0 \]

Example with offset

X_sim = matrix(rnorm(200), 100, 2)
Z_sim = rnorm(100)
Y_sim = rbinom(100, 1, 0.5)
M = glm(Y_sim ~ X_sim - 1, offset=Z_sim, family=binomial);
affine_pred = X_sim %*% coef(M) + Z_sim
pi_hat = exp(affine_pred) / (1 + exp(affine_pred))
t(X_sim) %*% (Y_sim - pi_hat)
##               [,1]
## [1,]  4.493916e-09
## [2,] -5.790705e-08

\[ \begin{aligned} \lambda &> \left|\frac{\partial}{\partial \beta_j} \left[\Lambda(X_{-j} \widehat{\beta}_{-j} + X_j \beta_j) - \beta_j \cdot (X_j'Y)\right] \biggl|_{\beta_j=0} \right| \\ &= \left| X_j'\left( \pi(\hat{\beta}_{-j}, 0_j) - Y \right) \right| \end{aligned} \]

then \[ 0 = \text{argmin}_{\beta_j \in \mathbb{R}} \left[\beta_j \mapsto \Lambda (X_{-j}\hat{\beta}^{(t)}_{-j} + X_j \beta_j) - \beta_j(X_j'Y) + p_j(\beta_j) \right] \]

LASSO solution path for SPAM data

library(glmnet)
library(ElemStatLearn)
data(spam)
X_spam = scale(model.matrix(glm(spam ~ .,
                                family=binomial,
                                data=spam))[,-1]) # drop intercept
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
Y_spam = spam$spam == 'spam'
G_spam = glmnet(X_spam, Y_spam, family='binomial')
plot(G_spam)

Cross-validation to choose \(\lambda\)

cvG_spam = cv.glmnet(X_spam, Y_spam, family='binomial')
plot(cvG_spam)

Re-solve at \(\lambda_{\min}\)

beta_CV_spam = coef(G_spam, 
                    s=cvG_spam$lambda.min, 
                    exact=TRUE, 
                    x=X_spam, 
                    y=Y_spam)
sum(beta_CV_spam[-1] != 0) # not very sparse in this case...
## [1] 53

Predictions at new X

newX = X_spam[1:30,]
newY_hat = predict(G_spam, 
               newX,
                   s=cvG_spam$lambda.min, 
                   type="response",
                   exact=TRUE, 
                   x=X_spam, 
                   y=Y_spam)
newY_hat[1:5]
## [1] 0.5748062 0.9800819 0.9999740 0.7488135 0.7487251

LASSO solution path for South African heart data

data(SAheart)
X_heart = scale(model.matrix(glm(chd ~ ., family=binomial, data=SAheart))[,-1]) # drop intercept
Y_heart = SAheart$chd
G_heart = glmnet(X_heart, Y_heart, family='binomial')
plot(G_heart)

Cross-validation to choose \(\lambda\)

cvG_heart = cv.glmnet(X_heart, Y_heart, family='binomial')
plot(cvG_heart)

Re-solve at \(\lambda_{1SE}\)

beta_1se_heart = coef(G_heart, 
                      s=cvG_heart$lambda.1se, 
                      exact=TRUE, 
                      x=X_heart, 
                      y=Y_heart)
sum(beta_1se_heart[-1] != 0) # eliminates a few 
## [1] 5

Proximal gradient descent

\[ \text{argmin}_{\beta} \frac{L}{2}\|Z-\beta\|^2_2 + {\cal P}(\beta) \]

is soft-thresholding, most importantly it is fast

\[ \hat{\beta}_i = \max(|Z_i| - \lambda_i / L, 0) \cdot \text{sign}(Z_i) \]

Basic update

\[ Q^L(\beta;\hat{\beta}^{(t)}) = \ell(\hat{\beta}^{(t)}) + \nabla \ell(\hat{\beta}^{(t)})'(\beta - \hat{\beta}^{(t)}) + \frac{L}{2} \|\beta - \hat{\beta}^{(t)}\|^2_2 + {\cal P}(\beta) \]

\[ \hat{\beta}^{(t+1)} = \text{argmin}_{\beta} Q^L(\beta; \hat{\beta}^{(t)}) = \text{argmin}_{\beta} \frac{L}{2} \|\beta - \hat{\beta}^{(t)} + L^{-1} \nabla \ell(\hat{\beta}^{(t)})\|^2_2 + {\cal P}(\beta). \]

Comments

Majorization-Minimization

\[ \text{minimize}_{\beta} f(\beta) \]

\[ \begin{aligned} Q(\beta;\beta) &= f(\beta) \\ Q(\beta;\beta') & \geq f(\beta) \qquad \forall \beta, \beta' \end{aligned} \]

\[ \hat{\beta}^{(t+1)} = \text{argmin}_{\beta} Q(\beta;\beta^{(t)}) \]

Gradient descent and Langevin sampler

\[ \hat{\beta}^{(t+1)} = \hat{\beta}^{(t)} + \alpha \nabla \left[ \ell(\hat{\beta}^{(t)}) + {\cal P}(\hat{\beta}^{(t)}) \right] + \sqrt{2 \alpha} \cdot \xi^{(t)} \]

with \(\xi^{(t)} \sim N(0,I)\).

Proximal map

\[ Z \mapsto \text{argmin}_{\beta} \frac{1}{2}\|\beta-Z\|^2_2 + {\cal P}(\beta) \]

is called the proximal operator of \({\cal P}\).

Solving the LASSO

LASSO in bound form

\[ \text{minimize}_{\beta} \frac{1}{2} \|Y - X\beta\|^2_2 \]

subject to \({\cal P}(\beta) \leq C\).

\[ Z \mapsto \text{argmin}_{\beta:\|\beta\|_1 \leq C} \frac{L}{2} \|\beta-Z\|^2_2. \]

\[ \hat{\beta}^{(t)} - \frac{1}{L} \nabla \ell(\hat{\beta}^{(t)}). \]

onto the convex set \(\left\{\beta: \|\beta\|_1 \leq C \right\}.\)

KKT conditions

\[ \text{minimize}_{\beta} \ell(\beta) + {\cal P}(\beta) \ ? \]

\[ \nabla \ell (\hat{\beta}) + \hat{u} = 0 \iff X'Y = X' \nabla \Lambda(X\hat{\beta}) + \hat{u} \]

where

\[ \hat{u} \in \partial {\cal P}(\hat{\beta}). \]

Stationarity from proximal gradient

\[ \hat{\beta} = S_{\lambda L^{-1}}\left(\hat{\beta} - L^{-1} \nabla \ell(\hat{\beta})\right). \]

\[ |L^{-1}\nabla \ell(\hat{\beta})_i| \leq \lambda L^{-1} \ \implies \ |\nabla \ell(\hat{\beta})_i| \leq \lambda \]

\[ \hat{\beta}_i - L^{-1} \nabla \ell(\hat{\beta})_i = \hat{\beta}_i + \text{sign}(\hat{\beta}_i) \cdot \lambda L^{-1} \ \implies \ -\nabla\ell(\hat{\beta})_i = \lambda \cdot \text{sign}(\hat{\beta}_i) \]

\[ {\cal P}(\beta) = \sup_{u: |u_i| \leq \lambda_i} u'\beta. \]

\[ {\cal P}(\beta) = \sup_{u \in K} u'\beta, \]

the subdifferential is

\[ u \in \partial {\cal P}(\beta) \iff \beta \in N_u(K) \]

with \(N_u(K)\) the set of normal directions at \(u \in K\).

\[ \left\{u: u'\beta = {\cal P}(\beta) \right\}. \]

Normal cones of a cube

\[ \hat{u} \in \partial{\cal P}(\hat{\beta}) \iff \|u_{-E}/\lambda_{-E}\|_{\infty} \leq 1, u_E = \lambda_E s_E. \]

X = matrix(rnorm(300), 100, 3)
beta = rep(0, 3)
beta[1:2] = 3
Y = X %*% beta + rnorm(100)
G = glmnet(X, Y, standardize=FALSE, intercept=FALSE)
lam = G$lam[10]
lam
## [1] 1.322557
beta_hat = coef(G, s=lam, exact=TRUE, x=X, y=Y)[2:4]
beta_hat
## [1] 1.573924 1.736504 0.000000
score = (t(X) %*% (X %*% beta_hat - Y) / 100)
score
##             [,1]
## [1,] -1.32255694
## [2,] -1.32255695
## [3,]  0.02511821
lam
## [1] 1.322557
c(beta_hat[1:2], score[3])
## [1] 1.57392444 1.73650397 0.02511821

Let’s perturb \(Y\) a little and see what happens.

Y_star = Y + 0.1 * rnorm(100)
G_star = glmnet(X, Y_star, intercept=FALSE, standardize=FALSE)
beta_star = coef(G_star, s=lam, exact=TRUE, x=X, y=Y_star)[2:4]
beta_star
## [1] 1.570243 1.739898 0.000000
score_star = t(X) %*% (X %*% beta_star - Y_star) / 100
score_star
##             [,1]
## [1,] -1.32255592
## [2,] -1.32255695
## [3,]  0.03358971
c(beta_star[1:2], score_star[3])
## [1] 1.57024314 1.73989803 0.03358971
c(beta_hat[1:2], score[3])
## [1] 1.57392444 1.73650397 0.02511821

Take-away

KKT conditions: deeper dive

Restricted problem

\[ \begin{aligned} \nabla \ell(\hat{\beta})_E &= - \lambda_E s_E \\ \|\nabla \ell(\hat{\beta})_{-E}/\lambda_{-E}\|_{\infty} &\leq 1 \\ \end{aligned} \]

\[ \beta_E \overset{\ell^E}{\mapsto} \ell(\beta_E, 0) \]

\[ \nabla \ell^E(\hat{\beta}_E) = -\lambda_E s_E \]

with constraint \(\text{sign}(\hat{\beta}_E) = s_E\).

Gaussian case

\[ \bar{\beta}_E = \hat{\beta}_E + (X_E'X_E)^{-1} \lambda_E s_E \]

or

\[ \hat{\beta}_E = \bar{\beta}_E - (X_E'X_E)^{-1} \lambda_E s_E \]

Inactive block

\[ \begin{aligned} \nabla \ell(\hat{\beta}_E, 0)_{-E} &\approx \nabla \ell(\bar{\beta}_E, 0)_{-E} + \nabla^2 \ell(\bar{\beta}_E,0)[-E,E](\hat{\beta}_E - \bar{\beta}_E) \\ & \approx \nabla \ell(\bar{\beta}_E, 0)_{-E} - \nabla^2 \ell(\bar{\beta}_E,0)_{-E} \nabla^2 \ell^E(\bar{\beta}_E)^{-1} \lambda_E s_E \end{aligned} \]

\[ \|\nabla \ell(\hat{\beta}_E, 0)_{-E}/\lambda_{-E}\|_{\infty} \leq 1. \]

\[ \nabla^2 \ell(\bar{\beta}_E,0)_{-E} \nabla^2 \ell^E(\bar{\beta}_E)^{-1} \lambda_E s_E \]

will behave as a fixed vector (with signs fixed).

Gaussian case

\[ \|(X_{-E}'(Y - P_EY) + X_{-E}'X_E(X_E'X_E)^{-1} \lambda_Es_E)/\lambda_{-E} \|_{\infty} \leq 1. \]

Model selection consistency

\[ \text{sign}(\bar{\beta}_A - \lambda \nabla \ell^2(\bar{\beta}_A) s^*_A) = s^*_A \]

with \(s^*_A=\text{sign}(\beta^*_A)\).

\[ \|(\nabla \ell(\bar{\beta}_A, 0)_{-A} - I_A \lambda s_A^*) / \lambda\|_{\infty} = \|(\nabla \ell(\bar{\beta}_A, 0)_{-A}/\lambda - I_A s_A^*) / \|_{\infty} \leq 1. \]

\[ \max_{\|u_A\|_{\infty}\leq 1} \|I_A u_A\|_{\infty} \leq 1 \]

How large should \(\lambda\) be?

\[ \lambda \approx C \cdot E[\|\nabla \ell(\beta_A^*,0)\|_{\infty}], \qquad C > 1. \]