如何在scikit-learn中显示每次迭代的成本函数?

时间:2016-07-04 08:08:36

标签: python machine-learning scikit-learn

我最近一直在运行一些线性/逻辑回归模型,我想知道如何为每次迭代输出成本函数。 sci-kit LinearRegression中的一个参数是“maxiter”,但实际上你需要看到成本与迭代,以找出这个值真正需要的是什么,即运行更多的计算时间的好处。迭代等

我确定我错过了一些东西,但我原本以为有一种方法可以输出这些信息?

提前致谢!

1 个答案:

答案 0 :(得分:4)

在拟合任何估算器时,必须要了解是否存在任何迭代(暗示计算成本函数)或分析精确解。

线性回归

事实上,线性回归 - 即普通最小二乘最小化 - 不是算法,而是可以使用不同技术解决的最小化问题。那些技术

没有详细介绍here所描述的统计部分:

  

实践中至少有三种方法用于计算最小二乘解:正规方程,QR分解和奇异值分解。

就我进入代码的细节而言,似乎通过获得分析精确解决方案而不是迭代成本函数来涉及计算时间。但我敢打赌,他们依赖于你的系统不足,好或者过于确定,以及你正在使用的语言和库。

Logistic回归

作为线性回归,Logistic回归是一个可以使用不同技术解决的最小化问题,对于scikit-learn,它们是:newton-cglbfgsliblinear和{{1 }}。 正如您所提到的,sag包含sklearn.linear_model.LogisticRegression参数,这意味着它包含迭代*。这些因为被更新的参数不再改变 - 达到某个epsilon值 - 或者因为它达到了最大迭代次数而被控制。

*如文档中所提到的,它仅包含一些解算器的迭代

  

仅适用于newton-cg,sag和lbfgs求解器。求解器收敛的最大迭代次数。

事实上,每个解算器都涉及自己的实现,例如max_iter求解器的here

我建议使用liblinear参数,可能等于verbose2来获取最大值。根据求解器,它可能会打印成本函数错误。但是,我不明白您打算如何使用这些信息。

另一个解决方案可能是编写自己的求解器并在每次迭代时打印成本函数。

好奇心杀死了猫,但我检查了scikit的源代码,其中涉及更多。

  1. 首先,3使用拟合来训练其参数。

  2. 然后,在sklearn.linear_model.LinearRegression的{​​{1}}代码中,他们使用sourceOrdinary Least Square of Numpy)。

  3. 最后,Numpy的最小二乘函数使用source fit,这是用Fortran编写的LAPACK(线性代数PACKage)函数scipy.linalg.lapack.dgelsd的包装器({ {3}})。

  4. 也就是说,进入错误计算(如果有的话)对于scikit-learn开发人员来说并不容易。然而,对于DGELSD的各种使用以及我所拥有的更多,在成本函数和迭代时间之间的权衡得到了很好的解决。