16.2 선형 모델과 정규화

실습 · 연습문제 2개

좌표 하강법과 soft-thresholding으로 Lasso 풀기 lasso-coordinate-descent

Lasso 목적함수

L(w)=12N∥y−Xw∥2+α∥w∥1L(\mathbf{w}) = \frac{1}{2N}\lVert \mathbf{y} - \mathbf{X}\mathbf{w} \rVert^2 + \alpha\lVert\mathbf{w}\rVert_1

는 ∥w∥1\lVert\mathbf{w}\rVert_1 때문에 0에서 미분할 수 없어 닫힌 해가 없다. 그러나 계수 하나만 움직이고 나머지를 고정하면 문제는 1차원이 되고, 해가 닫힌 형태로 나온다. 계수를 하나씩 돌아가며 이 1차원 해로 바꾸는 것이 좌표 하강법(coordinate descent)이다.

두 함수를 완성한다. X는 열마다 평균이 0이라고 가정하고 절편은 다루지 않는다.

1. soft_threshold(z, t) — S(z,t)=sign⁡(z)max⁡(∣z∣−t,0)S(z, t) = \operatorname{sign}(z)\max(|z| - t, 0). 배열에 원소별로 동작해야 한다. ∣z∣≤t|z| \le t이면 정확히 0이다.

2. lasso_cd(X, y, alpha, n_sweeps=500) — 모든 계수를 0에서 시작해, 매 sweep마다 j=1,…,pj = 1, \dots, p 순서로

ρj=1Nxj⊤(y−Xw+xjwj),wj←S(ρj,α)∥xj∥2/N\rho_j = \frac{1}{N}\mathbf{x}_j^\top\big(\mathbf{y} - \mathbf{X}\mathbf{w} + \mathbf{x}_j w_j\big), \qquad w_j \leftarrow \frac{S(\rho_j, \alpha)}{\lVert\mathbf{x}_j\rVert^2 / N}

로 바꾼다. ρj\rho_j는 "jj번째 특징을 뺀 나머지 모델의 잔차"와 xj\mathbf{x}_j의 상관이다. 이 상관이 α\alpha보다 작으면 wjw_j는 정확히 0이 된다. 이것이 Lasso가 특징을 선택하는 방식이다. n_sweeps번 반복한 뒤 w (shape (p,))를 반환한다.

테스트는 다음을 확인한다.

  • soft_threshold의 값과 정확한 0.
  • 특징이 직교하는 경우(X⊤X/N=I\mathbf{X}^\top\mathbf{X}/N = \mathbf{I}), 해가 S(X⊤y/N,α)S(\mathbf{X}^\top\mathbf{y}/N, \alpha)와 같다.
  • α≥max⁡j∣xj⊤y∣/N\alpha \ge \max_j |\mathbf{x}_j^\top\mathbf{y}|/N이면 모든 계수가 0이다.
  • 최적 조건(KKT): wj≠0w_j \neq 0이면 xj⊤(y−Xw)/N=αsign⁡(wj)\mathbf{x}_j^\top(\mathbf{y} - \mathbf{X}\mathbf{w})/N = \alpha\operatorname{sign}(w_j), wj=0w_j = 0이면 ∣xj⊤(y−Xw)/N∣≤α|\mathbf{x}_j^\top(\mathbf{y} - \mathbf{X}\mathbf{w})/N| \le \alpha.

표준화와 벌점 없는 절편을 포함한 Ridge 회귀 standardized-ridge

함수 fit_ridge(X, y, lam)를 완성해, 원래 단위의 계수 w (shape (p,))와 절편 b (스칼라)를 반환한다. 예측은 X @ w + b다.

모델은 다음 순서로 만든다.

  1. 각 특징을 학습 데이터의 평균 μj\mu_j와 표준편차 sjs_j(모집단 표준편차, ddof=0)로 표준화한다: zij=(xij−μj)/sjz_{ij} = (x_{ij} - \mu_j)/s_j.
  2. 출력을 중심화한다: y~i=yi−yˉ\tilde y_i = y_i - \bar y.
  3. 표준화된 특징으로 Ridge 해를 구한다.
v=(Z⊤Z+λI)−1Z⊤y~\mathbf{v} = (\mathbf{Z}^\top\mathbf{Z} + \lambda\mathbf{I})^{-1}\mathbf{Z}^\top\tilde{\mathbf{y}}
  1. 원래 단위로 되돌린다: wj=vj/sjw_j = v_j / s_j, b=yˉ−∑jμjwjb = \bar y - \sum_j \mu_j w_j.

중심화한 덕분에 절편은 벌점을 받지 않는다. 벌점은 표준화된 계수 v\mathbf{v}에만 걸리므로, 특징의 단위를 바꿔도 예측이 바뀌지 않는다.

테스트는 다음을 확인한다.

  • lam = 0이면 절편이 있는 보통 최소제곱과 같다.
  • 한 특징의 단위를 1000배 바꿔도 예측이 같다.
  • lam이 매우 크면 w는 0에 가까워지고 b는 y의 평균에 가까워진다(절편이 벌점을 받지 않으므로).
  • 표준화된 공간에서 Ridge의 최적 조건 Z⊤(y~−Zv)=λv\mathbf{Z}^\top(\tilde{\mathbf{y}} - \mathbf{Z}\mathbf{v}) = \lambda\mathbf{v}를 만족한다.

힌트: np.linalg.solve를 쓴다. 역행렬을 직접 만들 필요는 없다.