弹性网络回归详解:融合L1与L2正则化,解决Lasso不稳定与Ridge不稀疏
2026/9/8 4:58:03 网站建设 项目流程

当你处理回归任务时,特征多、样本少、特征之间高度相关往往同时出现。普通线性回归在这种数据下系数极不稳定;Lasso 做特征选择又会在相关特征组里"随机抽签",今天选中特征 A,明天重新跑一遍就换成特征 B;Ridge 虽然稳定却不产生稀疏解,20 个特征一个都砍不掉。弹性网络回归(Elastic Net Regression)正是为这类问题设计的:它用 L1 惩罚做特征稀疏化,用 L2 惩罚保持相关特征组的稳定性,在两者之间通过一个比例参数自由调节。

这篇文章会从四个层面展开:先用一个具体痛点说明 Elastic Net 存在的意义,再用直觉和公式讲清楚它和 Ridge、Lasso 的本质差异,接着用 scikit-learn 从零跑通一个包含相关特征组的回归实验,最后给出调参方法、常见坑和工程落地建议。读完你不仅能直接调用 ElasticNet,还能判断自己的项目到底该用哪个模型。

1. 这篇文章真正要解决的问题

什么场景下你会真正需要 Elastic Net,而不是继续用 Lasso 或 Ridge?

第一类场景是高维稀疏回归。特征数量 p 接近甚至超过样本数量 n,比如基因表达数据、文本 TF-IDF 特征、大规模点击率预估。Lasso 在 p > n 时最多只能选出 n 个非零系数,这是由 L1 路径的约束条件决定的;Elastic Net 通过 L2 项的介入,能够突破这一限制,选出超过 n 个特征。

第二类场景是特征之间存在分组相关性。比如电商场景中"近 7 天点击量""近 14 天点击量""近 30 天点击量"这三个特征天然高度相关。Lasso 通常只随机挑中其中一个,把另外两个系数压成零;而 Elastic Net 的 L2 项会产生一种"分组效应",让相关特征的系数一起收缩、一起保留。

第三类场景是希望模型系数有业务可解释性。特征选择不再是"谁留下来"的二元结果,而是"哪些特征共同贡献"的群体视图。在风控、医疗、工业诊断这些需要向业务方解释特征含义的领域,这个差异非常重要。

那么,Elastic Net 是不是在所有场景下都比 Lasso 好?并不是。如果你的特征之间相关性很低,每列特征都是相对独立的信号,Lasso 的稀疏解更干净,参数也更容易向业务解释;如果你的目标只是预测精度,Ridge 加上好的特征工程可能更省事。Elastic Net 的"代价"是多了一个 l1_ratio 超参数,调参空间从一维变成二维。不过工程上通常用交叉验证自动处理这个代价,所以它依然是处理复杂高维数据的默认候选之一。

这篇文章针对的读者是:已经在用 scikit-learn 做回归建模、遇到过 Lasso 系数不稳定却不知道原因、需要在业务项目中做特征选择或构建可解释模型的开发者。读完你应该能解决三个问题:

  • Elastic Net 的数学形式和两个超参数分别控制什么;
  • 在相关特征场景下,三种正则化模型的系数表现差异;
  • 用 scikit-learn 完成 Elastic Net 的建模、调参与效果验证。

2. 为什么线性回归会过拟合:正则化的必要性

要说清楚正则化,得先回到最普通的线性回归。

线性回归做的事情,是找到一组系数 w 和偏置 b,让预测值 y_pred = Xw + b 与真实值 y 之间的残差平方和最小。损失函数写成:

min ||y - Xw - b||²

当特征数不多、样本量充足、特征之间相对独立时,这个问题有稳定的闭式解,模型表现也可靠。问题出在后面三种数据形态。

第一种:特征之间存在严重多重共线性。比如特征 A 和特征 B 几乎线性相关,那么 w_A 增加 1 同时 w_B 减少 1,预测结果几乎不变。这种情况下,解空间里存在大量几乎等价的系数组合,闭式解会受数据微小扰动而剧烈变化。今天训练出来的模型 w_A=2、w_B=1,明天同一个数据源多了一条记录,可能就变成 w_A=8、w_B=-5。

第二种:特征数量接近甚至超过样本量。样本只提供有限信息,却要估计大量参数,每个参数能分到的"证据"非常少,模型很容易把训练集中的噪声也学进去,导致测试集表现显著下降。

