想象你是一家餐厅的老板,后厨里有一位才华横溢但爱走极端的大厨。给他定太多规矩,他束手束脚,端出来的菜清汤寡水,顾客抱怨“没灵魂”;完全不管他,他又放飞自我,堆满花哨辅料,第一口惊艳,多吃几口腻到发慌。机器学习模型也有这般脾性——它能把训练数据里的每个细节都学得滴水不漏,也可能学得过于简单、像个没感情的复读机。管住它的那本“后厨守则”,就叫正则系数(λ)。 定 λ 不能拍脑袋。专业的做法是:先把一本“从极严到极松”的候选守则清单用科学刻度铺开(对数尺度),让每种守则都试运营一轮,请一组评委轮流盲品打分(交叉验证),挑出综合评分最高的那一版守则(最优 λ),最后再请一位从没露过面的神秘顾客(测试集)做终审考核。这套完整的流程,就叫“系统化搜索最佳正则系数”。

岗位关联

掌握这套方法,你就能在岭回归、Lasso 等任何带惩罚项的模型上科学地定下惩罚力度,告别“拍脑袋调参”,这也是正则化模型从实验室走向上线的必过关卡。

目录
  1. 可视化演示
  2. 正则化本质:给大厨定规矩
  3. 惩罚项类型:守则的两种写法
  4. 搜索范围设定:先画一条“咸淡谱系”
  5. 网格扫描策略:每个档位都试运营一天
  6. 交叉验证评估:请五位评委轮流盲品
  7. 最优系数选取:分数最低者胜出,平手选简单
  8. 上线前验证:神秘顾客的终审
  9. 常见调参陷阱:后厨翻车现场
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

正则化本质:给大厨定规矩

你接手一家餐厅,后厨里有一位叫“模型”的大厨。给他完全自由的发挥空间,他能把每道菜都做得精巧繁复、每个细节都独一无二——但那是一种“背题式”的表演,换一批食材立刻抓瞎。管得太严呢,他又只会做白水煮菜,安全保险,却毫无滋味。正则化,就是给这位大厨定规矩;而正则系数 λ,就是那本后厨守则的“严格程度”。

在机器学习里,模型拟合数据的过程,就是“大厨钻研菜谱”的过程。一个复杂到极致的模型能记住训练集里的每一个噪声点,好比大厨把每片香菜都摆成独一无二的造型,这种“精细化到病态”的本领叫过拟合;反过来,模型结构过于简单,连数据的大致走向都拟合不出来,叫欠拟合。两者之间的权衡,正是 λ 要调节的核心矛盾。

防止过拟合的通用做法,是在损失函数(“顾客不满意程度”)后面追加一笔“花活账单”,即惩罚项:

λ 调小时,守则宽松,大厨的创意淋漓尽致,但菜品容易油腻浮夸;λ 调大时,守则森严,大厨如履薄冰,菜变得清淡保险。系统化搜索,就是在“宽松版守则”和“严格版守则”之间,找到那份恰好让顾客满意、又不会腻的版本。

L(β)=1n∑i=1n(yi−y^i)2+λ⋅P(β)\displaystyle L(\beta) = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \cdot P(\beta)
前半段是模型在训练集上的“基本厨艺分”,后半段是 λ 乘以“花活程度”,λ 越大,花活被扣得越狠。
  1. 认识未知量 ββ 是模型的回归系数,相当于大厨记录下来的“每种调料的用量表”
    β=(β1,β2,…,βp)\beta = (\beta_1, \beta_2, \dots, \beta_p)
  2. 第一项是训练误差逐个样本计算预测值与真实值的差距,取平方后求平均,衡量“菜端上桌后顾客当场的不满”
    1n∑i=1n(yi−y^i)2\frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2
  3. 第二项是惩罚项P(β) 统计“花活程度”,λ 决定守则的严格程度
    λ⋅P(β)\lambda \cdot P(\beta)
  4. 加号连接两边训练误差与惩罚互相拉扯,λ 是把天平从“只求顾客满意”推向“克制花活”的砝码
    L(β)=训练误差+λ×花活程度L(\beta) = \text{训练误差} + \lambda \times \text{花活程度}

