Python中最快的线性回归实现

4 投票
2 回答
3493 浏览
提问于 2025-04-18 11:41

我正在进行逐步模型选择,逐渐去掉那些方差膨胀因子超过某个阈值的变量。

为了做到这一点,我在数据集上反复运行普通最小二乘法(OLS),这些数据集的大小从几百MB到10GB不等。

对于较大的数据集,哪种实现普通最小二乘法的方法最快呢?Statsmodel的OLS实现似乎是用numpy来进行矩阵求逆的。那用基于梯度下降的方法会更快吗?scikit-learn有没有特别快的实现呢?

或者,也许用pymc的马尔可夫链蒙特卡洛(MCMC)方法会更快……

更新1:看起来scikit-learn的线性回归实现其实是对scipy实现的一个封装。

更新2:在我非常有限的测试中,通过scikit-learn的线性回归实现的scipy OLS速度是statsmodels OLS的两倍……

2 个回答

2

逐步方法并不是选择模型的好办法,因为它们完全是随意的,而且很依赖你执行逐步过程的方向。使用基于标准的方法,或者其他生成模型概率的方法要好得多。也许最好的方法是使用可逆跳跃的MCMC,这种方法可以在整个模型空间中拟合模型,而不仅仅是某个特定模型的参数空间。

PyMC本身并没有实现可逆跳跃MCMC,但可以进行实现。另外,PyMC 3让使用它的新glm子模块来拟合回归模型变得非常简单。

3

scikit-learn里的SGDRegressor类(如果我没记错的话)是最快的,但调试起来可能比简单的线性回归要难一些。

我建议你都试试这些方法,看看哪个更适合你的需求。我还建议你对数据进行子采样——如果你的数据量很大,但都是来自同一分布的样本,你可以在几千个样本上训练和调试你的模型(具体数量取决于特征的多少)。这样可以更快地探索你的模型,而不会浪费时间在“重复/无趣”的数据上。

一旦你找到几个合适的模型,就可以在整个数据集上试试它们。

撰写回答