ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

线性回归正则化实战:从过拟合到L1/L2/Elastic Net原理与Python实现

线性回归正则化实战:从过拟合到L1/L2/Elastic Net原理与Python实现 1. 项目概述从“过拟合”到“正则化”的实战思考做机器学习尤其是线性回归新手最容易踩的一个坑就是模型在训练集上表现近乎完美一到测试集就“翻车”。我刚入行那会儿为了追求训练集上那99.9%的R²把模型搞得无比复杂结果预测新数据时误差大得离谱。后来才明白这玩意儿叫“过拟合”Overfitting。解决过拟合除了搞更多、更干净的数据最常用也最有效的武器就是“正则化”Regularization也就是我们常说的给模型加个“惩罚项”或“正则项”。简单说线性回归的目标是找一条线或超平面让预测值和真实值的误差平方和最小。但如果不加约束模型会为了拼命减小这个训练误差去“硬记”甚至“放大”训练数据里的噪声和偶然特征导致模型参数权重的绝对值变得特别大变得非常敏感。正则项的作用就是在最小化误差的同时给这些模型参数的大小也加上一个限制告诉模型“别光顾着拟合训练数据也收敛一点别太放飞自我。” 这样训练出来的模型泛化能力处理新数据的能力会强得多。今天我就结合自己调参踩坑的经验把线性回归里几种主流正则项L1、L2、Elastic Net的原理掰开揉碎了讲清楚并附上可运行的Python代码。无论你是刚入门想理解核心概念还是已经上手需要调优模型这篇文章都能给你直接的参考。2. 正则项的核心原理为什么“惩罚”能让模型更好要理解正则项我们得从最基础的普通最小二乘法Ordinary Least Squares, OLS线性回归说起。它的目标函数损失函数非常直观J(w) Σ(y_i - ŷ_i)²其中ŷ_i wᵀx_i bw是权重向量b是偏置项。OLS的目标就是找到一组w和b让这个平方误差J(w)最小。这个模型有个隐含的假设我们只关心预测误差对模型参数w本身没有任何偏好。但这就好比教一个学生只告诉他“考试分数越高越好”他可能会用死记硬背甚至作弊的方式来取得高分却没有真正理解知识对应模型的泛化能力。正则化就是在目标函数里加了一个关于参数w的惩罚项Ω(w)新的目标函数变成J_reg(w) Σ(y_i - ŷ_i)² λ * Ω(w)这个公式是理解一切的核心。里面有两个关键部分损失项Loss TermΣ(y_i - ŷ_i)²衡量模型预测的准确性。正则项Penalty Termλ * Ω(w)衡量模型复杂度。λ读作lambda是一个大于0的超参数它控制着惩罚的力度。λ越大对复杂模型大权重的惩罚越重模型会趋向于更简单λ越小惩罚越轻模型越倾向于拟合训练数据。为什么加上这个惩罚项就能防止过拟合从数学优化角度看它限制了参数w的解空间。没有正则项时模型可以找到无数个能使训练误差很小的w尤其是在特征多、数据少时其中很多w的数值很大且正负抵消精巧专门针对训练数据。加上Ω(w)后我们不仅要求误差小还要求w的某种度量比如平方和、绝对值和也小。这迫使模型在“拟合数据”和“保持简洁”之间寻找平衡点往往能找到更平滑、更稳定的解。从几何角度可以更直观地理解。以二维权重(w1, w2)为例损失函数的等高线是椭圆正则项的约束区域是一个“形状”L2是圆形L1是菱形。模型的最优解不再是椭圆的中心而是椭圆等高线与这个约束区域首次相切的点。这个“切点”的特性直接决定了L1和L2正则化的不同行为。注意正则化通常只针对权重w而不针对偏置项b。因为b只是控制整体的偏移不影响模型各个特征之间的相对关系和复杂度。在具体实现时我们需要确保只惩罚权重参数。3. 正则项的分类与深度解析L1, L2 与 Elastic Net正则项Ω(w)的不同形式带来了效果迥异的正则化方法。最主流的就是L1和L2。3.1 L2正则化岭回归Ridge RegressionL2正则化使用权重的平方和作为惩罚项Ω(w) ||w||₂² Σ w_j²所以岭回归的目标函数是J_ridge(w) Σ(y_i - ŷ_i)² λ * Σ w_j²原理与特点均匀收缩L2正则项在几何上是一个球形约束。它对所有权重进行按比例压缩但不会将任何权重精确地压缩到0。无论λ多大权重都只会无限接近0而不会等于0。稳定解由于惩罚项是光滑的二次函数整个优化问题也是光滑凸函数总能保证有唯一稳定解数值计算上非常友好。应对共线性这是岭回归一个巨大的实战优势。当特征之间存在高度相关性共线性时OLS估计的权重方差会变得极大结果极不稳定。L2正则化通过压缩权重显著降低模型方差牺牲一点偏差来换取巨大的稳定性提升从而获得更好的预测性能。生活类比想象你在装修房子拟合模型。L2正则化就像是一个预算限制λ它要求你所有项目的花费权重w_j平方和不能太大。你可以削减每个项目的预算但通常不会完全取消某个项目权重不为0。最终房子能装修完但所有材料都用了更平价的选择。3.2 L1正则化套索回归Lasso RegressionL1正则化使用权重的绝对值和作为惩罚项Ω(w) ||w||₁ Σ |w_j|其目标函数为J_lasso(w) Σ(y_i - ŷ_i)² λ * Σ |w_j|原理与特点稀疏解与特征选择这是L1最核心的特性。由于其约束区域是菱形存在“尖角”损失函数等高线与菱形相切于尖角的概率非常高。在尖角上就会有一个或多个特征的权重恰好为0。这意味着L1正则化能自动进行特征选择它会把不重要的特征的系数压缩至零从而生成一个更简单、可解释性更强的模型。计算稍复杂由于绝对值函数在0点不可导优化计算上比L2稍复杂一些但现代优化库如坐标下降法能高效处理。生活类比同样是装修预算限制λ但L1规则是总花费权重绝对值之和不能超标。为了在预算内达到最好的效果你可能会彻底砍掉一些非必需的项目如水晶吊灯、智能马桶把这些项目的预算直接降为0从而保证核心项目如水电、地板有充足资金。这就是特征选择。3.3 Elastic Net融合L1与L2的优势既然L1和L2各有优劣很自然就想能不能结合一下Elastic Net应运而生。它的正则项是L1和L2的线性组合Ω(w) α * Σ |w_j| (1 - α) * Σ w_j²其目标函数为J_elastic(w) Σ(y_i - ŷ_i)² λ * [ α * Σ |w_j| (1 - α) * Σ w_j² ]这里引入了两个超参数λ控制整体正则化的强度。α或l1_ratio控制L1和L2的混合比例。α1时退化为Lassoα0时退化为Ridge。为什么需要Elastic Net解决Lasso的局限性当特征数量p远大于样本数量n时Lasso最多只能选择n个特征。此外如果存在高度相关的特征群Lasso倾向于只从中随机选择一个而忽略其他有用的相关特征。这在基因数据分析中很常见。继承双方优点Elastic Net鼓励在高度相关的特征间进行分组选择类似Ridge的效应同时仍能产生稀疏解进行特征选择类似Lasso的效应。它通常比单纯的L1或L2具有更好的预测精度。实操心得在实际项目中尤其是特征维度高、特征间可能存在分组效应时我通常会从Elastic Net开始调参。通过网格搜索λ和α往往能找到一个在预测精度和模型简洁性上平衡得更好的点。虽然多了一个参数但现代自动化调参工具可以很好地处理。4. Python代码实现与对比分析理论讲完了我们直接上代码用scikit-learn这个强大的机器学习库来实现并直观对比不同正则化的效果。我会用一个有少量样本、多个特征其中一些是噪声的合成数据集来演示。4.1 环境准备与数据生成首先确保你的环境安装了必要的库numpy,pandas,matplotlib,scikit-learn。如果没有可以通过pip install numpy pandas matplotlib scikit-learn安装。import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression, Ridge, Lasso, ElasticNet from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error, r2_score import warnings warnings.filterwarnings(ignore) # 设置随机种子确保结果可复现 np.random.seed(42) # 生成合成数据 n_samples 100 # 样本数较少容易过拟合 n_features 20 # 特征数其中只有5个是真正有用的 n_informative 5 # 生成特征矩阵 X: 100个样本20个特征 X np.random.randn(n_samples, n_features) # 生成真实的权重系数只有前5个非零 true_coef np.zeros(n_features) true_coef[:n_informative] np.array([4.0, -3.5, 2.8, -1.2, 0.5]) # 生成目标值 y X * true_coef 噪声 y np.dot(X, true_coef) np.random.randn(n_samples) * 0.5 # 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.3, random_state42) # 特征标准化这对正则化模型至关重要 # 因为正则项惩罚的是系数大小如果特征尺度不一大尺度的特征系数自然小会被不公平地少惩罚。 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test)关键操作解析特征标准化这一步绝对不能省。正则化惩罚的是权重系数的大小。如果一个特征取值在0-10000如工资另一个在0-1如比例那么工资特征对应的权重自然会很小才能平衡导致正则化对它不公平。标准化后所有特征均值为0方差为1站在同一起跑线上惩罚才是公平的。4.2 不同正则化模型的训练与比较现在我们分别用普通线性回归、岭回归、套索回归和弹性网络来拟合数据。# 1. 普通线性回归 (OLS) - 作为基线 lr LinearRegression() lr.fit(X_train_scaled, y_train) lr_coef lr.coef_ # 2. 岭回归 (L2) - 尝试不同的 alpha (即公式中的 λ) # 注意sklearn中Ridge的参数是alpha对应我们公式中的λ ridge Ridge(alpha1.0) # 先设定一个初始值 ridge.fit(X_train_scaled, y_train) ridge_coef ridge.coef_ # 3. 套索回归 (L1) - 尝试不同的 alpha lasso Lasso(alpha0.1) # Lasso的alpha需要更精细的调节 lasso.fit(X_train_scaled, y_train) lasso_coef lasso.coef_ # 4. 弹性网络 (Elastic Net) - 调节 alpha 和 l1_ratio elastic ElasticNet(alpha0.1, l1_ratio0.5) # l1_ratio0.5表示L1和L2各占一半 elastic.fit(X_train_scaled, y_train) elastic_coef elastic.coef_ # 评估各模型在测试集上的表现 models [(OLS, lr), (Ridge (alpha1), ridge), (Lasso (alpha0.1), lasso), (ElasticNet (alpha0.1, l1_ratio0.5), elastic)] results [] for name, model in models: y_pred model.predict(X_test_scaled) mse mean_squared_error(y_test, y_pred) r2 r2_score(y_test, y_pred) results.append([name, mse, r2]) print(f{name:30} - MSE: {mse:.4f}, R²: {r2:.4f}) # 将结果转为DataFrame方便查看 results_df pd.DataFrame(results, columns[Model, Test MSE, Test R²]) print(\n模型性能对比) print(results_df)运行这段代码你会看到类似下面的输出。具体数值因随机数而异但趋势是明显的OLS - MSE: 0.5123, R²: 0.7234 Ridge (alpha1) - MSE: 0.2987, R²: 0.8489 Lasso (alpha0.1) - MSE: 0.2751, R²: 0.8608 ElasticNet (alpha0.1, l1_ratio0.5) - MSE: 0.2814, R²: 0.8576结果解读在这个例子中普通线性回归OLS在测试集上的表现最差MSE最高R²最低说明它已经过拟合了训练数据。三种正则化模型的表现都优于OLS其中Lasso和Elastic Net略好于Ridge。这验证了正则化确实能提升模型的泛化能力。4.3 权重系数可视化与特征选择观察只看性能指标还不够我们画出权重系数图直观感受不同正则化方法对模型“内在”的影响。# 绘制系数对比图 fig, axes plt.subplots(2, 2, figsize(14, 10)) axes axes.ravel() model_names [OLS, Ridge, Lasso, ElasticNet] model_coefs [lr_coef, ridge_coef, lasso_coef, elastic_coef] for idx, (ax, name, coef, true) in enumerate(zip(axes, model_names, model_coefs, true_coef)): ax.plot(range(n_features), coef, o, labelEstimated Coef, markersize8) ax.plot(range(n_features), true, x, labelTrue Coef, markersize10, markeredgewidth2) ax.axhline(y0, colork, linestyle--, linewidth0.5) ax.set_xlabel(Feature Index) ax.set_ylabel(Coefficient Value) ax.set_title(f{name} - Coefficient Comparison) ax.legend() ax.grid(True, alpha0.3) # 特别标注Lasso和Elastic Net的稀疏性 if idx 2: # Lasso 和 ElasticNet zero_coef_count np.sum(np.abs(coef) 1e-8) # 近似为0的系数 ax.set_title(f{name} - Coefficient Comparison (Zero Coefs: {zero_coef_count})) plt.tight_layout() plt.show()通过这张图你可以清晰地看到OLS估计的系数圆点波动剧烈很多非重要特征索引5以后的系数绝对值也很大且与真实系数叉号偏离严重。这就是过拟合的典型表现——模型用复杂的系数去“记忆”噪声。Ridge所有系数都被均匀地向零压缩了。前5个重要特征的系数更接近真实值而后15个噪声特征的系数被压得很小但没有一个精确为0。模型变稳定了。Lasso出现了明显的稀疏性许多噪声特征的系数被精确地压缩为0在图上与0线重合。它成功地从20个特征中筛选出了少数几个重要特征模型变得极其简洁。Elastic Net效果介于Ridge和Lasso之间。它产生了一定的稀疏性部分系数为0但对重要系数的压缩程度比Lasso更温和一些有时在特征分组选择上更有优势。4.4 超参数λalpha的影响与选择正则化的效果严重依赖于超参数λ在sklearn中叫alpha的选择。λ太小惩罚不足接近OLS容易过拟合λ太大惩罚过重模型过于简单所有系数都趋近于0导致欠拟合。我们需要找到那个“甜蜜点”。下面我们以岭回归为例绘制不同alpha下系数大小和模型误差的变化路径。# 探索Ridge回归中alpha的影响 alphas np.logspace(-4, 4, 100) # 生成从10^-4到10^4的等比数列覆盖小到大各种情况 ridge_coef_path [] train_mse [] test_mse [] for a in alphas: ridge_temp Ridge(alphaa) ridge_temp.fit(X_train_scaled, y_train) ridge_coef_path.append(ridge_temp.coef_) # 计算训练集和测试集MSE train_mse.append(mean_squared_error(y_train, ridge_temp.predict(X_train_scaled))) test_mse.append(mean_squared_error(y_test, ridge_temp.predict(X_test_scaled))) ridge_coef_path np.array(ridge_coef_path) # 转换为数组形状为 (100, 20) # 绘制系数路径图 plt.figure(figsize(14, 5)) plt.subplot(1, 2, 1) for i in range(n_features): plt.plot(alphas, ridge_coef_path[:, i], labelfCoef {i} if i 3 else ) plt.xscale(log) # alpha尺度范围大用对数坐标更清晰 plt.xlabel(Alpha (λ) - Log Scale) plt.ylabel(Coefficient Value) plt.title(Ridge Coefficient Paths) plt.axhline(y0, colork, linestyle--, linewidth0.5) plt.grid(True, alpha0.3) # 只标注前几个系数避免图例混乱 handles, labels plt.gca().get_legend_handles_labels() plt.legend(handles[:3], labels[:3]) # 绘制误差路径图 plt.subplot(1, 2, 2) plt.plot(alphas, train_mse, b-, labelTrain MSE, linewidth2) plt.plot(alphas, test_mse, r-, labelTest MSE, linewidth2) plt.xscale(log) plt.xlabel(Alpha (λ) - Log Scale) plt.ylabel(Mean Squared Error) plt.title(Train vs Test MSE for Ridge) plt.legend() plt.grid(True, alpha0.3) # 标记测试误差最小的点 optimal_alpha_idx np.argmin(test_mse) optimal_alpha alphas[optimal_alpha_idx] plt.axvline(xoptimal_alpha, colorg, linestyle:, linewidth2, labelfOptimal α{optimal_alpha:.4f}) plt.legend() plt.tight_layout() plt.show() print(f在测试集上表现最好的 alpha 值为: {optimal_alpha:.6f}) print(f对应的测试集 MSE 为: {test_mse[optimal_alpha_idx]:.6f})解读与实操心得左图系数路径随着alpha增大从左到右所有系数都单调地向零收缩。alpha很小时系数接近OLS解alpha很大时所有系数都趋近于0。右图误差路径训练误差蓝线随着alpha增大模型限制变严对训练数据的拟合能力下降所以训练误差单调上升。测试误差红线呈现一个经典的“U型”曲线在alpha很小时模型过拟合测试误差高。随着alpha增加到某个最优值模型复杂度和数据匹配度达到最佳平衡测试误差降到最低点。之后alpha再增大模型变得过于简单欠拟合无法捕捉数据规律测试误差再次上升。关键点我们的目标就是找到这个测试误差曲线上的最低点对应的alpha值。在实际项目中我们通常使用交叉验证Cross-Validation来更稳健地寻找这个最优值而不是简单地在单一测试集上找。5. 实战进阶使用交叉验证进行超参数调优在实际项目中我们不会手动尝试一堆alpha然后画图找点。scikit-learn提供了带交叉验证的正则化回归模型可以自动寻找最优超参数。5.1 岭回归与Lasso的交叉验证调参from sklearn.linear_model import RidgeCV, LassoCV, ElasticNetCV # 1. 使用RidgeCV进行交叉验证选择最优alpha # alphas参数可以传入一个尝试的列表 ridge_cv RidgeCV(alphasnp.logspace(-3, 3, 50), # 尝试50个alpha值 scoringneg_mean_squared_error, # 以负MSE作为评分CV会找最大值 store_cv_valuesTrue) # 存储交叉验证结果 ridge_cv.fit(X_train_scaled, y_train) print( RidgeCV 结果 ) print(f最优 alpha: {ridge_cv.alpha_:.6f}) print(f交叉验证下的最佳分数负MSE: {ridge_cv.best_score_:.4f}) print(f对应模型在训练集上的R²: {ridge_cv.score(X_train_scaled, y_train):.4f}) # 2. 使用LassoCV进行交叉验证选择最优alpha lasso_cv LassoCV(alphasnp.logspace(-4, 0, 50), # Lasso的alpha通常需要更小的搜索范围 cv5, # 5折交叉验证 random_state42, max_iter10000) # 增加最大迭代次数确保收敛 lasso_cv.fit(X_train_scaled, y_train) print(\n LassoCV 结果 ) print(f最优 alpha: {lasso_cv.alpha_:.6f}) print(f选择的特征数非零系数: {np.sum(np.abs(lasso_cv.coef_) 1e-8)}) print(f对应模型在训练集上的R²: {lasso_cv.score(X_train_scaled, y_train):.4f}) # 3. 使用ElasticNetCV进行交叉验证选择最优alpha和l1_ratio elastic_cv ElasticNetCV(l1_ratio[.1, .5, .7, .9, .95, .99, 1], # 尝试不同的L1比例 alphasnp.logspace(-4, 0, 30), cv5, random_state42, max_iter5000) elastic_cv.fit(X_train_scaled, y_train) print(\n ElasticNetCV 结果 ) print(f最优 alpha: {elastic_cv.alpha_:.6f}) print(f最优 l1_ratio: {elastic_cv.l1_ratio_:.4f}) print(f选择的特征数非零系数: {np.sum(np.abs(elastic_cv.coef_) 1e-8)}) print(f对应模型在训练集上的R²: {elastic_cv.score(X_train_scaled, y_train):.4f})5.2 最终模型评估与系数对比用交叉验证找到最优参数后我们用这些参数重新训练模型并在测试集上进行最终评估。# 使用CV找到的最优参数重新训练模型实际上CV模型已经用最优参数训练好了这里直接评估 final_models { OLS: lr, Ridge (CV): ridge_cv, Lasso (CV): lasso_cv, ElasticNet (CV): elastic_cv } final_results [] for name, model in final_models.items(): y_pred model.predict(X_test_scaled) mse mean_squared_error(y_test, y_pred) r2 r2_score(y_test, y_pred) n_nonzero np.sum(np.abs(model.coef_) 1e-8) if hasattr(model, coef_) else n_features final_results.append([name, mse, r2, n_nonzero]) final_df pd.DataFrame(final_results, columns[Model, Test MSE, Test R², Non-zero Coefs]) print(\n 最终模型在测试集上的表现对比 ) print(final_df.sort_values(Test MSE)) # 可视化最终模型的系数 plt.figure(figsize(15, 8)) for idx, (name, model) in enumerate(final_models.items(), 1): plt.subplot(2, 2, idx) coef model.coef_ plt.stem(range(len(coef)), coef, basefmt , use_line_collectionTrue) plt.axhline(y0, colork, linestyle--, linewidth0.5) plt.xlabel(Feature Index) plt.ylabel(Coefficient Value) plt.title(f{name}\nNon-zero: {np.sum(np.abs(coef) 1e-8)} / {len(coef)}) plt.grid(True, alpha0.3) plt.tight_layout() plt.show()通过这个完整的流程你不仅实现了正则化线性回归还掌握了用交叉验证自动化调参的方法并能直观比较不同正则化策略带来的模型复杂度非零系数数量和预测性能Test MSE/R²的差异。6. 常见问题与排查技巧实录在实际应用正则化线性回归时我遇到过不少坑。这里总结几个最常见的问题和解决方法。问题1加了正则化模型效果反而变差了可能原因1特征未标准化。这是新手最常犯的错误。一定要在训练前用StandardScaler或MinMaxScaler对特征进行标准化且用训练集的均值和方差去转换测试集。可能原因2正则化强度λalpha设置不当。λ太大导致欠拟合λ太小导致过拟合。务必使用交叉验证如RidgeCV,LassoCV来选择最优的λ。可能原因3数据本身噪声极大或样本量极少。正则化不是银弹。如果数据质量太差任何模型都难以表现好。此时应优先考虑数据清洗和收集更多数据。问题2Lasso回归选出的特征数量为0或者把所有特征都剔除了可能原因α值设置得过大。Lasso的α参数对稀疏性非常敏感。α太大惩罚过重所有系数都会被压到0。解决方法是使用LassoCV自动选择α。手动减小α值观察系数路径图选择一个在测试集误差较低且能产生合理稀疏性的α。检查特征间是否存在极强的多重共线性。在极端共线性下Lasso可能随机选择其中一个而丢弃其他或者行为不稳定。可以尝试使用ElasticNet设置l1_ratio0.9或类似值它结合了L1和L2对共线性更稳定。问题3如何解释正则化后的模型系数重要提醒正则化后系数的绝对值大小和显著性p值的传统统计解释已不适用。系数被压缩了不能直接说“系数大的特征就更重要”。尤其是在L1正则化后保留下来的非零特征可以认为是模型认为比较重要的特征但被压缩到零的特征不一定完全不重要可能只是与其他特征高度相关。模型解释应更侧重于预测性能和特征选择的实用性而非系数的精确统计推断。问题4什么时候该用L1什么时候该用L2优先使用L2岭回归的场景你的主要目标是提升预测精度并且所有特征都可能与目标相关。特征之间存在多重共线性你需要一个稳定的解。你不需要做特征选择或者特征数量本身就不多。优先使用L1套索回归的场景特征数量很多例如成百上千你怀疑其中只有一部分是真正有用的需要进行特征选择以简化模型、增强可解释性。你需要一个稀疏的模型以便于部署或解释。尝试Elastic Net的场景特征数量远大于样本数p n。特征之间存在明显的分组效应一组高度相关的特征。使用Lasso后模型不稳定或特征选择结果不合理。问题5正则化线性回归的代码运行很慢尤其是特征维度很高时优化技巧设置max_iter对于Lasso和Elastic Net确保max_iter参数设置得足够大让优化算法收敛。可以设置max_iter10000或更大。使用更快的求解器sklearn的Lasso和ElasticNet默认使用坐标下降法对于高维数据已经很快。可以尝试设置selectionrandom随机选择坐标更新来加速但可能略微影响精度。增量计算与提前停止对于超大规模数据可以考虑使用随机梯度下降SGD的变体如SGDRegressor并设置penalty参数为l1,l2或elasticnet。它支持在线学习并且可以设置early_stopping。特征预筛选在进入正则化模型前可以用方差过滤、单变量统计测试等方法先移除一些明显无关的特征降低维度。正则化是机器学习建模中控制复杂度、提升泛化能力的基石技术。理解L1、L2和Elastic Net背后的原理掌握用交叉验证选择超参数的方法并能根据实际问题场景选择合适的正则化策略是每一个数据科学家和机器学习工程师的必备技能。希望这篇结合原理与实战的长文能帮你彻底搞懂并用好这个强大的工具。
返回列表