惩罚项类型:守则的两种写法

后厨守则可以写成两种风格。一种叫“平方记过制”——哪个调料用量越大,记过的分值就越大,逼着所有调料一起收敛到低调;另一种叫“绝对值劝退制”——只盯着“要不要用这味料”,可要可不要的,直接罚到禁用。两种写法的差别,决定了模型最后长什么样。

平方记过制就是 L2 正则,也叫岭回归(Ridge)。它把所有回归系数取平方再求和,对大的系数施以更重的惩罚,结果是所有特征都被保留,但权重整体缩小——像给每道菜都收一勺油,整体更清淡,但食材还是很丰富。绝对值劝退制就是 L1 正则,也叫套索回归(Lasso)。它把回归系数取绝对值再求和,惩罚在零点附近有个“尖角”,会让一部分系数被精确压成 0——像直接把一些可有可无的辅料从后厨菜单里划掉,留下的都是必不可少的核心食材。

现实中常常两者混用,叫弹性网络(Elastic Net)——既想让整体收敛,又想要稀疏结构,就像“先砍掉多余辅料,再给每道菜勾个清淡的芡”。正则系数搜索的对象,正是守则里那个“严格程度刻度”,它要统管这些不同款式的守则。

L2: λ∑j=1pβj2,L1: λ∑j=1p∣βj∣\displaystyle \text{L2: } \lambda \sum_{j=1}^{p} \beta_j^2, \qquad \text{L1: } \lambda \sum_{j=1}^{p} |\beta_j|
L2 是“整体减油”的清汤风格,L1 是“砍掉辅料”的极简风格。
  1. L2 用平方记账每个系数平方后累加,系数越大,被记的“过”涨得越快
    λ∑j=1pβj2\lambda \sum_{j=1}^{p} \beta_j^2
  2. 平方的放大效应当系数绝对值大于 1 时,平方数远大于绝对值,大系数被打压得更狠
    βj2≫∣βj∣(当 ∣βj∣>1)\beta_j^2 \gg |\beta_j| \quad (\text{当 } |\beta_j| > 1)
  3. L1 用绝对值记账每个系数取绝对值后累加,只关心“用了没有、用了多大”,不分轻重地记过
    λ∑j=1p∣βj∣\lambda \sum_{j=1}^{p} |\beta_j|
  4. L1 的稀疏效果绝对值函数在 0 处有一个“棱角”,最省钱的解法就是让无关系数恰好停在 0
    ∣βj∣=0 ⇔ βj 被彻底移除|\beta_j| = 0 \ \Leftrightarrow \ \beta_j \text{ 被彻底移除}

搜索范围设定:先画一条“咸淡谱系”

守则的严格程度该从几试到几?如果只凭感觉,有人会选 0.1、0.2、0.3 这样“看起来整齐”的数列——但这恰恰是最容易犯的错。正则化对 λ 的响应不是线性的:λ 从 1 涨到 2,惩罚力度几乎没变化;从 1 涨到 10,模型一下子朴素了一大截。所以后厨要准备的,是一本按“严格程度每翻 10 倍取一档”的草稿本,这就是对数尺度。

常规范围从 0.001 到 100,横跨 5 个数量级。如果按线性均匀取 20 个点,几乎全部挤在 0 到 1 之间,0.001 附近的微小值根本照顾不到;按对数尺度取,则每一档在数轴上是等距的,既覆盖了“极宽松”的放飞区,也覆盖了“极严格”的清汤区。候选值 λ_k 用等比数列生成:

有了这本“咸淡谱系”,接下来要做的事情就纯粹了:把每一档守则都真刀真枪地试一遍,而不是靠猜。范围定得对不对、档位密不密,直接决定后面所有评估是否值得信任。