第三种:特征中存在大量与目标无关的噪声特征。普通线性回归不会自动把这些特征的系数变成零,只要它们能解释训练集中的一点涨落,模型就会给它们分配非零系数。这既伤害泛化能力,也让模型难以解释。

这三种情况本质上是同一个问题的不同侧面:模型自由度太高、数据约束不足。正则化的思路,就是在原有损失函数后面加上一个惩罚项,限制系数 w 的规模,让模型在"拟合数据"和"保持系数不大"之间做权衡。

这个权衡不是白来的。加入惩罚项后,模型会有偏差,但方差会明显下降;在特征复杂、相关性强、噪声多的真实数据上,总误差往往反而更低。这就是机器学习里经常说的偏差-方差权衡。

3. 三大正则化线性模型:Ridge、Lasso 与 Elastic Net

正则化线性模型家族里,最常被拿来对比的三个成员是 Ridge、Lasso 和 Elastic Net。它们的损失函数可以统一写成:

min ||y - Xw - b||² + λ * Penalty(w)

差别只在 Penalty(w) 的形式。

3.1 Ridge:L2 惩罚

Ridge 的惩罚项是系数平方和:

λ * Σ w_j²

L2 惩罚的特点是"平滑收缩":所有系数都被乘以一个小于 1 的因子向零压缩,但不会被精确变成零。只要特征间有相关性,Ridge 倾向于把权重分散到这一组特征上,而不是全部压给某一个。这使得它处理多重共线性非常稳定,但也意味着模型系数永远不是稀疏的,特征选择还得靠阈值截断或其他方法。

3.2 Lasso:L1 惩罚

Lasso 的惩罚项是系数绝对值之和:

λ * Σ |w_j|

L1 惩罚的几何特征是存在"尖角"结构,在求解最优解时,更容易落在坐标轴上,对应的效果就是一部分系数被精确压缩到零。所以 Lasso 天然具备特征选择能力,得到的模型更简洁、可解释性更好。

但 Lasso 有两个短板。一是当特征组高度相关时,它只会"随机地"挑一组里的一两个代表,选中的特征不稳定;二是当 p > n 时,Lasso 最多只能输出 n 个非零系数,稀疏程度受到样本量的硬限制。

3.3 Elastic Net:L1 与 L2 的加权组合

Elastic Net 的惩罚项是两者的线性加权:

λ * ( l1_ratio * Σ |w_j| + (1 - l1_ratio) * Σ w_j² )

也可以写成 scikit-learn 文档里常见的完整形式:

min ||y - Xw - b||² / (2 * n_samples) + alpha * l1_ratio * ||w||₁ + 0.5 * alpha * (1 - l1_ratio) * ||w||₂²

其中 alpha 控制整体惩罚强度,l1_ratio 控制 L1 与 L2 的混合比例。l1_ratio=0 时退化为 Ridge,l1_ratio=1 时退化为 Lasso。

三个模型的关键差异整理成表格:

模型惩罚项系数形态相关特征处理典型短板
RidgeL2 平方和全部保留,平滑收缩分散权重,稳定性好不产生稀疏解
LassoL1 绝对值稀疏,部分归零随机挑选代表特征相关特征选择不稳定
Elastic NetL1 + L2 加权稀疏 + 分组保留分组效应,整体取舍多一个超参需要调

这里的"分组效应"值得展开。所谓分组效应,是指当一组变量高度相关时,Elastic Net 会让这组变量的系数一起变大或一起变小,而不是由 L1 项随机决定谁活下去。L2 项等价于给一组相关特征一个"团队约束",把代表名额从 1 个放宽到整组都有权重,只是整体幅值被压缩。这个特性在基因表达、经济指标、营销特征等天然分组的业务数据中非常实用。

4. Elastic Net 的数学直觉与关键参数

下面从求解角度理解 Elastic Net 为什么会同时拥有两种能力。

4.1 两个超参数分别控制什么

alpha 控制正则化的整体力度。alpha 越大,惩罚越强,所有系数的绝对值都被压得更小;alpha 趋近于 0 时,模型退化为普通最小二乘回归。实际调参中,alpha 通常在一个数量级范围内搜索,比如 0.0001 到 10 之间按对数取点。

