সমাধান — অধ্যায় ৬.২ · Regularization: Ridge, Lasso & Sparse Regression¶
অধ্যায় ফাইল:
part-6-statistical-ml/06-02-regularization-ridge-lasso.md(§৭ অনুশীলনী)। চলমান simulation — seednp.random.default_rng(20260619): \(n=100\), \(p=20\) feature, সত্য nonzero মাত্র \(k=4\)টি, \(\beta=[4,-3,2.5,-2,0,\dots,0]\), \(y=X\beta+\varepsilon\) with \(\varepsilon\sim\mathcal N(0,1^2)\), সব column standardized (mean \(0\), sd \(1\)), \(70/30\) train–test split। মূল notation: ridge \(\min_\beta\lVert y-X\beta\rVert_2^2+\lambda\lVert\beta\rVert_2^2\), closed-form \(\hat\beta_{\text{ridge}}=(X^\top X+\lambda I)^{-1}X^\top y\); lasso \(\min_\beta\lVert y-X\beta\rVert_2^2+\lambda\lVert\beta\rVert_1\); soft-threshold \(\hat\beta_j=\operatorname{sign}(z_j)\big(\lvert z_j\rvert-\lambda/2\big)_+\); \(\lambda\ge0\)। canonical সংখ্যা: OLS test MSE \(2.077\) (সব \(20\) feature); RidgeCV \(\lambda^\*\approx0.21\), MSE \(2.075\), \(20\) nonzero (কোনোটাই \(0\) নয়); LassoCV \(\lambda^\*\approx0.042\), MSE \(\mathbf{1.843}\), \(17\) nonzero। lasso path #nonzero: \(\lambda\,0.05\to16\), \(0.10\to9\), \(0.20\to5\), \(0.30\to4\) (ঠিক সত্য support \(\{0,1,2,3\}\)), \(0.50\to4\)। lasso@\(\lambda{=}0.30\) coef[:4] \(=[3.89,-2.98,2.21,-1.6]\) (সত্য \([4,-3,2.5,-2]\))। §ঘ-এর runnable script (seed20260619) উপরের MSE/nonzero ও path-সংখ্যা পুনরুৎপাদন করে।
ক · ধারণাগত (conceptual)¶
সমাধান ১ (★)¶
setup-এ \(20\)টি feature, সত্যিকারে relevant মাত্র \(4\)টি; বাকি \(16\)টি pure noise। OLS penalty ছাড়া প্রতিটি feature-কে coefficient দিয়ে training-data যতটা সম্ভব নিখুঁতভাবে fit করে — তাই irrelevant feature-গুলোর coefficient-ও training-নমুনার দৈব ওঠানামার সাথে মিলে যায়, signal-এর বদলে noise ধরে। ফলস্বরূপ: - bias প্রায় শূন্য — সত্য মডেল linear ও \(\mathcal H\)-এর ভেতরে, OLS unbiased। - variance বড় — অতিরিক্ত feature নমুনা-বদলে coefficient-গুলোকে অনেক দোলায়।
৬.১-এর ভাষায় OLS-এর সমস্যা তাই মূলত variance (overfit = variance-প্রধান প্রান্ত), bias নয়। এজন্যই OLS সব \(20\) feature-এ অশূন্য coefficient রেখে test MSE \(2.077\) দেয় — irrelevant feature-গুলো MSE-তে নিছক variance যোগ করে। regularization ঠিক এই variance-ই দমন করতে আসে।
সমাধান ২ (★)¶
দুটোই coefficient ছোট করে, কিন্তু পদ্ধতি ও ফল আলাদা:
- ridge (\(L_2\), penalty \(\lambda\lVert\beta\rVert_2^2\)) — সব coefficient-কে \(0\)-র দিকে সমানুপাতিকভাবে সংকুচিত (shrink) করে, কিন্তু কোনোটাকে ঠিক \(0\) করে না। canonical প্রমাণ: RidgeCV (\(\lambda^\*\approx0.21\)) \(20\)টি nonzero রাখে — অর্থাৎ একটিও feature বাদ পড়ে না।
- lasso (\(L_1\), penalty \(\lambda\lVert\beta\rVert_1\)) — ছোট coefficient-গুলোকে ঠিক \(0\)-তে কেটে দেয় (sparse selection)। canonical প্রমাণ: LassoCV (\(\lambda^\*\approx0.042\)) \(17\)টি nonzero রাখে, অর্থাৎ \(20-17=3\)টি feature ঠিক \(0\) — lasso স্বয়ংক্রিয়ভাবে feature বাদ দিল।
সংক্ষেপে: ridge = pure shrinkage (selection নয়); lasso = shrinkage + selection।
সমাধান ৩ (★)¶
penalty \(\lVert\beta\rVert\) coefficient-এর মাপ (scale)-এর উপর নির্ভরশীল, কিন্তু coefficient-এর মাপ নির্ভর করে feature-এর unit-এর উপর। ধরুন একই ভৌত feature একবার meter-এ, একবার millimeter-এ। millimeter-এ মান \(1000\) গুণ বড়, তাই একই প্রভাব দিতে তার coefficient \(1000\) গুণ ছোট হবে। এখন penalty \(\beta_j^2\) (বা \(\lvert\beta_j\rvert\)) সেই ছোট coefficient-কে প্রায় শাস্তিই দেবে না, অথচ meter-feature-এর বড় coefficient-কে অতিরিক্ত শাস্তি দেবে — penalty unit-নির্ভর ও অন্যায্য হয়ে যায়।
standardize (প্রতিটি feature mean \(0\), sd \(1\)) করলে সব coefficient একই unit-mukt স্কেলে আসে, তাই penalty সবাইকে সমান শর্তে শাস্তি দেয়। এজন্যই ridge/lasso-র আগে standardization বাধ্যতামূলক। (লক্ষণীয়: intercept সাধারণত penalize করা হয় না, এবং response-কে center করা হয় বলে closed-form-এ intercept আলাদা রাখা যায়।)
সমাধান ৪ (★★)¶
constraint-form: lasso \(=\min\lVert y-X\beta\rVert_2^2\) s.t. \(\lVert\beta\rVert_1\le t\); ridge \(=\) একই s.t. \(\lVert\beta\rVert_2\le t\)। RSS \(\lVert y-X\beta\rVert_2^2\)-এর level-set-গুলো \(\hat\beta^{\text{OLS}}\)-কেন্দ্রিক উপবৃত্ত (ellipse)। সমাধান = সবচেয়ে ভেতরের ellipse যেটি constraint-region স্পর্শ করে।
- lasso (\(L_1\)-ball = diamond): \(\lvert\beta_1\rvert+\lvert\beta_2\rvert\le t\) একটি হীরা — যার কোণাগুলো অক্ষের উপর (যেমন \((\pm t,0),(0,\pm t)\)), আর কোণায় তীক্ষ্ণ "কাঁটা"। একটি ছোঁয়া-ellipse প্রায়ই এই কোণায় আগে ঠেকে — আর কোণায় থাকার মানে কিছু coordinate ঠিক \(0\)। তাই lasso sparse। কোণার সংখ্যা মাত্রার সাথে বাড়ে, তাই উচ্চ-মাত্রায় sparsity আরও স্বাভাবিক।
- ridge (\(L_2\)-ball): \(\beta_1^2+\beta_2^2\le t^2\) একটি মসৃণ বৃত্ত/গোলক — কোনো কোণা নেই। ellipse গোলকটিকে সাধারণত কোনো generic বিন্দুতে ছোঁয়, যেখানে সব coordinate অশূন্য (axis-এ পড়ার সম্ভাবনা শূন্য-মাপের)। তাই ridge shrink করে কিন্তু \(0\) করে না।
মোদ্দা কথা: \(L_1\)-region-এর অক্ষ-সংলগ্ন কোণাই sparsity-র জ্যামিতিক উৎস; \(L_2\)-region মসৃণ বলে sparsity নেই।
সমাধান ৫ (★★)¶
৫.২-এ দেখা: দুটি feature near-collinear হলে \(X^\top X\)-এর অন্তত একটি eigenvalue \(\to0\), তাই \((X^\top X)^{-1}\)-এর সংশ্লিষ্ট eigenvalue \(\to\infty\) — OLS coefficient বিশাল ও নমুনা-সংবেদনশীল (অস্থির)।
ridge-এ matrix হয় \(X^\top X+\lambda I\)। যদি \(X^\top X\)-এর eigenvalue \(\lambda_1\ge\dots\ge\lambda_p\ge0\) (eigenvector অপরিবর্তিত), তবে \(X^\top X+\lambda I\)-এর eigenvalue হয় \(\lambda_i+\lambda\)। তাই সবচেয়ে ছোট eigenvalue-ও এখন \(\ge\lambda>0\) — শূন্য থেকে সরে গেল। ফলে inverse-এর eigenvalue \(\frac1{\lambda_i+\lambda}\) আর বিস্ফোরিত হয় না, coefficient সীমিত ও স্থিতিশীল হয়। উপরন্তু \(\lambda>0\) হলে সব eigenvalue ধনাত্মক ⇒ \(X^\top X+\lambda I\) সবসময় invertible (এমনকি \(p>n\) বা পূর্ণ-collinear ক্ষেত্রেও)। এক বাক্যে: ridge প্রতিটি eigenvalue-তে \(\lambda\) যোগ করে condition-number ছোট করে, multicollinearity-র অস্থিরতা সরাসরি সারায়।
খ · গণনামূলক (computational)¶
সমাধান ৬ (★) [E-ridge-inv]¶
দেওয়া \(X^\top X=\begin{pmatrix}4&2\\2&3\end{pmatrix}\), \(\lambda=1\)।
(ক) $$ X^\top X+\lambda I=\begin{pmatrix}4&2\2&3\end{pmatrix}+\begin{pmatrix}1&0\0&1\end{pmatrix}=\begin{pmatrix}5&2\2&4\end{pmatrix}. $$
(খ) determinant \(\det=5\cdot4-2\cdot2=20-4=16\)। \(2\times2\) inverse \(=\frac1{\det}\begin{pmatrix}d&-b\\-c&a\end{pmatrix}\): $$ (X^\top X+\lambda I)^{-1}=\frac1{16}\begin{pmatrix}4&-2\-2&5\end{pmatrix}=\begin{pmatrix}0.25&-0.125\-0.125&0.3125\end{pmatrix}. $$ (যাচাই: \(\begin{pmatrix}5&2\\2&4\end{pmatrix}\begin{pmatrix}0.25&-0.125\\-0.125&0.3125\end{pmatrix}=\begin{pmatrix}1&0\\0&1\end{pmatrix}\) ✓।)
(গ) তুলনার জন্য \(\lambda=0\)-এ \(\det(X^\top X)=4\cdot3-2\cdot2=8\); \(\lambda=1\)-এ \(\det=16\) — বেড়েছে। \(\lambda\) বাড়ালে matrix-এর প্রতিটি eigenvalue \(\lambda_i+\lambda\) হয়ে বড় হয়, তাই determinant (eigenvalue-গুণফল) বাড়ে এবং matrix শূন্য-determinant থেকে আরও দূরে সরে — অর্থাৎ আরও নিরাপদভাবে invertible ও সংখ্যাগতভাবে স্থিতিশীল।
সমাধান ৭ (★★) [E-softthresh]¶
soft-threshold \(\hat\beta_j=\operatorname{sign}(z_j)\big(\lvert z_j\rvert-\lambda/2\big)_+\), এখানে \(\lambda=1\Rightarrow\lambda/2=0.5\)। নিয়ম: \(\lvert z_j\rvert\le0.5\Rightarrow\hat\beta_j=0\); নাহলে magnitude থেকে \(0.5\) বিয়োগ, চিহ্ন রাখা।
| \(z_j\) | \(\lvert z_j\rvert\) | \(\lvert z_j\rvert-0.5\) | \((\cdot)_+\) | \(\hat\beta_j\) |
|---|---|---|---|---|
| \(+2.0\) | \(2.0\) | \(1.5\) | \(1.5\) | \(\boxed{+1.5}\) |
| \(-0.4\) | \(0.4\) | \(-0.1\) | \(0\) | \(\boxed{0}\) |
| \(+0.5\) | \(0.5\) | \(0.0\) | \(0\) | \(\boxed{0}\) |
| \(-1.5\) | \(1.5\) | \(1.0\) | \(1.0\) | \(\boxed{-1.0}\) |
| \(+0.3\) | \(0.3\) | \(-0.2\) | \(0\) | \(\boxed{0}\) |
ঠিক \(0\) হয়ে গেল: \(z=-0.4,\ +0.5,\ +0.3\) — অর্থাৎ তিনটি coefficient lasso বাদ দিল (যাদের magnitude \(\le0.5\))। \(z=+0.5\) ঠিক boundary-তে (\(0.5-0.5=0\))। টিকে থাকল কেবল বড়-magnitude দুটি (\(\pm2.0,\pm1.5\)), তাও \(0.5\) পরিমাণ shrink হয়ে (\(+1.5,-1.0\))। এটিই lasso-র "shrink + zero" আচরণের সারাংশ।
সমাধান ৮ (★★) [E-path]¶
(ক) lasso-path টেবিলে \(\lambda=0.30\) ও \(\lambda=0.50\) — উভয়েই ঠিক \(4\)টি nonzero এবং নির্বাচিত support হুবহু সত্য \(\{0,1,2,3\}\) (প্রথম চারটি feature)। অর্থাৎ \(\lambda\approx0.30\) থেকে \(0.50\) পরিসরে lasso সত্য support নিখুঁতভাবে উদ্ধার করে। \(\lambda=0.30\)-এ coefficient[:4] \(=[3.89,-2.98,2.21,-1.6]\) — সত্য \([4,-3,2.5,-2]\)-এর কাছাকাছি কিন্তু penalty-র কারণে সামান্য shrink-করা (বিশেষত চতুর্থটি \(-2\to-1.6\))।
(খ) \(\lambda\): \(0.05\to16\), \(0.10\to9\), \(0.20\to5\), \(0.30\to4\), \(0.50\to4\) — nonzero-সংখ্যা একঘেয়ে কমছে (monotone↓)। কারণ: \(\lambda\) বড় মানে \(L_1\)-penalty কড়া, আরও বেশি coefficient-কে soft-threshold \(0\)-তে ঠেলে দেয়; ছোট/দুর্বল feature-গুলো আগে ঝরে, সবচেয়ে শক্তিশালী (সত্য) feature-গুলো শেষ পর্যন্ত টিকে থাকে।
(গ) CV যদি \(\lambda^\*\approx0.042\) বাছে, তখন \(17\)টি nonzero — অর্থাৎ সত্য \(4\)-এর চেয়ে \(13\)টি বেশি feature রাখল। CV ঠিক support বাছেনি, একটু over-selection করল। কারণ CV held-out prediction-MSE minimize করে, exact support নয়: ছোট-\(\lambda\) কিছু false-positive feature রাখলেও prediction সামান্য ভালো হতে পারে (এখানে MSE \(1.843\), যা ridge/OLS-এর \(\approx2.07\)-র চেয়ে অনেক ভালো)। যদি লক্ষ্য হতো exact variable selection, তবে বড়-\(\lambda\) (\(\approx0.30\)) লাগত; prediction-ই লক্ষ্য হলে CV-র সামান্য over-selection গ্রহণযোগ্য। (এই pred-vs-select টানাপোড়েনই lasso-র একটি পরিচিত বৈশিষ্ট্য।)
সমাধান ৯ (★★) [E-bias-var]¶
\(\lambda=0\) (OLS) থেকে \(\lambda\) বাড়ালে:
(ক) coefficient-magnitude কমে — penalty \(\lambda\lVert\beta\rVert_2^2\) বড় coefficient-কে শাস্তি দেয়, তাই সব \(\hat\beta_j\) \(0\)-র দিকে সংকুচিত হয় (orthonormal-এ ঠিক factor \(\frac1{1+\lambda}\), সমাধান ১৩)।
(খ) variance কমে — ছোট, সংযত coefficient নমুনা-বদলে কম দোলে; ridge-এর variance OLS-এর চেয়ে কম (SVD-তে ছোট-singular-value direction-গুলো \(\frac{\sigma_i^2}{\sigma_i^2+\lambda}\) factor-এ বেশি দমিত)।
(গ) bias বাড়ে — coefficient সত্য মান থেকে সরে যাওয়ায় (\(\hat\beta\) আর unbiased নয়) bias বাড়ে। এটিই দাম: ridge সামান্য bias কিনে variance বেচে।
canonical দিয়ে: OLS MSE \(2.077\) → RidgeCV (\(\lambda^\*\approx0.21\)) MSE \(2.075\)। অর্থাৎ সামান্য bias গ্রহণ করেও ridge variance কমিয়ে MSE সামান্য কমাল (\(2.077\to2.075\))। কিন্তু lasso MSE \(1.843\) — অনেক বড় উন্নতি।
কেন ridge-এর জয় সামান্য, lasso-র বড়? সত্য মডেল sparse — মাত্র \(4\)টি nonzero, বাকি \(16\)টি ঠিক \(0\)। lasso সেই \(16\)টিকে ঠিক \(0\) করে তাদের variance-অবদান সম্পূর্ণ মুছে দেয়, তাই বড় লাভ। ridge সবগুলোকে কেবল shrink করে — irrelevant \(16\)টির coefficient ছোট হলেও অশূন্যই থাকে, তাই তাদের অবশিষ্ট variance-অবদান রয়ে যায়; ফলে ridge-এর উন্নতি সীমিত। সত্য structure sparse হলে \(L_1\) (lasso) \(L_2\) (ridge)-কে হারায়; structure dense/সব-feature-সামান্য-প্রাসঙ্গিক হলে ridge ভালো করত।
সমাধান ১০ (★★) [E-elasticnet]¶
elastic net: \(\min\lVert y-X\beta\rVert_2^2+\lambda_1\lVert\beta\rVert_1+\lambda_2\lVert\beta\rVert_2^2\) — lasso-র \(L_1\) ও ridge-এর \(L_2\) একসাথে।
(ক) pure lasso-র দুর্বলতা correlated feature-গোষ্ঠীতে: lasso সাধারণত গোষ্ঠী থেকে একটিমাত্র feature বাছে আর বাকিদের \(0\) করে — কিন্তু কোনটি বাছবে তা নমুনার ক্ষুদ্র ওঠানামায় বদলে যায় (অস্থির নির্বাচন)। উপরন্তু \(p>n\)-এ lasso বড়জোর \(n\)টি feature বাছতে পারে। \(L_2\)-অংশ এই সমস্যা সারায়: এটি grouping effect আনে — highly correlated feature-দের coefficient পরস্পরের কাছাকাছি রাখতে উৎসাহ দেয়, তাই গোষ্ঠীকে একসাথে রাখে/একসাথে shrink করে, আর নির্বাচন স্থিতিশীল হয়।
(খ) দুটি প্রায়-অভিন্ন feature থাকলে: - pure lasso: এলোমেলোভাবে একটিকে রেখে অন্যটিকে ঠিক \(0\) করে (যা ফলাফলকে অস্থির ও কম-ব্যাখ্যাযোগ্য করে — পুনরায় চালালে অন্যটি বেছে নিতে পারে)। - elastic net: দুটিকেই রাখে, coefficient মোটামুটি সমান করে ভাগ করে দেয় (grouping) — তাই correlated-গোষ্ঠী একসাথে নির্বাচিত/বর্জিত হয়, ফলাফল স্থিতিশীল ও ব্যাখ্যাযোগ্য।
সংক্ষেপে elastic net "দুই দুনিয়ার সেরা": lasso-র sparsity + ridge-এর স্থিতিশীলতা ও grouping।
গ · প্রমাণভিত্তিক (proof-based)¶
সমাধান ১১ (★★) [P-ridge]¶
ridge objective \(J(\beta)=\lVert y-X\beta\rVert_2^2+\lambda\lVert\beta\rVert_2^2=(y-X\beta)^\top(y-X\beta)+\lambda\beta^\top\beta\)।
Gradient। বিস্তার করে \(J=y^\top y-2\beta^\top X^\top y+\beta^\top X^\top X\beta+\lambda\beta^\top\beta\)। \(\beta\)-র সাপেক্ষে gradient: $$ \nabla_\beta J=-2X^\top y+2X^\top X\beta+2\lambda\beta=-2X^\top(y-X\beta)+2\lambda\beta. $$ \(\nabla_\beta J=0\) বসিয়ে: $$ X^\top X\beta+\lambda\beta=X^\top y\;\Longrightarrow\;(X^\top X+\lambda I)\beta=X^\top y\;\Longrightarrow\;\boxed{\hat\beta_{\text{ridge}}=(X^\top X+\lambda I)^{-1}X^\top y}. $$
Invertibility (\(\lambda>0\))। \(X^\top X\) symmetric ও positive-semidefinite (কারণ যেকোনো \(v\)-এর জন্য \(v^\top X^\top X v=\lVert Xv\rVert_2^2\ge0\)), তাই এর eigenvalue \(\lambda_1,\dots,\lambda_p\ge0\)। spectral theorem-এ \(X^\top X=Q\Lambda Q^\top\) (\(Q\) orthogonal)। তখন $$ X^\top X+\lambda I=Q\Lambda Q^\top+\lambda QQ^\top=Q(\Lambda+\lambda I)Q^\top, $$ যার eigenvalue \(\lambda_i+\lambda\ge\lambda>0\) — সব ধনাত্মক, তাই \(X^\top X+\lambda I\) positive-definite, অতএব invertible (det \(=\prod_i(\lambda_i+\lambda)>0\))। এমনকি \(X^\top X\) singular (\(p>n\) বা পূর্ণ-collinear, কোনো \(\lambda_i=0\)) হলেও \(\lambda>0\) নিশ্চিত করে inverse সর্বদা বিদ্যমান। \(\blacksquare\) (এটিই OLS-এর normal equation \(X^\top X\beta=X^\top y\)-এর তুলনায় ridge-এর সংখ্যাগত সুবিধা।)
সমাধান ১২ (★★★) [P-softthresh]¶
orthonormal design (\(X^\top X=I\))-এ lasso objective coordinate-wise বিচ্ছিন্ন হয়ে যায়; একটি একক coordinate-এর জন্য (OLS-coefficient \(z\), penalty-strength \(\lambda\)): $$ g(\beta)=(z-\beta)^2+\lambda\lvert\beta\rvert. $$ \(\lvert\beta\rvert\) at \(\beta=0\) non-differentiable, তাই subgradient-শর্ত \(0\in\partial g(\beta)\) ব্যবহার করি, যেখানে \(\partial\lvert\beta\rvert=\{\operatorname{sign}(\beta)\}\) for \(\beta\ne0\) এবং \(=[-1,1]\) at \(\beta=0\)।
ক্ষেত্র \(\beta>0\): \(g'(\beta)=-2(z-\beta)+\lambda=0\Rightarrow\beta=z-\tfrac{\lambda}{2}\)। এটি \(>0\) হবে যদি \(z>\tfrac{\lambda}{2}\)। তাই \(z>\lambda/2\)-এ \(\hat\beta=z-\lambda/2\)।
ক্ষেত্র \(\beta<0\): \(g'(\beta)=-2(z-\beta)-\lambda=0\Rightarrow\beta=z+\tfrac{\lambda}{2}\)। এটি \(<0\) হবে যদি \(z<-\tfrac{\lambda}{2}\)। তাই \(z<-\lambda/2\)-এ \(\hat\beta=z+\lambda/2\)।
ক্ষেত্র \(\beta=0\): subgradient-শর্ত \(0\in -2(z-0)+\lambda\cdot[-1,1]=\{-2z+\lambda s:s\in[-1,1]\}\), অর্থাৎ \(\exists s\in[-1,1]\) যেন \(2z=\lambda s\), যা সম্ভব ঠিক যখন \(\lvert 2z\rvert\le\lambda\) অর্থাৎ \(\lvert z\rvert\le\lambda/2\)। তাই \(\lvert z\rvert\le\lambda/2\)-এ \(\hat\beta=0\)।
তিন ক্ষেত্র একত্রে: $$ \hat\beta=\begin{cases}z-\lambda/2,&z>\lambda/2\[2pt]0,&\lvert z\rvert\le\lambda/2\[2pt]z+\lambda/2,&z<-\lambda/2\end{cases} =\operatorname{sign}(z)\big(\lvert z\rvert-\tfrac{\lambda}{2}\big)_+.\qquad\blacksquare $$ এই "ছোট মান কেটে \(0\), বড় মান \(\lambda/2\) পরিমাণ shrink" আচরণই lasso-র sparsity-র উৎস (বিপরীতে ridge সমানুপাতিক shrink করে, সমাধান ১৩)।
সমাধান ১৩ (★★) [P-shrinkfactor]¶
orthonormal \(X\), অর্থাৎ \(X^\top X=I\)। ridge closed-form-এ বসাই: $$ \hat\beta^{\text{ridge}}=(X^\top X+\lambda I)^{-1}X^\top y=(I+\lambda I)^{-1}X^\top y=\frac1{1+\lambda}\,X^\top y. $$ কিন্তু একই orthonormal ক্ষেত্রে OLS \(\hat\beta^{\text{OLS}}=(X^\top X)^{-1}X^\top y=X^\top y\)। তাই প্রতিটি coordinate-এ $$ \boxed{\hat\beta_j^{\text{ridge}}=\frac{\hat\beta_j^{\text{OLS}}}{1+\lambda}}. $$ factor \(\frac1{1+\lambda}\) একটি ধনাত্মক ধ্রুবক (\(0<\frac1{1+\lambda}<1\) for \(\lambda>0\), \(\to0\) কেবল \(\lambda\to\infty\)-এ)। অর্থাৎ ridge প্রতিটি coefficient-কে একই অনুপাতে ছোট করে কিন্তু চিহ্ন বদলায় না এবং অশূন্য OLS-coefficient-কে কখনো ঠিক \(0\) করে না (যেহেতু \(\frac1{1+\lambda}\ne0\) for finite \(\lambda\))। এটিই soft-threshold-এর সাথে মূল পার্থক্য: lasso ছোট coefficient থেকে একটি ধ্রুব পরিমাণ (\(\lambda/2\)) বিয়োগ করে \(0\)-তে কাটতে পারে, কিন্তু ridge শুধু গুণনীয় সংকোচন করে — তাই ridge sparse নয়। \(\blacksquare\)
ঘ · কোডিং (coding)¶
সমাধান ১৪ (★★) [E-fit] — OLS / RidgeCV / LassoCV¶
নিচের script seed 20260619 দিয়ে dataset গড়ে তিনটি মডেল fit করে test-MSE ও nonzero-coefficient ছাপে এবং canonical সংখ্যা পুনরুৎপাদন করে।
import numpy as np
from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
rng = np.random.default_rng(20260619)
# --- dataset: n=100, p=20, true nonzero k=4 ---
n, p = 100, 20
beta_true = np.zeros(p)
beta_true[:4] = [4, -3, 2.5, -2] # সত্য support {0,1,2,3}
X = rng.normal(0, 1, size=(n, p))
y = X @ beta_true + rng.normal(0, 1, size=n) # noise sd = 1 -> var 1
# 70/30 split, তারপর train-এ fit করা scaler দিয়ে standardize
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.30, random_state=42)
scaler = StandardScaler().fit(Xtr)
Xtr, Xte = scaler.transform(Xtr), scaler.transform(Xte)
def report(name, model, n_nonzero):
mse = mean_squared_error(yte, model.predict(Xte))
print(f"{name:9s} | test MSE = {mse:6.3f} | #nonzero = {n_nonzero}")
# (ক) OLS
ols = LinearRegression().fit(Xtr, ytr)
report("OLS", ols, int(np.sum(np.abs(ols.coef_) > 1e-8)))
# (খ) RidgeCV (alpha = lambda)
ridge = RidgeCV(alphas=np.logspace(-3, 2, 100)).fit(Xtr, ytr)
report("RidgeCV", ridge, int(np.sum(np.abs(ridge.coef_) > 1e-8)))
print(f" RidgeCV lambda* = {ridge.alpha_:.3f}")
# (গ) LassoCV
lasso = LassoCV(alphas=np.logspace(-3, 1, 100), cv=5,
max_iter=100000, random_state=0).fit(Xtr, ytr)
report("LassoCV", lasso, int(np.sum(np.abs(lasso.coef_) > 1e-8)))
print(f" LassoCV lambda* = {lasso.alpha_:.3f}")
প্রত্যাশিত আউটপুট (canonical, seed 20260619):
OLS | test MSE = 2.077 | #nonzero = 20
RidgeCV | test MSE = 2.075 | #nonzero = 20
RidgeCV lambda* = 0.210
LassoCV | test MSE = 1.843 | #nonzero = 17
LassoCV lambda* = 0.042
পর্যবেক্ষণ: OLS সব \(20\) feature রাখে (MSE \(2.077\))। RidgeCV-ও \(20\)টি রাখে — কোনোটাই ঠিক \(0\) নয় (pure shrinkage), MSE সামান্য ভালো \(2.075\)। LassoCV (\(\lambda^\*\approx0.042\)) \(3\)টি feature \(0\) করে (\(17\) nonzero) এবং MSE \(1.843\) — স্পষ্টভাবে সেরা, কারণ সত্য মডেল sparse বলে অপ্রাসঙ্গিক feature-দের ঠিক \(0\) করা variance বড় কমায়। (sklearn-সংস্করণ/solver-ভেদে \(\lambda^\*\) ও শেষ-দশমিকে সামান্য হেরফের সম্ভব, কিন্তু lasso \(<\) ridge \(\approx\) OLS এবং lasso-র sparsity ক্রম স্থিতিশীল।)
সমাধান ১৫ (★★) [E-path] — lasso regularization path¶
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import lasso_path, LassoCV
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
rng = np.random.default_rng(20260619)
n, p = 100, 20
beta_true = np.zeros(p); beta_true[:4] = [4, -3, 2.5, -2]
X = rng.normal(0, 1, (n, p))
y = X @ beta_true + rng.normal(0, 1, n)
Xtr, Xte, ytr, yte = train_test_split(X, y, test_size=0.30, random_state=42)
Xtr = StandardScaler().fit_transform(Xtr)
# --- coefficient path along a lambda(=alpha)-grid ---
alphas = np.logspace(-3, 0.3, 200)
alphas_out, coefs, _ = lasso_path(Xtr, ytr, alphas=alphas)
# নির্দিষ্ট কয়েকটি lambda-তে nonzero-সংখ্যা (canonical যাচাই)
print("lambda #nonzero")
for lam in [0.05, 0.10, 0.20, 0.30, 0.50]:
j = np.argmin(np.abs(alphas_out - lam))
nz = int(np.sum(np.abs(coefs[:, j]) > 1e-8))
print(f"{alphas_out[j]:5.2f} {nz}")
# CV দিয়ে lambda* বাছা
lcv = LassoCV(alphas=alphas, cv=5, max_iter=100000, random_state=0).fit(Xtr, ytr)
print(f"\nCV lambda* = {lcv.alpha_:.3f}, #nonzero = "
f"{int(np.sum(np.abs(lcv.coef_) > 1e-8))}")
# --- plot 1: coefficient profiles (প্রথম 4টি সত্য feature হাইলাইট) ---
fig, ax = plt.subplots(1, 2, figsize=(11, 4))
for j in range(p):
style = dict(lw=2) if j < 4 else dict(lw=0.8, alpha=0.5, color="gray")
ax[0].plot(np.log10(alphas_out), coefs[j], **style,
label=(f"feat {j} (true)" if j < 4 else None))
ax[0].axvline(np.log10(lcv.alpha_), ls="--", color="k", label=r"CV $\lambda^*$")
ax[0].set(xlabel=r"$\log_{10}\lambda$", ylabel="coefficient",
title="Lasso coefficient path")
ax[0].legend(fontsize=8)
# --- plot 2: #nonzero বনাম lambda ---
nnz = (np.abs(coefs) > 1e-8).sum(axis=0)
ax[1].plot(np.log10(alphas_out), nnz)
ax[1].axhline(4, ls=":", color="g", label="true k = 4")
ax[1].axvline(np.log10(lcv.alpha_), ls="--", color="k", label=r"CV $\lambda^*$")
ax[1].set(xlabel=r"$\log_{10}\lambda$", ylabel="#nonzero",
title="Sparsity vs penalty")
ax[1].legend(fontsize=8)
plt.tight_layout(); plt.show()
প্রত্যাশিত আউটপুট (canonical, seed 20260619):
পর্যবেক্ষণ: nonzero-সংখ্যা \(\lambda\)-র সাথে একঘেয়ে কমে (\(16\to9\to5\to4\to4\)) — canonical path-এর সাথে মেলে। \(\lambda\approx0.30\) থেকে ঠিক \(4\)টি feature টিকে থাকে, এবং প্রথম-চারটি (সত্য \(\{0,1,2,3\}\)) coefficient-profile সবচেয়ে শেষে \(0\)-তে নামে — অর্থাৎ lasso দুর্বল/noise feature আগে ঝরিয়ে সত্য support শেষ পর্যন্ত ধরে রাখে। CV-নির্বাচিত \(\lambda^\*\approx0.042\) prediction-MSE minimize করে, তাই সামান্য over-select করে \(17\) nonzero রাখে (সমাধান ৮গ)। coefficient-path plot-এ সত্য-চারটি বড় coefficient (\(\approx4,-3,2.5,-2\) থেকে শুরু) আলাদাভাবে চোখে পড়ে। (solver/grid-ভেদে শেষ-দশমিকে সামান্য হেরফের সম্ভব, কিন্তু monotone-decreasing pattern ও \(\lambda{\approx}0.3\)-এ exact-4-support স্থিতিশীল।)
সমাধান-সারাংশ। regularization = OLS-loss-এ একটি size-penalty \(\lambda\cdot(\text{coefficient-norm})\) যোগ করে capacity একটানা নিয়ন্ত্রণ — সামান্য bias কিনে অনেক variance বেচা (৬.১-এর U-curve-এর তলায় নামা)। ridge (\(L_2\)) সব coefficient proportionally shrink করে (\(\frac1{1+\lambda}\) orthonormal-এ), \(X^\top X+\lambda I\)-কে সর্বদা invertible করে multicollinearity সারায়, কিন্তু কোনোটা \(0\) করে না (canonical: \(\lambda^\*{\approx}0.21\), MSE \(2.075\), \(20\) nonzero)। lasso (\(L_1\)) soft-threshold \(\operatorname{sign}(z)(\lvert z\rvert-\lambda/2)_+\) দিয়ে ছোট coefficient \(0\) করে — \(L_1\)-diamond-এর অক্ষ-কোণার জ্যামিতি থেকে sparse selection (canonical: \(\lambda^\*{\approx}0.042\), MSE \(\mathbf{1.843}\), \(17\) nonzero; path \(16{\to}9{\to}5{\to}4{\to}4\), \(\lambda{\approx}0.3\)-এ ঠিক সত্য \(\{0,1,2,3\}\))। সত্য মডেল sparse বলে lasso ridge-কে হারায়। \(\lambda\) বাছা CV-তে (prediction minimize করে, exact support নয়), penalize-এর আগে standardize আবশ্যক, আর elastic net দুই penalty মিশিয়ে correlated-গোষ্ঠীতে স্থিতিশীল sparse-নির্বাচন দেয়। এই সব → ৬.৩-এর classification-এ capacity/bias–variance-চিন্তারই ধারাবাহিকতা।