λk=λmin⁡×(λmax⁡λmin⁡)kK−1,k=0,1,…,K−1\displaystyle \lambda_k = \lambda_{\min} \times \left( \frac{\lambda_{\max}}{\lambda_{\min}} \right)^{\frac{k}{K-1}}, \quad k = 0, 1, \dots, K-1
从边界 λ_min 到 λ_max,每一步乘以同一个固定倍率,让候选在对数轴上均匀分布。
  1. 定两端先确定搜索的左边界和右边界,比如从 0.001 到 100
    0.001≤λ≤1000.001 \le \lambda \le 100
  2. 算总倍数算出右边界是左边界的多少倍,这里是 100 / 0.001 = 100000 倍
    λmax⁡λmin⁡=105\frac{\lambda_{\max}}{\lambda_{\min}} = 10^{5}
  3. 等比分档把总倍数开 K-1 次方得到公比 r,每个候选是前一个的 r 倍
    λk=λmin⁡×rk,r=(λmax⁡λmin⁡)1K−1\lambda_k = \lambda_{\min} \times r^{k}, \quad r = \left( \frac{\lambda_{\max}}{\lambda_{\min}} \right)^{\frac{1}{K-1}}
  4. 对数坐标等距对 λ_k 取 log10,相邻两档在对数轴上的距离恒等于固定值
    log⁡10λk=log⁡10λmin⁡+k⋅Δ\log_{10} \lambda_k = \log_{10} \lambda_{\min} + k \cdot \Delta

网格扫描策略:每个档位都试运营一天

草稿本上排了十几二十个候选 λ,接下来没有捷径——把每一版守则都郑重地试运营一天。所谓“试运营”,就是在训练集上拟合出模型(让大厨按守则做一天的菜),然后在验证集上看表现(记录顾客打分)。把所有候选值挨个试一遍,就是网格搜索。

网格搜索的候选点个数由跨度与步长决定。比如总跨度为 5 个数量级,每隔 0.5 个数量级取一个候选,就能铺出 11 个点;如果先用大间隔粗扫定位“最优区域”,再在附近用更小的间隔细扫,就能用更少的计算量换到更高精度——这叫粗扫与细扫。候选点极多时,也可以采用随机采样,只随机试其中一部分,先摸清大局再决定是否加密。

网格扫描就像后厨的“大练兵”:每版守则都有一整天的实战数据,谁好谁坏先不争论,拿分数说话。不过,试运营的成绩单要足够公正——这就需要下面出场的那几位专业评委。

K=⌊log⁡10(λmax⁡/λmin⁡)Δ⌋+1\displaystyle K = \left\lfloor \frac{\log_{10}(\lambda_{\max} / \lambda_{\min})}{\Delta} \right\rfloor + 1
候选点总数 K 等于“总跨度除以对数步长 Δ”向下取整再加一。
  1. 求总跨度先计算搜索范围在对数尺度上跨越多少个数量级
    log⁡10(λmax⁡λmin⁡)\log_{10} \left( \frac{\lambda_{\max}}{\lambda_{\min}} \right)
  2. 除以步长每个候选之间的对数间隔为 Δ,跨度除以步长得到大致能放几个间隔
    log⁡10(λmax⁡/λmin⁡)Δ\frac{\log_{10}(\lambda_{\max}/\lambda_{\min})}{\Delta}
  3. 取整再加一向下取整保证间隔数不超界,再加 1 把起点那一个候选也算上
    K=⌊⋯ ⌋+1K = \left\lfloor \cdots \right\rfloor + 1

交叉验证评估:请五位评委轮流盲品