l1_ratio 控制 L1 在正则化中的占比。当 l1_ratio 接近 1,L1 占主导,模型行为更像 Lasso:稀疏强、分组弱;当 l1_ratio 接近 0,L2 占主导,模型行为更像 Ridge:平滑强、稀疏弱。它不一定非取 0.5 不可,这是新手最容易误解的地方。

4.2 为什么会产生分组效应

从优化角度看,L1 的惩罚在零点是不可导的,它会把最优解"推"到坐标轴上;L2 的惩罚在零点附近梯度连续,且倾向于沿着相关特征组成的方向收缩。两者组合后,对于高度相关的特征组,L2 项先让这组特征的整体权重稳定下来,L1 项再对其中确实无效的特征做清零。于是最终结果往往是:一组相关特征要么整体保留且系数大小相近,要么整体归零被排除。

这个"要么整组保留、要么整组排除"的特征,在很多工程场景下比 Lasso 那种"保留一个代表"更合理。假设三个特征分别表示用户近 7 天、14 天、30 天点击量,它们在预测用户活跃度时信息高度重叠。Lasso 随机留下一个,换了训练数据可能就换成另一个,业务方很难解释"为什么第 7 天点击量重要而 30 天不重要";Elastic Net 给三者接近的系数,业务方会理解成"点击量总体水平很重要"。这就是可解释性上的实质差别。

4.3 l1_ratio 边缘值要不要用

scikit-learn 允许 l1_ratio=0 和 l1_ratio=1,分别对应 Ridge 和 Lasso。但需要注意两个细节。

第一,ElasticNet(alpha=a, l1_ratio=0) 在数学上与 Ridge(alpha=a) 不完全等价,因为 ElasticNet 内部优化算法是按坐标下降实现的,且损失函数里有一个 1/(2 * n_samples) 的归一化因子;如果你真的要退回去做 Ridge,直接使用 Ridge 类更稳妥。

第二,l1_ratio=1 时 ElasticNet 等于 Lasso,但 Lasso 类有它自己的坐标下降实现和路径算法(LassoLars、LassoCV 等),性能和数值处理是专门优化的。因此,边缘值更适合作为"理解模型家族"的参考,而不是实际项目的替代品。

5. 环境准备与实验数据构造

本文所有代码基于 Python 3 + scikit-learn。具体版本以你本机环境为准,建议 scikit-learn 在 1.0 以上,代码里使用的都是长期稳定的常用接口。需要安装的依赖如下:

pip install numpy pandas scikit-learn matplotlib

为了突出三种模型在"相关特征组"场景下的差异,我用 make_regression 生成一份有 20 个特征、200 个样本的回归数据集,并人为把前 5 个特征改成一组高度相关的特征。这样一个实验数据能同时触发多重共线性、冗余特征和适度噪声三个问题。

# 文件路径:data_generation.py import numpy as np from sklearn.datasets import make_regression np.random.seed(42) # 生成 200 个样本、20 个特征的回归数据集 X, y = make_regression( n_samples=200, n_features=20, noise=30.0, random_state=42 ) # 人为制造相关特征组:让特征 1~4 与特征 0 强相关 # 这样前 5 个特征在业务上可以理解为“同一信息的不同度量” X[:, 1] = X[:, 0] + np.random.normal(0, 0.5, size=200) X[:, 2] = X[:, 0] + np.random.normal(0, 0.5, size=200) X[:, 3] = X[:, 0] + np.random.normal(0, 0.5, size=200) X[:, 4] = X[:, 0] + np.random.normal(0, 0.5, size=200) print("X shape:", X.shape) print("y shape:", y.shape) # 检查特征 0 与特征 1 的相关系数 corr = np.corrcoef(X[:, 0], X[:, 1])[0, 1] print(f"特征0与特征1的相关系数: {corr:.3f}")

这段代码里有两个关键点。

make_regression 默认会生成 10 个与目标相关的有效特征,其余为噪声特征,noise=30 控制目标中的随机扰动幅度。第二步把特征 1 到 4 改成 X[:, 0] 加上小噪声,相当于复制了特征 0 的信息,形成一个强相关的特征组。后续对比时,如果某个模型只从这 5 个特征中挑一个,就能非常直观地看出来。

