为什么 matlab 中的 lasso 比 R 中的 glmnet 慢得多(10 分钟对 ~1 秒)?

机器算法验证 回归 特征选择 正则化
2022-03-19 01:09:01

我观察到 MATLAB 中的函数 lasso 比较慢。我运行了许多回归问题,通常有 1 到 100 个预测变量和 200 到 500 个观察值。在某些情况下,lasso 速度非常慢(解决回归问题需要几分钟时间)。我发现当预测变量高度相关时就是这种情况(例如,大气模型相邻网格点的气温时间序列)。

我比较了以下示例在 matlab 和 R 中的性能。

y 是具有 163 个元素(代表观测值)的预测向量,x 是具有 100 行和 163 个观测值的预测矩阵,对应于 y 中的观测值。我应用了 MATLAB 函数套索如下:

[beta_L,stats]=lasso(x,y,'cv',4);

在 R 中也是如此,使用 glmnet:

fit.lasso=cv.glmnet(predictor.ts,predictand.ts,nfolds=4)

MATLAB 和 R 都基于坐标下降算法。lasso 和 glmnet 的 lambda 值数量的默认值为 100。坐标下降的收敛阈值在 matlab 中默认为 10^-4,在 R (10^-7) 中甚至更低。

R 函数在我的计算机上需要一秒钟。Matlab 需要几分钟,大部分计算时间都花在坐标下降算法上。

当预测变量相关性较低(例如,数值大气模型的不同变量类型)时,Matlab 中的套索并不那么慢,但仍需要约 30 - 与 R 中的约 1 秒相比。

matlab lasso 真的比 glmnet 效率低得多,还是我错过了什么?

1个回答

glmnetin R 速度很快,因为它使用了所谓的正则化路径基本上,您选择惩罚参数的有序序列λ1,λm. 解决方案λ1被用作一个热启动λ2,解决方案为λ2用作热启动λ3, 等等。这是因为解决方案应该彼此接近。所以拟合模型(n+1)惩罚参数,您不会从参数空间中完全随机的位置开始坐标下降。相反,您从已经接近解决方案的某个地方开始:n模型。

如果您glmnet为每个单独的调用λ,它的速度要慢得多,实际上,文档中?glmnet关于lambda参数的说明如下:

警告:小心使用。不要为 lambda [...] 提供单个值,而是提供递减的 lambda 值序列。glmnet依赖于它的暖启动速度,并且它通常更快地适应整个路径而不是计算单个拟合。

强调我的。因此,在时间非正则化路径方法计算一个解决方案λ基于正则化路径的已经完成了所有λs 并开始下一个折叠。另请参阅 Chris Haug 对此答案的评论。显然他可以访问 MATLAB,而我没有。他的发现似乎证实了我的怀疑,即速度差异来自正则化路径的使用。