如果只请一位评委试菜,万一他口味偏咸,就会把“少盐守则”误判成差守则。更稳妥的阵容是请五位评委。交叉验证就是这么一组评委制度:把顾客(数据)随机切成 K 份,每次都留出其中 1 份当评委试菜,其余 K-1 份当厨师助手(训练),轮换 K 次,让每一份数据都当过评委、也都打过下手。最常用的是 K=5 或 K=10,也就是 5 折或 10 折交叉验证。

对某个候选 λ,整套流程的“综合评分”就是把 K 份验证误差求平均:

五位评委轮流盲品、最后取平均,比单独一位评委可信得多。现在守则的每一版草稿都有了一个公平的“市场口碑分”,可以进入最后的决选环节了。

CV(λ)=1K∑k=1KEk(val)(λ)\displaystyle \mathrm{CV}(\lambda) = \frac{1}{K} \sum_{k=1}^{K} E_k^{(\mathrm{val})}(\lambda)
每一位评委都给出独立打分,取平均后能抹平个别评委的口味偏差,评分更可靠。
  1. 数据先切分把全部 n 个样本随机均匀切成 K 份,第 k 份记为 V_k
    V1∪V2∪⋯∪VK={1,2,…,n}V_1 \cup V_2 \cup \cdots \cup V_K = \{1, 2, \dots, n\}
  2. 第 k 折的验证误差用第 k 折当评委,其余折当教练,算出这一折上的均方误差
    Ek(val)(λ)=1∣Vk∣∑i∈Vk(yi−y^i(−k))2E_k^{(\mathrm{val})}(\lambda) = \frac{1}{|V_k|} \sum_{i \in V_k} (y_i - \hat{y}_i^{(-k)})^2
  3. 对折数取平均把 K 份独立的验证误差相加再除以 K,得到该 λ 的交叉验证分数
    CV(λ)=1K∑k=1KEk(val)(λ)\mathrm{CV}(\lambda) = \frac{1}{K} \sum_{k=1}^{K} E_k^{(\mathrm{val})}(\lambda)

最优系数选取:分数最低者胜出,平手选简单

候选守则们都有了自己的综合评分。决选规则很朴素:哪一版守则的交叉验证误差最小,就选哪一版。不过,这个“最小”要加上一个重要的条件——只能在候选集合里比,不能跑到集合外面去比,更不能偷看测试集的分数:

光看误差还不够,还有两条经验法则。其一,简洁性原则:如果多个 λ 的分数几乎一样,选更大(更严格、更简单)的那个——因为简单模型更容易解释、也更抗扰动。其二,稳定性检查:换几个随机种子重跑交叉验证,如果最优 λ 剧烈跳动,说明数据量不够或范围不理想。分数最低者胜出,但“分数差不多时选简单”,这是老后厨都知道的处世之道。

λ∗=arg⁡min⁡λ∈ΛCV(λ)\displaystyle \lambda^{*} = \arg\min_{\lambda \in \Lambda} \mathrm{CV}(\lambda)
argmin 的意思是:从候选集合 Λ 里,找出让 CV(λ) 取得最小值的那一个 λ。
  1. 候选集合 ΛΛ 是网格搜索阶段铺好的全部候选 λ 的集合
    Λ={λ0,λ1,…,λK−1}\Lambda = \{\lambda_0, \lambda_1, \dots, \lambda_{K-1}\}
  2. 逐一算出分数对集合中每一个 λ 都做一次完整的交叉验证,得到一组分数
    CV(λ0),CV(λ1),…,CV(λK−1)\mathrm{CV}(\lambda_0), \mathrm{CV}(\lambda_1), \dots, \mathrm{CV}(\lambda_{K-1})
  3. 挑出分数最小者argmin 表示“使得括号里式子取最小值的那个输入”
    λ∗=arg⁡min⁡λ∈ΛCV(λ)\lambda^{*} = \arg\min_{\lambda \in \Lambda} \mathrm{CV}(\lambda)

上线前验证:神秘顾客的终审

