最近我一直在运行一些线性/逻辑回归模型,我想知道如何输出每轮迭代的成本函数。scikit-learn中的LinearRegression参数之一是’maxiter’,但实际上你需要查看成本与迭代的关系来确定这个值到底应该设为多少,即是否值得为了更高的计算时间而运行更多的迭代等
我确定我遗漏了什么,但我以为应该有一个方法可以输出这些信息?
提前感谢!
回答:
在拟合任何估计器时,必须了解是否存在迭代(意味着计算成本函数)还是存在解析精确解。
线性回归
实际上,线性回归——即最小化普通最小二乘法——不是一种算法,而是一个可以使用不同技术解决的最小化问题。而这些技术
不深入探讨这里描述的统计部分的细节:
在实践中,至少有三种方法用于计算最小二乘解:正常方程、QR分解和奇异值分解。
就我对代码细节的了解而言,似乎计算时间是通过获取解析精确解来涉及的,而不是通过迭代成本函数。但我猜这取决于你的系统是欠定、适定还是超定,以及你使用的语言和库。
逻辑回归
与线性回归一样,逻辑回归是一个可以使用不同技术解决的最小化问题,对于scikit-learn来说,这些技术是:newton-cg
、lbfgs
、liblinear
和sag
。正如你提到的,sklearn.linear_model.LogisticRegression
包括max_iter
参数,这意味着它包括迭代*。这些迭代要么是因为更新的参数不再变化——达到某个epsilon值——要么是因为达到了最大迭代次数而被控制。
*如文档中提到的,仅对某些求解器包括迭代
仅对newton-cg、sag和lbfgs求解器有用。求解器收敛所需的最大迭代次数。
实际上,每个求解器都有自己的实现,例如这里的liblinear
求解器。
我建议使用verbose
参数,可能设置为2
或3
以获取最大值。根据求解器的不同,它可能会打印成本函数错误。然而,我不明白你打算如何使用这些信息。
另一种解决方案可能是编写你自己的求解器,并在每次迭代时打印成本函数。
好奇害死猫,但我检查了scikit的源代码,其中涉及了更多内容。
-
首先,
sklearn.linear_model.LinearRegression
使用fit来训练其参数。 -
然后,在
fit
的源代码中,他们使用了Numpy的普通最小二乘法(源)。 -
最后,Numpy的Least Square函数使用了函数
scipy.linalg.lapack.dgelsd
,这是对Fortran编写的LAPACK(线性代数包)函数DGELSD
的包装(源)。
也就是说,对于scikit-learn开发者来说,进入错误计算(如果有的话)并不容易。然而,对于我使用过的LinearRegression
和许多其他情况,成本函数与迭代时间之间的权衡得到了很好的处理。