[英]Logistic regression python solvers' definitions
我正在使用 sklearn 的逻辑回归函数,并且想知道每个求解器实际上在幕后做什么来解决优化问题。
有人可以简要描述一下“newton-cg”、“sag”、“lbfgs”和“liblinear”在做什么吗?
好吧,我希望我参加聚会还不算太晚! 在挖掘大量信息之前,让我先尝试建立一些直觉(警告:这不是简短的比较)
假设h(x)
接受输入并为我们提供估计的输出值。
这个假设可以是一个简单的单变量线性方程,也可以是一个非常复杂和长的多元方程,与我们使用的算法类型有关(即线性回归、逻辑回归......等)。
我们的任务是找到最好的参数(又名 Thetas 或 Weights),使我们在预测输出时误差最小。 我们将此错误称为成本或损失函数,显然我们的目标是将其最小化以获得最佳预测输出!
还有一件事要记住,参数值与其对成本函数(即误差)的影响之间的关系看起来像钟形曲线(即二次曲线;记住这一点,因为它非常重要)。
因此,如果我们从该曲线的任何一点开始,如果我们继续取我们停止的每个点的导数(即切线),我们将最终达到所谓的全局最优,如下图所示:
如果我们在最小成本点(即全局最优)处取偏导数,我们会发现切线的斜率= 0 (然后我们知道我们达到了目标)。
这仅在我们有凸成本函数时才有效,但如果我们没有,我们可能最终会陷入所谓的局部最优; 考虑这个非凸函数:
现在您应该对我们正在做的事情与术语之间的 hack 关系有了直觉: Deravative 、 Tangent Line 、 Cost Function 、 Hypothesis .. 等。
旁注:上述直觉也与梯度下降算法有关(见下文)。
线性近似:
给定一个函数f(x)
,我们可以找到它在x=a
处的切线。 切线L(x)的方程为: L(x)=f(a)+f′(a)(x−a)
。
看看下面的函数及其切线图:
从这个图中我们可以看到,在x=a
附近,切线和函数具有几乎相同的图。 有时我们会使用切线L(x)
作为函数f(x)
的近似值,靠近x=a
。 在这些情况下,我们称切线为函数在x=a
处的线性近似。
二次近似:
与线性近似相同,但这次我们处理的是一条曲线,但我们无法通过使用切线找到接近0的点。
相反,我们使用抛物线(这是一条曲线,其中任何点与固定点或固定直线的距离相等),如下所示:
为了拟合一个好的抛物线,抛物线和二次函数应该具有相同的值,相同的一阶导数和二阶导数,......公式将是(只是出于好奇): Qa(x) = f(a) + f'(a)(xa) + f''(a)(xa)2/2
现在我们应该准备好进行详细的比较了。
1. 牛顿法
回想 x 处梯度下降步骤的动机:我们最小化二次函数(即成本函数)。
牛顿方法在某种意义上使用了更好的二次函数最小化。 A 更好,因为它使用二次近似(即一阶和二阶偏导数)。
您可以将其想象为带有 Hessian 的扭曲梯度下降( Hessian 是 nxn 阶二阶偏导数的方阵)。
此外,牛顿方法的几何解释是,在每次迭代中,通过一个围绕xn
的二次函数来逼近f(x)
,然后朝着该二次函数的最大值/最小值迈出一步(在更高维度,这也可能是一个鞍点)。 请注意,如果f(x)
恰好是一个二次函数,则可以在一步中找到精确的极值。
缺点:
由于 Hessian 矩阵(即二阶偏导数计算),它的计算成本很高。
它吸引了在多变量优化中很常见的鞍点(即它的偏导数不同意这个输入应该是最大值还是最小值的点!)。
2. 有限内存 Broyden-Fletcher-Goldfarb-Shanno 算法:
简而言之,它类似于牛顿法,但这里使用梯度评估(或近似梯度评估)指定的更新来近似Hessian 矩阵。 换句话说,使用对 Hessian 逆矩阵的估计。
有限内存一词仅表示它仅存储一些隐式表示近似值的向量。
如果我敢说,当数据集较小时,L-BFGS 与其他方法相比相对表现最好,尤其是它节省了大量内存,但也有一些“严重”的缺点,如果不加以保护,它可能不会收敛到任何东西.
旁注:自 0.22 版以来,此求解器已成为 sklearn LogisticRegression 中的默认求解器,取代了 LIBLINEAR。
3. 大型线性分类库:
它是一种支持逻辑回归和线性支持向量机的线性分类(线性分类器通过基于特征的线性组合的值即特征值做出分类决策来实现这一点)。
求解器使用坐标下降 (CD) 算法,通过沿坐标方向或坐标超平面连续执行近似最小化来解决优化问题。
LIBLINEAR
是 ICML 2008 大规模学习挑战赛的获胜者。 它应用自动参数选择(又名 L1 正则化),当您有高维数据集时推荐使用(推荐用于解决大规模分类问题)
缺点:
如果函数的水平曲线不平滑,它可能会卡在非平稳点(即非最优)。
也不能并行运行。
它无法学习真正的多项(多类)模型; 相反,优化问题以“one-vs-rest”方式分解,因此针对所有类别训练单独的二元分类器。
旁注:根据 Scikit 文档:“liblinear”求解器是 0.22 版本之前的历史原因默认使用的求解器。 从那时起,默认使用的是有限内存 Broyden–Fletcher–Goldfarb–Shanno 算法。
4. 随机平均梯度:
SAG 方法优化有限数量的平滑凸函数的总和。 与随机梯度 (SG) 方法一样,SAG 方法的迭代成本与总和中的项数无关。 然而,通过结合先前梯度值的记忆,SAG 方法实现了比黑盒 SG 方法更快的收敛速度。
对于大型数据集,当样本数量和特征数量都很大时,它比其他求解器更快。
缺点:
它只支持 L2 惩罚。
它的内存成本为O(N)
,这对于大 N 来说可能不切实际(因为它会记住大约所有梯度的最近计算值)。
5.传奇:
SAGA 求解器是 SAG 的一个变体,它也支持非平滑惩罚=l1选项(即 L1 正则化)。 因此,这是稀疏多项逻辑回归的首选求解器,它也适用于非常大的数据集。
旁注:根据 Scikit 文档:SAGA 求解器通常是最佳选择。
下表摘自Scikit 文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.