守则选定了、模型也炼成了,是不是就能直接挂牌营业?还差最后一道关卡:那位从开始到现在都没露过面的“神秘顾客”——测试集。它全程没有参与选 λ、没有参与训练,也没在交叉验证里当过评委,是完完全全的陌生面孔。

用定稿的 λ 重新在全部训练数据上训练模型,然后在测试集上做一次预测,算出的误差就是这台模型将来面对真实世界的“预估成绩单”:

神秘顾客的分数如果和交叉验证的分数差得不远,说明模型是“真功夫”而不是“背了评委的喜好”;如果差得很远,就要回头检查是不是中途出了岔子。除了看误差,还要看看回归系数是否符合业务直觉——比如“收入越高违约率越低”这种常识被模型学反了,λ 再好看也不能上线。

Etest=1m∑i=1m(yi−y^i)2\displaystyle E_{\mathrm{test}} = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2
m 是测试集样本数,这条公式算的是“神秘顾客”对模型表现的最终打分。
  1. 神秘顾客出场测试集 D_test 包含 m 个样本,整条流水线从未用过它们
    Dtest={(x1,y1),(x2,y2),…,(xm,ym)}D_{\mathrm{test}} = \{(x_1, y_1), (x_2, y_2), \dots, (x_m, y_m)\}
  2. 用定稿模型预测用选定的 λ 重新训练模型,对测试集逐样本做出预测
    y^i=fλ∗(xi)\hat{y}_i = f_{\lambda^{*}}(x_i)
  3. 计算最终误差对 m 个样本的误差平方取平均,得到模型上线前的最终成绩单
    Etest=1m∑i=1m(yi−y^i)2E_{\mathrm{test}} = \frac{1}{m} \sum_{i=1}^{m} (y_i - \hat{y}_i)^2

常见调参陷阱:后厨翻车现场

最后把这些年调参踩过的坑集中盘点一遍,每一个都能在“后厨”里找到对应画面。

陷阱一:数据泄漏——评委提前偷看了菜谱。比如做特征缩放(标准化)时,用了全部数据的均值与方差,验证折的信息就混进了训练过程,评委打分自然虚高。陷阱二:训练集幻觉——厨子自己夸自己。只在训练集上看误差,模型当然“完美”,但它背下了菜谱,一换新菜就露馅。陷阱三:范围过窄——草稿本根本没覆盖合理区间。比如把范围定成 0.01 到 0.1,最优值可能在 5 附近,搜得再精细也白搭。

应对这些陷阱,除了前述的交叉验证与独立测试集,还有一个常被忽略的补救动作:当交叉验证误差曲线在最小值附近相当平坦时,不要执着于“误差最小的那个 λ”,而是采用“一个标准差原则”——在误差和最小值差不多的所有候选里,选最大的 λ,也就是最简洁的模型:

调参从来不是“一锤子买卖”。数据更新了、业务变了,旧的最优 λ 可能就失效了,要重新走一遍搜索流程。记住这些翻车现场,你就能在系统化搜索的路上少摔几个跟头。

λfinal=max⁡{λ∈Λ  |  CV(λ)≤CVmin⁡+ε}\displaystyle \lambda_{\mathrm{final}} = \max \left\{ \lambda \in \Lambda \;\middle|\; \mathrm{CV}(\lambda) \le \mathrm{CV}_{\min} + \varepsilon \right\}
ε 是一个很小的容忍量,这个公式帮你在“分数差不多的守则”里挑最省事的一版。
  1. 设一个容忍带在最优误差之上加一个小阈值 ε,画出一条“合格线”
    CVmin⁡+ε\mathrm{CV}_{\min} + \varepsilon
  2. 找出带内最大的 λ凡是不超过合格线的候选都算合格,在合格者中挑严格程度最大的
    max⁡{λ∈Λ  |  CV(λ)≤CVmin⁡+ε}\max \left\{ \lambda \in \Lambda \;\middle|\; \mathrm{CV}(\lambda) \le \mathrm{CV}_{\min} + \varepsilon \right\}