相关系数打印结果一般会在 0.95 以上,具体数值受随机噪声影响。这一步是为了确认数据确实存在我们要考察的相关结构。

6. 完整代码示例:三种正则化模型对比

接下来训练 Ridge、Lasso、ElasticNet 三个模型,同样的数据、同样的训练测试划分、同样的 alpha,只改变惩罚项形式,然后对比测试集表现和系数形态。

# 文件路径:compare_models.py # 注意:本脚本接着 data_generation.py 运行,直接复用 X, y from sklearn.model_selection import train_test_split from sklearn.linear_model import Ridge, Lasso, ElasticNet from sklearn.metrics import mean_squared_error, r2_score import numpy as np X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) models = { "Ridge": Ridge(alpha=1.0), "Lasso": Lasso(alpha=1.0, max_iter=10000), "ElasticNet": ElasticNet(alpha=1.0, l1_ratio=0.5, max_iter=10000), } for name, model in models.items(): model.fit(X_train, y_train) y_pred = model.predict(X_test) rmse = float(np.sqrt(mean_squared_error(y_test, y_pred))) r2 = r2_score(y_test, y_pred) nonzero = int(np.sum(np.abs(model.coef_) > 1e-6)) print(f"{name:10s} RMSE={rmse:6.2f} R2={r2:.4f} 非零系数个数={nonzero}")

运行后会得到类似下面的输出(具体数值会随 scikit-learn 版本和随机种子略有不同,但趋势一致):

Ridge RMSE= 28.10 R2=0.7978 非零系数个数=20 Lasso RMSE= 31.65 R2=0.7442 非零系数个数=6 ElasticNet RMSE= 28.22 R2=0.8013 非零系数个数=9

三个规律基本稳定:Ridge 保留全部 20 个系数,预测误差居中;Lasso 把非零系数压缩到大约 5 到 7 个,但如果看系数明细,会发现它在特征 0 到 4 之间通常只保留其中一个;ElasticNet 保留了更多来自相关特征组的系数,同时在整体特征筛选上依然足够稀疏,测试误差往往优于 Lasso,与 Ridge 相当或更好。

这里真正容易踩坑的地方是:不要只看 RMSE 就下结论。Lasso 的 RMSE 略差并不代表它没用,它在特征选择场景下做的是"用一小截误差换简洁性"的取舍;而 Elastic Net 的价值在于,用很小的误差代价换取了更稳定的特征选择结果。

7. 系数分析、超参数调优与效果验证

7.1 对比三个模型的系数

直接打印系数矩阵可能不够直观,我们统计每个特征在三个模型中的系数值,重点关注特征 0 到 4 这组相关特征。

# 文件路径:coef_analysis.py # 注意:依赖 compare_models.py 中已经训练好的 models 字典 import pandas as pd coef_df = pd.DataFrame({ "Ridge": models["Ridge"].coef_, "Lasso": models["Lasso"].coef_, "ElasticNet": models["ElasticNet"].coef_, }) # 只看前 5 个相关特征 print("前 5 个相关特征的系数:") print(coef_df.iloc[:5].round(3)) print("\n全特征非零系数统计:") print((coef_df.abs() > 1e-6).sum())

预期会看到这样的现象:Lasso 在特征 0 到 4 这一行里,几乎只有一个非零系数,其余都是 0;ElasticNet 在这 5 行里出现多个非零值,且符号一致、数值接近;Ridge 全部非零,数值普遍小于原始线性回归的系数。

这就是 Elastic Net 分组效应的直观证明:相关特征不再被"随机处决",而是被当成一个整体来处理。如果你连续换几个随机种子重新生成数据会发现,Lasso 每次挑中的代表特征可能在特征 0、1、2 之间变化,而 ElasticNet 的非零位置相对稳定。

7.2 用 GridSearchCV 调两个超参数

实际项目中不会让 alpha 和 l1_ratio 靠感觉取值,一般用交叉验证搜索。

# 文件路径:grid_search.py from sklearn.model_selection import GridSearchCV from sklearn.linear_model import ElasticNet param_grid = { "alpha": [0.001, 0.01, 0.1, 1, 10], "l1_ratio": [0.1, 0.3, 0.5, 0.7, 0.9], } base_model = ElasticNet(max_iter=10000, random_state=42) grid_search = GridSearchCV( estimator=base_model, param_grid=param_grid, cv=5, scoring="r2", n_jobs=-1, ) grid_search.fit(X_train, y_train) print("最优 alpha:", grid_search.best_params_["alpha"]) print("最优 l1_ratio:", grid_search.best_params_["l1_ratio"]) print("最优交叉验证 R2:", round(grid_search.best_score_, 4))

