第一次接触LASSO(Least Absolute Shrinkage and Selection Operator)是在处理一组工业传感器数据时——当时面对300多个高度相关的温度监测特征,传统线性回归完全失效。LASSO通过引入L1正则化,不仅解决了多重共线性问题,还自动完成了特征筛选,最终模型仅保留12个关键传感器指标,预测误差反而降低了37%。这种兼具回归与特征选择双重能力的算法,已经成为高维数据分析的标准工具之一。
MATLAB作为工程领域的主流计算平台,其统计与机器学习工具箱提供了完整的LASSO实现链。从基础的线性模型拟合到交叉验证调参,再到基于惩罚项的特征排序,一套代码就能完成从数据清洗到模型部署的全流程。特别是在处理时间序列预测、医疗指标分析、金融风险建模等特征维度爆炸的场景时,LASSO+MATLAB的组合能快速给出可解释的稀疏解。
LASSO的核心思想是在普通最小二乘损失函数中加入L1范数惩罚项:
code复制min(‖y - Xβ‖² + λ‖β‖₁)
其中λ控制惩罚强度。当λ=0时退化为OLS回归;λ→∞时所有系数被压缩为零。与岭回归(Ridge)的L2惩罚不同,L1范数会导致部分系数精确为零,从而实现特征选择。这种特性源于L1正则化在坐标轴处的"尖角"效应——在数学优化过程中,系数更容易在坐标轴上"停住"。
MATLAB中通过lasso函数实现该优化:
matlab复制[B, FitInfo] = lasso(X, y, 'Alpha', 1); % Alpha=1表示纯LASSO
关键参数Alpha实际控制L1/L2惩罚的混合比例:1为纯LASSO,0为纯Ridge,中间值产生弹性网(Elastic Net)模型。
在波士顿房价数据集上的实操演示:
matlab复制load boston.mat
X = normalize(boston(:,1:13)); % 标准化预测变量
y = boston(:,14); % 房价中位数
% 划分训练测试集
rng(2023); % 固定随机种子
cv = cvpartition(length(y), 'HoldOut', 0.3);
X_train = X(cv.training,:);
y_train = y(cv.training);
关键细节:
- 必须对连续型特征做标准化(
normalize),否则惩罚项会对不同尺度的特征产生不均衡影响- 分类变量需要先进行哑变量编码,但要注意避免虚拟变量陷阱
- 缺失值处理推荐用
fillmissing函数,LASSO对缺失值敏感
通过10折交叉验证寻找最优λ:
matlab复制[beta, fitinfo] = lasso(X_train, y_train, 'CV', 10);
结果可视化:
matlab复制lassoPlot(beta, fitinfo, 'PlotType', 'Lambda', 'XScale', 'log');
xlabel('Lambda对数值');
ylabel('系数大小');
典型输出会显示两条虚线:
获取绿色虚线对应的特征子集:
matlab复制opt_lambda = fitinfo.Index1SE;
selected_features = find(beta(:, opt_lambda) ~= 0);
fprintf('筛选出%d个特征:%s\n', length(selected_features), ...
strjoin(boston.Properties.VariableNames(selected_features), ', '));
在房价数据中,LASSO通常会保留RM(房间数)、LSTAT(低收入人群比例)、DIS(就业中心距离)等关键特征,而剔除冗余指标。
当特征存在自然分组时(如多类别变量的哑变量),需要保持组内特征同进同出:
matlab复制groups = [1 1 2 2 2 3 3 3 3]; % 定义特征分组
[B, stats] = lasso(X, y, 'Alpha', 1, 'Group', groups);
对于超大规模数据(特征数>10,000),启用GPU并行:
matlab复制X_gpu = gpuArray(X);
y_gpu = gpuArray(y);
[B, FitInfo] = lasso(X_gpu, y_gpu, 'Options', statset('UseParallel', true));
将训练好的模型导出为独立应用:
matlab复制model = struct('Beta', beta, 'Intercept', fitinfo.Intercept, ...
'Lambda', fitinfo.Lambda(opt_lambda));
save('lasso_model.mat', 'model');
% 在新数据上预测
load('lasso_model.mat');
y_pred = X_test * model.Beta + model.Intercept;
特征相关性陷阱:当两个强相关特征同时存在时,LASSO可能随机选择其中一个。解决方案:
小样本过拟合:当样本量<n/3时,即使LASSO也可能过拟合。建议:
'RelTol'参数)非线性关系处理:LASSO本质仍是线性模型。对于非线性关系:
在实际金融风控项目中,通过LASSO筛选出的20个关键指标,相比专家经验规则集,将违约识别率提升了22%,同时减少了83%的数据采集成本。这种"数据驱动+可解释"的特性,正是LASSO在工程领域的独特价值。