AI 应用场景

信贷风控的 Lasso 特征筛选

阶段:特征工程与模型调优

解决的问题:信贷申请数据常有几十上百个特征,直接喂给逻辑回归既难解释、又容易过拟合。以往靠业务经验手工挑特征,主观且耗时;用 Lasso 回归配合系统化的 λ 搜索,可以自动把无关特征系数压到 0,同时用交叉验证挑出泛化性能最好的惩罚力度。

具体案例:某消费金融公司对 80 个用户特征做 Lasso 评分卡,用对数尺度从 0.001 到 100 生成 20 个候选 λ,5 折交叉验证后选了 λ=0.47,最终模型只保留了 23 个特征,KS 值比手挑特征模型提升 6%,且每条决策都能追溯到明确的业务含义。

电商销量预测的岭回归稳定性调优

阶段:模型训练与上线验证

解决的问题:销量预测中特征高度相关,普通线性回归的系数会剧烈抖动,换一个月的数据结果就面目全非。传统做法手工试几个 λ,没有依据;用 Ridge + 网格搜索 + 交叉验证,能找到让系数稳定、预测误差又小的最优 λ,且测试集验证能确保模型真实可用。

具体案例:某电商平台对 300 个商品做周销量预测,特征包含价格、促销、节假日等 45 维。用对数尺度扫描 λ,交叉验证选定 λ=3.2 后,模型在连续 8 周的新数据上的预测误差比默认 λ=1 降低了 12%,线上 A/B 测试 GMV 提升 2.1%。

Python 演示

python41 行
import numpy as npfrom sklearn.datasets import make_regressionfrom sklearn.linear_model import Ridgefrom sklearn.metrics import mean_squared_errorfrom sklearn.model_selection import KFold  def search_best_alpha(X, y, alphas, n_splits=5, seed=42):    """用K折交叉验证扫描候选正则系数,返回最优alpha及得分列表。"""    kf = KFold(n_splits=n_splits, shuffle=True, random_state=seed)    best_alpha = None    best_cv = float("inf")    score_list = []    for alpha in alphas:        fold_errors = []        for train_idx, val_idx in kf.split(X):            model = Ridge(alpha=alpha)            model.fit(X[train_idx], y[train_idx])            pred = model.predict(X[val_idx])            fold_errors.append(mean_squared_error(y[val_idx], pred))        cv_score = float(np.mean(fold_errors))        score_list.append((alpha, cv_score))        if cv_score < best_cv:            best_cv = cv_score            best_alpha = alpha    return best_alpha, best_cv, score_list  def main():    X, y = make_regression(n_samples=300, n_features=15, noise=8, random_state=7)    alphas = np.logspace(-3, 2, 12)    best_alpha, best_cv, score_list = search_best_alpha(X, y, alphas)    print("候选 alpha:", np.round(alphas, 4))    print("最优 alpha =", round(best_alpha, 4))    print("最优 CV 误差 =", round(best_cv, 4))    for alpha, score in score_list[:3]:        print("alpha =", round(alpha, 4), "CV误差 =", round(score, 4))  if __name__ == "__main__":    main()
目的:用对数尺度生成候选正则系数,配合 5 折交叉验证,为岭回归自动选出最优 α。
  1. alphas = np.logspace(-3, 2, 12)在 0.001 到 100 之间按对数尺度等距生成 12 个候选 α,代替“拍脑袋”取整。
  2. kf = KFold(n_splits=n_splits, shuffle=True, random_state=seed)把数据随机切成 5 份,保证每次切分可复现。
  3. for train_idx, val_idx in kf.split(X):每一折轮流指定一折当“评委”,其余当“厨师助手”。
  4. model = Ridge(alpha=alpha)用当前候选 α 创建岭回归模型。
  5. model.fit(X[train_idx], y[train_idx])只拿训练折拟合,绝不碰验证折。
  6. pred = model.predict(X[val_idx])在验证折上进行预测,相当于让评委试菜。
  7. cv_score = float(np.mean(fold_errors))把 5 折的误差取平均,得到这份守则的综合分。
  8. if cv_score < best_cv:记录到目前分数最低的 α,扫完所有候选就决出胜者。

