sklearn.linear_model.LogisticRegression是否总是收敛到最佳解决方案?

时间:2017-08-23 23:44:23

标签: scikit-learn mathematical-optimization logistic-regression

使用此代码时,我注意到它的收敛速度令人难以置信(很小) 一秒的分数),即使模型和/或数据非常大。一世 怀疑在某些情况下我没有得到任何接近最佳解决方案的东西, 但这很难证明。有一些类型的选项会很高兴 全局优化器如盆地跳跃算法,即使这消耗了100 CPU的1000倍。有没有人对这个问题有任何想法?

1 个答案:

答案 0 :(得分:9)

这是一个非常复杂的问题,这个答案可能不完整,但应该给你一些提示(因为你的问题也表明了一些知识差距):

  • (1)首先,我不同意some type of global optimizer such as the basin hopping algorithm, even if this consumed 100 to 1,000 times as much CPU的愿望,因为这在大多数情况下(在ML世界中)没有帮助,因为差异是如此微妙,优化错误经常会与其他错误(模型权力;经验风险)相比可忽略不计

    • 阅读"Stochastic Gradient Descent Tricks" (Battou)以获取一些概述(以及错误组件!)
    • 他甚至给出了使用快速近似算法的一个非常重要的理由(如果1000x训练时间不是问题,则不一定非常适合您的情况):近似优化可以实现更好的预期风险,因为更多的训练示例可以在允许的时间内处理
  • (2)盆地跳跃是全球优化的一些高度启发式工具(寻找全局最小值而不是局部最小值)完全保证(接触NP-硬度和co。)。 这是你想在这里使用的最后一个算法(见第(3)点)!

  • (3)逻辑回归问题是凸优化问题!

    • 本地最小值始终是全局最小值,它来自凸性(我忽略了像严格/唯一解决方案和co这样的东西)!
    • 因此,您将始终使用针对凸优化进行调整的内容!从来没有盆地跳跃!
  • (4)有不同的求解器,每个求解器都支持不同的问题变体(不同的正则化和合作)。我们并不确切知道您正在优化什么,但当然这些解算器在融合方面的工作方式不同:

    • 带着以下评论
    • liblinear :可能正在使用一些基于CG的算法(共轭梯度),这意味着收敛高度依赖于数据
      • 如果实现准确收敛完全取决于具体实施(liblinear是高质量的)
      • 因为它是一阶方法我称之为一般准确性 medium
    • sag / saga :似乎有更好的收敛理论(没有检查太多),但又一次:它依赖于sklearn's docs中提到的数据如果解决方案准确,则高度取决于实施细节
      • 因为这些是一阶方法:一般准确度 medium
    • newton-cg :一个不精确的牛顿方法
      • 通常在收敛方面更加强大,因为线搜索取代了启发式或不断学习率(LS在一阶选择中成本很高)
      • 具有不精确核心的二阶方法:预期准确度:中高
    • lbfgs :准牛顿法
      • 一般来说,就像newton-cg
      • 这样的融合而言更为强大
      • 二阶法:预期准确度:中高

当然,二阶方法会因大规模数据(甚至是复杂性)而受到更多伤害,并且如前所述,并非所有解算器都支持sklearn中支持的每个logreg-optimization问题。

我希望你知道这个问题有多复杂(因为解决者内部非常复杂)。

最重要的事情

  • LogReg是凸的 - >使用针对无约束凸优化进行调整的求解器
  • 如果您想要中高精度:使用那些基于二阶的方法并进行多次迭代(它是一个参数)
  • 如果你想要高精度:使用更加保守/小心的二阶方法(no:hessian-approx; inverse-hessian-approx; truncating ...):
    • e.g。来自凸优化的任何现成求解器
    • 开源:cvxoptecos和co。
    • 商业:Mosek
    • (但你需要在他们的框架或一些包装器中自己制定模型;可能有一些经典逻辑回归的例子)
  • 正如所料:有些方法会因很多数据而变慢。