證自動(dòng)選擇最佳正則化參數(shù)alpha)
先交代一個(gè)問(wèn)題很多人用 Lasso 的時(shí)候習(xí)慣先拍一個(gè)正則化參數(shù) alpha比如 0.01、0.1然后看效果效果不好再換一個(gè)。這么調(diào)十幾次運(yùn)氣好能碰到一個(gè)還能用的模型運(yùn)氣不好就是白忙一晚上。帶交叉驗(yàn)證的 LassoCV 就是來(lái)解決這件事的——它把 alpha 的選擇變成一個(gè)自動(dòng)化過(guò)程用交叉驗(yàn)證去評(píng)估每個(gè)候選 alpha 的泛化能力最后直接告訴你哪個(gè)值最穩(wěn)。這篇東西就把 LassoCV 的原理、關(guān)鍵參數(shù)、完整流程和常見(jiàn)坑一次講透適合已經(jīng)跑過(guò) sklearn 回歸但還沒(méi)系統(tǒng)用過(guò) CV 版的人。1. Lasso 回歸到底在解決什么問(wèn)題1.1 線性回歸的過(guò)擬合與特征選擇困境普通線性回歸的目標(biāo)很直白找一組系數(shù)讓預(yù)測(cè)值和真實(shí)值之間的平方誤差最小。但問(wèn)題在于當(dāng)特征數(shù)量很多、樣本量又不夠大的時(shí)候模型會(huì)拼命記住訓(xùn)練集里的細(xì)節(jié)包括噪聲。結(jié)果就是訓(xùn)練集上 R2 很好看一到新數(shù)據(jù)上就開(kāi)始崩。這就是過(guò)擬合。早期團(tuán)隊(duì)里搞過(guò)一個(gè)特征數(shù)幾百、樣本數(shù)幾十的小項(xiàng)目直接跑線性回歸系數(shù)亂七八糟有的特征系數(shù)大到離譜有的又互相抵消。誰(shuí)都不敢拿這種模型上線。更麻煩的是線性回歸不會(huì)幫你做特征篩選它只會(huì)把所有特征都塞進(jìn)模型里不管這特征是不是真的有解釋力。所以實(shí)際場(chǎng)景里我希望模型自己把那些無(wú)關(guān)緊要的特征權(quán)重壓下去甚至直接變成 0。1.2 L1 正則化是怎么讓系數(shù)歸零的Lasso 的全稱是 Least Absolute Shrinkage and Selection Operator它在線性回歸的損失函數(shù)里加了一項(xiàng)所有系數(shù)絕對(duì)值之和也就是 L1 懲罰項(xiàng)。損失函數(shù)從純粹的均方誤差變成了MSE alpha * sum(|beta|)這里的 alpha 就是正則化參數(shù)控制懲罰力度。alpha 越大模型越不愿意讓系數(shù)保持較大的絕對(duì)值導(dǎo)致越來(lái)越多的系數(shù)被壓縮到接近 0 甚至精確等于 0。為什么 L1 能產(chǎn)生精確的 0而 L2嶺回歸用的那種平方和懲罰只能把系數(shù)壓縮到很小但不能歸零一個(gè)直觀理解是L2 懲罰讓系數(shù)平滑地變小像把一堆沙往中間推L1 懲罰形成的約束區(qū)域有尖銳的棱角最優(yōu)解容易落在棱角上這個(gè)棱角對(duì)應(yīng)的坐標(biāo)軸方向就是某些系數(shù)正好為 0 的位置。我習(xí)慣用坐標(biāo)軸去記這件事L1 的約束是一個(gè)菱形菱形的最優(yōu)接觸點(diǎn)經(jīng)常在頂點(diǎn)頂點(diǎn)正好讓一個(gè)或幾個(gè)系數(shù)歸零。這讓 Lasso 天然成為線性模型里的特征選擇工具。1.3 alpha 不是拍腦袋拍的它決定稀疏度和誤差的平衡在很多實(shí)際項(xiàng)目里alpha 是唯一需要認(rèn)真調(diào)的東西。選得太小Lasso 退化成接近普通線性回歸過(guò)擬合問(wèn)題照舊選得太大模型會(huì)過(guò)度稀疏把所有特征都削成 0只留下一個(gè)截距項(xiàng)預(yù)測(cè)能力也就沒(méi)了。所以 alpha 本質(zhì)上是模型復(fù)雜度和預(yù)測(cè)誤差之間的一個(gè)旋鈕。問(wèn)題是怎么知道該擰到哪兒。手動(dòng)試的話我一般會(huì)先按數(shù)量級(jí)試0.001、0.01、0.1、1、10。但這樣做有兩個(gè)明顯的毛病第一靠肉眼比較 R2 和系數(shù)個(gè)數(shù)判斷標(biāo)準(zhǔn)很模糊第二每個(gè) alpha 都要自己跑一遍交叉驗(yàn)證代碼冗長(zhǎng)不說(shuō)如果數(shù)據(jù)預(yù)處理沒(méi)統(tǒng)一比較出來(lái)的結(jié)果根本沒(méi)有意義。這就是 LassoCV 出現(xiàn)的理由。它把“候選 alpha 生成 交叉驗(yàn)證評(píng)估”打包成一步用一套標(biāo)準(zhǔn)流程替你把最佳 alpha 找出來(lái)。2. 手動(dòng)調(diào) alpha 為什么不行LassoCV 到底做了什么2.1 手動(dòng)網(wǎng)格搜索的三個(gè)坑手動(dòng)網(wǎng)格搜索不是不行而是容易在細(xì)節(jié)上翻車。先說(shuō)第一個(gè)坑評(píng)估指標(biāo)不統(tǒng)一。我最初調(diào)參的時(shí)候喜歡用訓(xùn)練集 R2 判斷后來(lái)發(fā)現(xiàn)訓(xùn)練集 R2 隨著 alpha 減小一路走高總覺(jué)得模型越調(diào)越好換到驗(yàn)證集就完全不是一回事。改用驗(yàn)證集評(píng)估后又因?yàn)閯澐址绞讲还潭看螌?duì)比都帶著隨機(jī)誤差很難判斷兩個(gè)接近的 alpha 到底誰(shuí)更好。第二個(gè)坑是候選范圍靠猜。alpha 的最優(yōu)值跟數(shù)據(jù)本身的尺度有關(guān)特征量級(jí)不同合適的 alpha 可能相差幾個(gè)數(shù)量級(jí)。我見(jiàn)過(guò)有人固定從 0.01 到 1 里選結(jié)果真實(shí)最優(yōu)值在 0.001 到 0.01 之間整個(gè)搜索區(qū)間都沒(méi)覆蓋到。第三個(gè)坑是計(jì)算資源的浪費(fèi)。手動(dòng)跑多個(gè) alpha 的話每次都要重新做一次訓(xùn)練和預(yù)測(cè)。如果數(shù)據(jù)量稍大哪怕單個(gè) Lasso 很快幾十個(gè) alpha 疊起來(lái)也很耗時(shí)。而 LassoCV 里有一套路徑算法能一次性計(jì)算出整條系數(shù)路徑上的多組解性能上遠(yuǎn)比手動(dòng)循環(huán)好。2.2 交叉驗(yàn)證的基本思路交叉驗(yàn)證的本質(zhì)是把訓(xùn)練數(shù)據(jù)切成幾份輪流拿其中一份當(dāng)驗(yàn)證集其余當(dāng)訓(xùn)練集最終用各輪驗(yàn)證誤差的平均值來(lái)衡量某個(gè) alpha 的泛化表現(xiàn)。LassoCV 默認(rèn)用的是 K 折交叉驗(yàn)證。假如 cv5數(shù)據(jù)會(huì)被分成 5 份每次拿 4 份訓(xùn)練、1 份驗(yàn)證跑 5 輪每一份數(shù)據(jù)都有機(jī)會(huì)當(dāng)一次驗(yàn)證集。最后把 5 輪誤差平均得到一個(gè)穩(wěn)定評(píng)分。這么做相比單次劃分驗(yàn)證集的好處很明顯單次劃分結(jié)果受隨機(jī)性影響太大如果劃分恰好讓驗(yàn)證集分布不均評(píng)分就會(huì)失真。交叉驗(yàn)證等于把隨機(jī)性平均掉選擇結(jié)果更可信。2.3 LassoCV 的候選 alpha 路徑機(jī)制LassoCV 內(nèi)部并不是盲目地在某個(gè)范圍里均勻取樣而是通過(guò)坐標(biāo)下降法沿正則化路徑計(jì)算出一組候選 alpha然后對(duì)這些候選逐一做交叉驗(yàn)證。說(shuō)人話就是它從大到小掃描 alpha對(duì)每個(gè) alpha 都計(jì)算系數(shù)路徑然后結(jié)合交叉驗(yàn)證給出誤差曲線。最終模型選的是交叉驗(yàn)證誤差最小的 alpha如果參數(shù) selection 設(shè)置成 “random”模型還會(huì)在誤差均值上下一個(gè)標(biāo)準(zhǔn)差的最小值里做選擇這是為了防止過(guò)度追求極小值而過(guò)擬合。這一點(diǎn)在很多教程里被忽略但其實(shí)非常關(guān)鍵。LassoCV 不只是幫你跑了個(gè)交叉驗(yàn)證它連 alpha 候選集都幫你生成好了你要做的只是把 max_iter 和 cv 這種參數(shù)設(shè)置合理。3. 用 LassoCV 選擇最佳正則化參數(shù)完整實(shí)操3.1 數(shù)據(jù)準(zhǔn)備與預(yù)處理順序用一個(gè)模擬的回歸數(shù)據(jù)集做演示重點(diǎn)看流程。import numpy as np import pandas as pd from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LassoCV from sklearn.metrics import mean_squared_error X, y make_regression( n_samples300, n_features30, n_informative10, noise0.05, random_state42 ) X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 )預(yù)處理這一步很容易出問(wèn)題。Lasso 對(duì)特征的量綱敏感別把標(biāo)準(zhǔn)化放在劃分?jǐn)?shù)據(jù)集之前。正確做法是先劃分訓(xùn)練集和測(cè)試集再在訓(xùn)練集上擬合標(biāo)準(zhǔn)化器然后分別轉(zhuǎn)換訓(xùn)練集和測(cè)試集。scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)順序?qū)Σ簧蠒?huì)引入信息泄漏如果先在整個(gè)數(shù)據(jù)集上做標(biāo)準(zhǔn)化再劃分那測(cè)試集的信息其實(shí)已經(jīng)參與了訓(xùn)練過(guò)程評(píng)估結(jié)果會(huì)比真實(shí)落地場(chǎng)景樂(lè)觀上線后成績(jī)縮水是必然的。這個(gè)坑我踩過(guò)后來(lái)每次寫(xiě)預(yù)處理都要先劃分再標(biāo)準(zhǔn)化。3.2 核心調(diào)用與關(guān)鍵參數(shù)選擇接下來(lái)是 LassoCV 的核心調(diào)用。lasso_cv LassoCV( eps0.001, n_alphas100, cv5, max_iter100000, random_state42 ) lasso_cv.fit(X_train_scaled, y_train)這里幾個(gè)參數(shù)值得單獨(dú)說(shuō)。eps 控制 alpha 路徑的最小值與最大值的比例默認(rèn)是 0.001意味著路徑會(huì)掃描到最大 alpha 的千分之一。n_alphas 是候選 alpha 的個(gè)數(shù)默認(rèn) 100數(shù)據(jù)量大時(shí)可以調(diào)大一點(diǎn)讓路徑更細(xì)。cv 是交叉驗(yàn)證折數(shù)小型數(shù)據(jù)集用 5 或 10 都行數(shù)據(jù)量小的時(shí)候折數(shù)太多會(huì)讓每一折的訓(xùn)練集過(guò)小方差反而變大。max_iter 是坐標(biāo)下降的最大迭代次數(shù)如果收到收斂警告就要調(diào)大。random_state 固定隨機(jī)性讓復(fù)現(xiàn)結(jié)果一致。3.3 從訓(xùn)練結(jié)果里提取最佳 alpha 和啞變量擬合完以后最關(guān)心的幾個(gè)屬性是best_alpha lasso_cv.alpha_ best_score lasso_cv.score(X_test_scaled, y_test) print(Best alpha:, best_alpha) print(Test R2:, best_score) print(Number of nonzero coefficients:, int(np.sum(lasso_cv.coef_ ! 0)))alpha_ 就是模型最終選出來(lái)的最佳正則化參數(shù)。coef_ 是此時(shí)各特征的系數(shù)其中等于 0 的特征就是被 Lasso 剔除的特征??梢耘浜?pandas 把系數(shù)和特征名對(duì)應(yīng)起來(lái)看feature_names [ffeature_{i} for i in range(X.shape[1])] coef_df pd.DataFrame({ feature: feature_names, coef: lasso_cv.coef_ }) coef_df coef_df.sort_values(coef, keylambda col: col.abs(), ascendingFalse) print(coef_df.head(15))很多人在這一步會(huì)踩一個(gè)坑訓(xùn)練時(shí)用的是標(biāo)準(zhǔn)化之后的特征所以 coef_ 反映的標(biāo)準(zhǔn)化的尺度。要解釋回原始量綱就得把系數(shù)除以對(duì)應(yīng)特征的標(biāo)準(zhǔn)差或者干脆用標(biāo)準(zhǔn)化前的系數(shù)重新擬合一次。如果只是做預(yù)測(cè)和篩選用標(biāo)準(zhǔn)化后的系數(shù)即可。3.4 可視化交叉驗(yàn)證誤差曲線判斷 LassoCV 是否選得靠譜最直接的方式是看 alpha 路徑圖。import matplotlib.pyplot as plt plt.figure(figsize(8, 5)) plt.plot(lasso_cv.alphas_, lasso_cv.mse_path_.mean(axis-1), labelCV MSE) plt.axvline(lasso_cv.alpha_, linestyle--, colorred, labelBest alpha) plt.xscale(log) plt.xlabel(alpha) plt.ylabel(Mean squared error) plt.legend() plt.show()mse_path_ 是一個(gè)二維數(shù)組形狀為 (n_alphas, n_folds)記錄了每個(gè) alpha 在每一折上的均方誤差。平均值最低的位置就是最優(yōu) alpha 附近??催@張圖有兩個(gè)好處一是確認(rèn) alpha 的選擇區(qū)間是否覆蓋了最低點(diǎn)如果最低點(diǎn)在路徑邊緣說(shuō)明 eps 或者 n_alphas 設(shè)置不合適需要擴(kuò)大搜索范圍二是看曲線是否平坦如果最低點(diǎn)左右兩條曲線的差距非常小說(shuō)明 alpha 在一定范圍內(nèi)都不敏感這時(shí)候可以選更大的 alpha 換取更強(qiáng)的稀疏性。下圖不是必須的但線上說(shuō)明文檔里這張圖通常比一長(zhǎng)串?dāng)?shù)字更能說(shuō)服人。4. 實(shí)際跑 LassoCV 時(shí)遇到的常見(jiàn)問(wèn)題與排查4.1 收斂警告坐標(biāo)下降沒(méi)有走完用默認(rèn) max_iter 跑大特征集時(shí)經(jīng)常收到類似 “ConvergenceWarning: Objective did not converge” 的提示。這個(gè)問(wèn)題的直接原因是迭代次數(shù)不夠坐標(biāo)下降算法還沒(méi)找到足夠好的解就被強(qiáng)制停了。遇到這個(gè)情況第一反應(yīng)是把 max_iter 調(diào)大比如從 1000 調(diào)到 50000。如果調(diào)大之后警告消失說(shuō)明只是迭代次數(shù)不足。如果警告還在那要檢查特征是否有極端異常值或者特征標(biāo)準(zhǔn)化的過(guò)程中有沒(méi)有產(chǎn)生 NaN 或無(wú)窮大。我試過(guò)一次數(shù)據(jù)里混進(jìn)了一個(gè)異常大的值標(biāo)準(zhǔn)化之后標(biāo)準(zhǔn)差被拉高很多特征變成微小數(shù)值坐標(biāo)下降在數(shù)值上就變得非常不穩(wěn)定。先做異常值截?cái)嘣贅?biāo)準(zhǔn)化整個(gè)訓(xùn)練就順暢了。4.2 數(shù)據(jù)標(biāo)準(zhǔn)化、缺失值和啞變量的處理順序先處理缺失值再標(biāo)準(zhǔn)化是基本原則。缺失值如果在標(biāo)準(zhǔn)化之后才補(bǔ)填充值的位置會(huì)產(chǎn)生偏差。尤其是用均值填充的時(shí)候標(biāo)準(zhǔn)化后的均值是 0填充值會(huì)直接落在均值位置倒是沒(méi)太大問(wèn)題但用中位數(shù)或者其他方式填充標(biāo)準(zhǔn)化前后的結(jié)果就會(huì)不一樣。更需要注意的是啞變量編碼。分類型特征經(jīng)過(guò) one-hot 編碼后如果再做標(biāo)準(zhǔn)化每一列只有 0 和 1標(biāo)準(zhǔn)化后會(huì)出現(xiàn)正負(fù)值這會(huì)破壞編碼的稀疏結(jié)構(gòu)。我的做法是數(shù)值型特征標(biāo)準(zhǔn)化啞變量保持 0/1 不參與標(biāo)準(zhǔn)化最后歸一化特征矩陣時(shí)用列合并。sklearn 里可以用 ColumnTransformer 來(lái)控制不同列使用不同的預(yù)處理流程。4.3 交叉驗(yàn)證結(jié)果的隨機(jī)性和穩(wěn)定性LassoCV 的交叉驗(yàn)證結(jié)果不是百分之百穩(wěn)定的原因在于每折數(shù)據(jù)劃分的隨機(jī)性。同樣一份數(shù)據(jù)cv5 但 random_state 不同選出的 alpha 可能略有差別。如果項(xiàng)目對(duì)穩(wěn)定性要求高我通常會(huì)把 random_state 固定成一個(gè)值用于復(fù)現(xiàn)同時(shí)把 cv 設(shè)置為 10 或者更多折折數(shù)越多評(píng)估均值越穩(wěn)定。另一種做法是重復(fù)多次 LassoCV 并觀察 alpha 的分布如果幾次結(jié)果都在同一個(gè)數(shù)量級(jí)那這個(gè) alpha 區(qū)間基本可信如果分布極分散數(shù)據(jù)量太小或者特征噪聲太大單純調(diào) alpha 已經(jīng)救不了模型。4.4 稀疏結(jié)果是不是永遠(yuǎn)更好Lasso 把很多系數(shù)變成了 0看起來(lái)模型變精簡(jiǎn)了但稀疏度高不等于預(yù)測(cè)好。有些場(chǎng)景里特征之間的共線性比較強(qiáng)Lasso 可能隨機(jī)選中其中一個(gè)相關(guān)特征剔除另一個(gè)導(dǎo)致系數(shù)不穩(wěn)定。這個(gè)時(shí)候可以回退看下嶺回歸的結(jié)果或者用 ElasticNet 這種同時(shí)包含 L1 和 L2 懲罰的模型它在稀疏性和穩(wěn)定性之間取了一個(gè)折中。我的經(jīng)驗(yàn)是如果 Lasso 選出的特征每次跑都不太一樣優(yōu)先懷疑數(shù)據(jù)里有強(qiáng)相關(guān)特征組而不是 alpha 設(shè)置不合理。5. 讓 LassoCV 結(jié)果更穩(wěn)的幾個(gè)工程細(xì)節(jié)5.1 用信息準(zhǔn)則做交叉驗(yàn)證的互補(bǔ)驗(yàn)證交叉驗(yàn)證不是唯一的選擇標(biāo)準(zhǔn)還可以用 BIC 或 AIC 來(lái)輔助判斷。sklearn 里雖然不直接提供 BIC 計(jì)算但可以基于擬合后的 Lasso 路徑自己算。思路很簡(jiǎn)單對(duì)每一個(gè)候選 alpha取對(duì)應(yīng)系數(shù)計(jì)算訓(xùn)練集上的對(duì)數(shù)似然或殘差平方和再加上懲罰項(xiàng)。BIC 的懲罰項(xiàng)比 AIC 更重傾向于選擇更稀疏的模型。如果交叉驗(yàn)證選出來(lái)的 alpha 和 BIC 選出來(lái)的 alpha 數(shù)量級(jí)接近說(shuō)明這個(gè)選擇比較可靠如果差得很遠(yuǎn)就去檢查數(shù)據(jù)劃分和預(yù)處理環(huán)節(jié)。我通常在模型選型階段把這兩種方式的結(jié)果并排看一眼不需要當(dāng)成硬指標(biāo)但能提供額外的信心。5.2 特征量綱與縮放處理的統(tǒng)一之前提到過(guò)標(biāo)準(zhǔn)化要在劃分之后做還有一個(gè)細(xì)節(jié)是縮放器要保存下來(lái)。線上部署時(shí)新進(jìn)來(lái)的數(shù)據(jù)也要用同一個(gè)縮放器轉(zhuǎn)換不能重新 fit。保存縮放器的方式很簡(jiǎn)單用 joblib 或者 pickle 把 StandardScaler 和訓(xùn)練好的 LassoCV 一起打包。我第一次部署時(shí)忘了保存縮放器只保存了模型結(jié)果線上預(yù)測(cè)值全部偏差排查半天才發(fā)現(xiàn)輸入沒(méi)做同樣的標(biāo)準(zhǔn)化。這個(gè)錯(cuò)誤一點(diǎn)都不高級(jí)但確實(shí)常見(jiàn)。5.3 先做一次基準(zhǔn)線性回歸再對(duì)比不要一上來(lái)就跑 LassoCV。先訓(xùn)練一次普通線性回歸記錄它的測(cè)試集 R2 和均方誤差把這個(gè)當(dāng)成基準(zhǔn)線。然后跑 LassoCV 和嶺回歸三家對(duì)比。這個(gè)習(xí)慣的好處是能判斷正則化到底有沒(méi)有帶來(lái)提升。有些數(shù)據(jù)集特征本來(lái)就少共線性也低普通線性回歸已經(jīng)很好Lasso 強(qiáng)行加懲罰反而降低預(yù)測(cè)精度。這時(shí)選出來(lái)的最佳 alpha 可能很小接近于普通回歸但至少你知道自己為什么選它。5.4 嘗試隨機(jī)化的 alpha 選擇與穩(wěn)定性分析除了默認(rèn)的交叉驗(yàn)證LassoCV 還支持 selectionrandom它會(huì)基于某條隨機(jī)化路徑選擇 alpha而不是單純選交叉驗(yàn)證誤差最小的點(diǎn)。隨機(jī)化路徑的主要作用是在誤差曲線比較平坦的時(shí)候避免因?yàn)閿?shù)值噪聲而選到一個(gè)過(guò)于復(fù)雜的模型。想更穩(wěn)妥地做穩(wěn)定性分析我建議對(duì)特征數(shù)據(jù)做 bootstrap 重采樣每次跑一次 LassoCV記錄被保留的特征集合。重復(fù)幾十次之后統(tǒng)計(jì)每個(gè)特征被選中的頻率。那些高頻率出現(xiàn)的特征才是真正值得信任的核心變量只會(huì)偶爾被選中的特征留著不加進(jìn)來(lái)對(duì)模型影響也不大。5.5 實(shí)際部署時(shí)別用訓(xùn)練時(shí)的全量數(shù)據(jù)重訓(xùn)模型調(diào)完之后很多人的習(xí)慣是用全量數(shù)據(jù)重新訓(xùn)練一次認(rèn)為這樣能把信息用足。對(duì) LassoCV 來(lái)說(shuō)這個(gè)操作要小心。用全量數(shù)據(jù)重訓(xùn)意味著交叉驗(yàn)證的折內(nèi)評(píng)估結(jié)果只適合做 alpha 選擇參考最終模型并沒(méi)有跟著更新。如果你用全量數(shù)據(jù)重新 fit 一次選定的 alpha 不變但模型的系數(shù)會(huì)基于全量數(shù)據(jù)重新估計(jì)這沒(méi)問(wèn)題。問(wèn)題在于有些人重訓(xùn)之后又把 LassoCV 的交叉驗(yàn)證評(píng)分當(dāng)成新模型的預(yù)期精度這是錯(cuò)的預(yù)期精度應(yīng)該用之前單獨(dú)的測(cè)試集來(lái)評(píng)估。我一般流程是先用訓(xùn)練集跑 LassoCV 選 alpha再用這個(gè) alpha 在訓(xùn)練集上重新訓(xùn)練一個(gè) Lasso最后在測(cè)試集上評(píng)估并保存模型。這樣既統(tǒng)一了流程也不容易出現(xiàn)評(píng)估偏差。6. 一點(diǎn)個(gè)人經(jīng)驗(yàn)項(xiàng)目里選擇正則化參數(shù)這件事看起來(lái)只是調(diào)一個(gè)數(shù)本質(zhì)上卻是在跟過(guò)擬合博弈。用過(guò) LassoCV 之后我最大的感受是它把調(diào)參變成了一個(gè)標(biāo)準(zhǔn)動(dòng)作省下來(lái)的時(shí)間可以花在更值得研究的問(wèn)題上比如特征關(guān)系、預(yù)處理邏輯、模型部署的穩(wěn)定性。我踩過(guò)最貴的一次坑是換了數(shù)據(jù)分布卻忘了重新交叉驗(yàn)證直接把舊模型的 alpha 拿過(guò)來(lái)用結(jié)果預(yù)測(cè)偏差大得離譜。后來(lái)養(yǎng)成一個(gè)習(xí)慣只要數(shù)據(jù)源有變化哪怕只是數(shù)據(jù)量變了也會(huì)重新跑一遍 LassoCV而不是迷信之前的參數(shù)。模型永遠(yuǎn)要跟著數(shù)據(jù)走這是用過(guò) LassoCV 之后最真實(shí)的體會(huì)。