我最近一直在运行一些线性/逻辑回归模型,我想知道如何为每次迭代输出成本函数。sci-kit 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
的源代码中,他们使用了Numpy的普通最小二乘(源)。最后,Numpy的最小二乘函数使用函数
scipy.linalg.lapack.dgelsd
,它是用Fortran编写的LAPACK(线性代数包)函数DGELSD
的包装器。
也就是说,对于scikit-learn开发人员来说,进入错误计算(如果有的话)并不容易。然而,对于LinearRegression
的各种使用以及我所拥有的更多,成本-函数和迭代时间之间的权衡得到了很好的解决。