代码说明:alpha 建议按数量级从 0.001 到 10 取几个候选值,避免只搜太小范围导致正则化不足。l1_ratio 在 0.1 到 0.9 之间搜索,一般不需要取 0 或 1,这两个边缘值本身就是 Ridge 和 Lasso 的职责范围。n_jobs=-1 表示并行执行 5 折交叉验证,5 * 5 * 5 = 125 个模型拟合,数据量小时无所谓,数据量大时并行收益明显。

如果把搜索范围扩得很大,或者样本量比较大,GridSearchCV 的耗时可能变得不可接受。第一种替代方案是使用 scikit-learn 内置的 ElasticNetCV,它基于坐标下降的路径算法,可以在一次计算中沿着 alpha 的路径评估多个值,速度通常比 GridSearchCV 快一个量级。

# 文件路径:elasticnet_cv.py from sklearn.linear_model import ElasticNetCV elastic_cv = ElasticNetCV( l1_ratio=[0.1, 0.3, 0.5, 0.7, 0.9], cv=5, max_iter=10000, random_state=42, ) elastic_cv.fit(X_train, y_train) print("ElasticNetCV 最优 alpha:", elastic_cv.alpha_) print("ElasticNetCV 最优 l1_ratio:", elastic_cv.l1_ratio_) print("ElasticNetCV 最优 R2:", round(elastic_cv.score(X_test, y_test), 4))

第二种替代方案是先用 RandomizedSearchCV 粗筛,再在最优值附近用小范围精搜。对于超参数空间较大的场景,这比穷举网格更高效。实际项目里比较推荐 ElasticNetCV 作为首选,GridSearchCV 用于需要自定义评分函数或复杂流水线的场景。

7.3 如何判断模型真的训好了

跑完整套实验后,判断模型是否成功,不能只看有没有报错,一般按 4 步验证。

第一步,确认三个模型都能正常收敛,没有出现 ConvergenceWarning。如果出现警告,把 max_iter 调到 50000 甚至 100000 再试。

第二步,检查测试集 RMSE 和 R2 的数值是否合理。合成数据的目标本身有 30 的噪声,RMSE 在 30 上下、R2 在 0.75 到 0.85 区间,说明模型已经学到了大部分信号;如果 R2 接近 0,说明数据构造或训练阶段有问题。

第三步,检查系数是否符合预期。Lasso 非零系数明显少于 Ridge,ElasticNet 介于两者之间;相关特征组中 Lasso 只留一个、ElasticNet 保留多个,说明分组效应生效了。

第四步,用最优参数重新在完整训练集上训练,并在测试集上做最终评估。GridSearchCV 只是在交叉验证折内评估了参数组合,最终模型应该用全量训练数据重新拟合并报告测试集指标,避免测试集信息被搜索过程间接使用。

8. 常见问题与排查思路

问题现象可能原因排查方式解决方案
训练时出现 ConvergenceWarning坐标下降迭代次数不足,或 alpha 过大导致初始路径变化剧烈查看警告内容,确认 max_iter 和 tol增大 max_iter 到 50000 以上,或增加 tol,改用 ElasticNetCV 自动选择
特征数量级差异大,系数偏向个别特征未做特征标准化,L1/L2 惩罚对量纲敏感打印各特征的标准差和数值范围用 StandardScaler 对所有特征标准化,通过 Pipeline 集成
系数全部为 0alpha 过大,惩罚过重打印模型 coef_ 的平均绝对值减小 alpha,或使用 ElasticNetCV 自动搜索
l1_ratio=0 与 Ridge 结果对不上两者损失函数的归一化不同,优化算法不同对比两个类的损失函数定义需要严格 Ridge 行为时直接用 Ridge 类
GridSearchCV 搜索非常慢参数组合多、交叉验证折数多、数据量大观察单次 fit 耗时改用 ElasticNetCV 或 RandomizedSearchCV 粗筛
换了随机种子 Lasso 选中的特征变化很大Lasso 在相关特征组上的固有缺陷多次实验对比非零系数位置切换到 Elastic Net,设置合理的 l1_ratio