常见误区

误区我调参时习惯只看 0.1、1、10 这些整数,觉得非整数看起来不专业,而且按 0.01、0.1、1、10 这样的列表搜应该就够了。

正解正则系数的效果在对数尺度上才均匀,0.5、3.2、47 这样的值完全正常。真正重要的是候选在对数轴上的密度,而不是“好记”。用 np.logspace 生成均匀对数序列,往往能比整数列表更快命中最优值。

为何常见:人脑对线性刻度更熟悉,默认觉得“间隔均匀”就是等距,忽略了正则化对 λ 的响应是倍数级的。

误区我把模型在训练集上的误差画成曲线,找到误差最低的那个 λ 直接上线,因为训练都拟合得这么好了,泛化应该也不会差。

正解训练误差低恰恰可能是过拟合的信号——模型把噪声也背了下来。判断 λ 好不好,必须在没参与训练的验证折上评估。交叉验证分数才是“顾客的真实评价”,训练误差只是“大厨的自我感觉”。

为何常见:训练误差最容易拿到、数值也最好看,新手天然倾向于相信“拟合得好=模型好”。

误区害怕漏掉最优值,我把 λ 从 1e-10 搜到 1e10,反正计算量大不了多少,范围宽才安心。

正解范围过宽会浪费大量算力,而且极端值会让模型系数爆炸或归零,CV 曲线两端长期平躺,反而干扰判断。合理做法是从 0.001 到 100 这类经验范围起步,粗扫定位后细扫加密;范围过窄才是更常见的错误。

为何常见:“宁可多搜也不要漏”的心理很自然,但忽略了搜索成本与数值稳定性,误以为覆盖广 = 效果好。

误区上次数据里搜出 λ=2.7 效果很好,这次新数据直接沿用,省得重新调参,反正模型差不多。

正解数据分布、特征集合、样本量一旦变化,最优 λ 可能跟着漂移。正则系数与数据是配套的,上线后应定期用新数据重跑搜索,并监控验证误差是否仍在预期范围。

为何常见:人都有“路径依赖”,加上重跑搜索要花时间,就容易偷懒沿用旧参数,忽略了模型漂移的风险。

面试题

Q1. 搜索正则系数 λ 时,为什么常用对数尺度?

单选题 · easy

  • A.计算速度会更快
  • B.效果随 λ 成倍变化← 正确答案
  • C.数值范围会更小
  • D.避免搜索到负数

答案:B。正则化对 λ 的响应是指数级的,λ 从 1 涨到 2 几乎没变化,从 1 涨到 10 效果大变,所以候选值应按“每 10 倍一档”在对数轴上均匀分布。计算速度、数值范围都不是主要原因;λ 通常为正数,“避免负数”不成立。

Q2. 把正则系数 λ 调得过大,模型会发生什么?

单选题 · easy

  • A.模型权重全部变大
  • B.模型过于复杂灵活
  • C.模型变得过度简单← 正确答案
  • D.训练误差必然为零

答案:C。λ 是惩罚强度,等效于后厨守则的严格程度。λ 过大意味着惩罚过重,所有系数都被压向 0,模型几乎只会输出平均值,导致欠拟合。权重变大是 λ 过小且不加约束时的表现;过拟合对应 λ 过小。

Q3. 关于 L1 正则与 L2 正则,下列说法正确的是?

多选题 · mid

  • A.L1 有特征稀疏效果← 正确答案
  • B.L2 权重整体收缩← 正确答案
  • C.L1 一定优于 L2
  • D.L2 可将权重归零