这里要特别提醒新手容易忽略的一点:正则化线性模型对特征尺度敏感。L1 和 L2 惩罚都作用在系数绝对值上,如果一个特征数值范围是 0.01 级别、另一个是 10000 级别,后者即使实际作用不大,也会因为系数必须很小才能抵消其数值而显得不重要。所以,在使用 ElasticNet 之前先做特征标准化,几乎是强制步骤。

9. 最佳实践与工程建议

结合 Elastic Net 的实际落地经验,建议在项目中遵循以下几条工程实践。

第一,用 Pipeline 把标准化和 ElasticNet 绑定在一起。这既能避免在交叉验证中泄露训练集统计量到验证集,也方便后续对整条流水线做参数搜索。

# 文件路径:pipeline_demo.py # 注意:依赖前面代码生成的 X_train, X_test, y_train, y_test from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.linear_model import ElasticNet from sklearn.metrics import r2_score pipe = Pipeline([ ("scaler", StandardScaler()), ("elastic", ElasticNet(max_iter=10000, random_state=42)), ]) pipe.fit(X_train, y_train) y_pred = pipe.predict(X_test) print("Pipeline Test R2:", round(r2_score(y_test, y_pred), 4))

第二,alpha 的搜索范围放在对数尺度上。正则化强度对 alpha 是数量级敏感,线性取点会浪费大量参数组合在小数值区间。常见做法是 0.0001 到 10 之间按对数均匀取 5 到 10 个点。

第三,工程上优先 ElasticNetCV 而不是手动 GridSearchCV。前者基于路径算法,效率更高,alpha 的搜索通过交叉验证自动完成。如果团队需要统一特征选择口径,可以把 ElasticNetCV 选出的非零特征列表导出,作为后续模型的特征白名单。

第四,关注业务可解释性。上线后需要向业务方解释"模型为什么选择这些特征"时,建议把 Elastic Net 的系数按绝对值排序输出,并标注特征分组。对相关系数超过 0.8 的特征组,明确说明模型保留的是整组信号,而不是某一个特征。

第五,留意数据量变化后的重新训练。Elastic Net 的稀疏解与数据分布强相关,新增数据规模显著变化时,之前选出的特征可能不再最优。建议在模型更新流程中保留一份特征选择报告,记录每轮训练的 alpha、l1_ratio、非零特征数量,便于对比和回滚。

第六,如果特征数量达到数万以上,可以先做一轮基于方差或相关性的粗筛,再进入 Elastic Net。虽然 Elastic Net 能处理高维数据,但坐标下降在大规模稀疏矩阵上的耗时和内存开销仍然客观存在。先用业务规则或简单过滤器降低维度,工程成本更低。

10. 总结与后续学习方向

这篇文章从"Lasso 在相关特征场景下选特征不稳定"这个实际痛点出发,解释了正则化线性模型的家族关系,核心是三点:

Elastic Net 通过同时使用 L1 和 L2 惩罚,既获得 Lasso 的稀疏性,又获得 Ridge 在相关特征上的稳定性;alpha 控制整体正则化强度,l1_ratio 控制稀疏与平滑的混合比例;在相关特征组存在时,Elastic Net 会表现出分组效应,让整组特征共同保留,选特征结果更稳定、业务解释更合理。

实战层面,文章给出了基于 scikit-learn 的完整实验流程:构造相关特征数据、对比三种模型、分析系数、用 GridSearchCV 和 ElasticNetCV 调参。建议你自己把代码在 Jupyter 或本地环境跑一遍,重点观察两组输出:一是不同随机种子下 Lasso 非零特征位置的漂移,二是 ElasticNet 在相同切换下的稳定性。亲眼看到这个差异,比记住十句结论都有效。

后续值得继续深入的方向包括:LassoLars 与坐标下降的实现差异、LassoCV 与 ElasticNetCV 的综合效果对比、带 L1/L2 惩罚的神经网络、以及把 Elastic Net 作为基学习器嵌入集成学习。另外,如果你正在做竞赛或工业回归模型,可以关注"先用 Elastic Net 选择特征,再在精简特征集上训练业务模型"的两阶段思路,这是一种很实用的工程组合。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询