答案:AB。L1(套索)在零点有棱角,能把无关特征的系数精确压成 0,达到特征选择效果;L2(岭)对系数平方惩罚,让所有权重整体缩小但不归零。两者没有绝对的优劣之分,弹性网络就是为兼得两者而生的。

Q4. 在 K 折交叉验证中,每一折轮流做什么?

单选题 · mid

  • A.一折验证其余训练← 正确答案
  • B.所有折合并再分半
  • C.每折独立测试全体
  • D.只取第一折做验证

答案:A。K 折交叉验证把数据切成 K 份,每一轮取其中 1 份当验证集、其余 K-1 份当训练集,轮换 K 次使每份都当过验证集。B、C、D 都不符合“轮流留一验证”的核心思想。

Q5. 网格搜索 λ 时,下列做法正确的是?

多选题 · mid

  • A.候选需覆盖宽范围← 正确答案
  • B.间隔用对数均匀← 正确答案
  • C.范围越窄结果越好
  • D.只需搜两个端点

答案:AB。网格搜索的关键是候选值在对数尺度上等距且覆盖足够宽,先粗扫后细扫能提高效率。范围过窄会漏掉真正的最优值,只搜两个端点则完全无法定位最优区域。

Q6. 为什么不能用测试集来挑选 λ?

单选题 · hard

  • A.测试集数据量太小
  • B.会泄露信息,评估失真← 正确答案
  • C.测试集包含噪声点
  • D.测试集不能用于训练

答案:B。测试集好比“神秘顾客”,使命是做最终考核。如果拿测试集反复试 λ,模型就在不知不觉中把测试集的特点也“背”了下来,最终分数虚高,上线后真实表现大幅缩水。噪声本身不是问题,关键在于评估必须独立。

Q7. 下列哪一项属于典型的数据泄漏?

单选题 · hard

  • A.用全部数据做特征缩放← 正确答案
  • B.在训练中增加随机噪声
  • C.使用更大的批量大小
  • D.对误差开平方处理

答案:A。标准化时用全部数据的均值、方差,相当于让“评委”提前看到了菜谱——验证折的信息混进了训练过程。增加噪声、改批量大小、对误差做变换都属于训练内部的正常操作,不会把验证信息泄漏进训练。

Q8. 弹性网络(Elastic Net)的主要作用是什么?

单选题 · mid

  • A.同时结合 L1 与 L2← 正确答案
  • B.只用 L2 惩罚项
  • C.替换掉全部正则项
  • D.自动生成更多特征

答案:A。弹性网络把 L1 的稀疏选择能力和 L2 的整体收缩能力合在一起,适合特征相关性强、又想保留特征选择的场景。它并没有发明新特征,也不是去掉正则,更不是只用其中一种。

Q9. 确定 λ 搜索范围时,下列做法合理的是?

多选题 · easy

  • A.先粗范围再缩小区域← 正确答案
  • B.覆盖欠拟与过拟两端← 正确答案
  • C.只取最小整数 1
  • D.范围越大精度必然越高

答案:AB。合理的搜索范围应该覆盖“模型过于简单”和“模型过于复杂”两端,先用大间隔粗扫定位最优区域,再在附近细扫。只取一个点等于没搜索;范围过大只会浪费算力,并不必然带来更高精度。

Q10. 交叉验证误差曲线在最小值附近很平坦时,选最大 λ 的理由是什么?

单选题 · extreme

  • A.模型更稳健且更简洁← 正确答案
  • B.最大 λ 一定误差最低
  • C.最大 λ 训练速度更快
  • D.最大 λ 可跳过验证阶段

答案:A。曲线平坦说明这些 λ 的预测能力几乎一样,此时选最大的 λ(最严格)意味着惩罚更重、系数更小、模型更简单,也更容易解释、对抗噪声更稳健。它不是误差最低的那个,也不是为了速度或偷懒,而是简洁性原则的体现。