scala - Spark2 - LogisticRegression 训练完成,但结果未收敛,因为 : line search failed

标签 scala apache-spark apache-spark-mllib logistic-regression

在训练逻辑回归分类器时,我收到以下错误:

2016-08-16 20:50:23,833 ERROR [main] optimize.LBFGS (Logger.scala:error(27)) - Failure! Resetting history: breeze.optimize.FirstOrderException: Line search zoom failed
2016-08-16 20:50:24,009 INFO  [main] optimize.StrongWolfeLineSearch (Logger.scala:info(11)) - Line search t: 0.9 fval: 0.4515497761131565 rhs: 0.45154977611314895 cdd: 3.4166889881493167E-16

然后程序继续运行一段时间,但随后我遇到了这个错误:

2016-08-16 20:50:24,365 ERROR [main] optimize.LBFGS (Logger.scala:error(27)) - Failure again! Giving up and returning. Maybe the objective is just poorly behaved?
2016-08-16 20:50:24,367 WARN  [main] classification.LogisticRegression (Logging.scala:logWarning(66)) - LogisticRegression training finished but the result is not converged because: line search failed!
2016-08-16 20:50:27,143 INFO  [main] optimize.StrongWolfeLineSearch (Logger.scala:info(11)) - Line search t: 0.4496001808762097 fval: 0.5641490068577 rhs: 0.6931115872739131 cdd: 0.01924752705390458
2016-08-16 20:50:27,143 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Step Size: 0.4496
2016-08-16 20:50:27,144 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Val and Grad Norm: 0.564149 (rel: 0.186) 0.622296
2016-08-16 20:50:27,181 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Step Size: 1.000
2016-08-16 20:50:27,181 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Val and Grad Norm: 0.484949 (rel: 0.140) 0.285684
2016-08-16 20:50:27,226 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Step Size: 1.000
2016-08-16 20:50:27,226 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Val and Grad Norm: 0.458425 (rel: 0.0547) 0.0789000
2016-08-16 20:50:27,263 INFO  [main] optimize.LBFGS (Logger.scala:info(11)) - Step Size: 1.000

但随后训练仍在继续。

尽管看起来训练已经成功完成(我得到了一个模型,我对测试集进行了预测,验证了分类器等),但我还是担心这个错误。 任何想法错误意味着什么?有什么建议如何克服它吗? (我使用 10, 000 作为最大迭代次数)

最佳答案

问题出在 Logistic 回归算法使用的 LBFGS 优化器上。

当梯度错误或收敛容差设置得太紧时,最有可能出现此错误。

就我而言,我运行的算法如下:

new LogisticRegression().
        setFitIntercept(true).
        setRegParam(0.3).
        setMaxIter(100000).
        setTol(0.0).
        setStandardization(true).
        setWeightCol("classWeightCol").setLabelCol("label").setFeaturesCol("features")

迭代的收敛容差设置为 0 (setTol(0.0)) Spark 文档状态:

"Smaller value will lead to higher accuracy with the cost of more iterations. Default is 1E-6. "

但是一旦将setter更改为setTol(0.1),行搜索错误就不会再发生。

模型不收敛时的其他可能性是增加迭代次数

关于scala - Spark2 - LogisticRegression 训练完成,但结果未收敛,因为 : line search failed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38981793/

相关文章:

scala - Scala 中的特征分解

apache-spark - 在pySpark中使用数字和分类值对两列进行透视

apache-spark - Map Reduce 和 Spark 关于 Hive 引擎的区别是什么?

sql - Spark SQL查询与DataFrame函数

java - 如何在 Apache Spark Pipeline 中打印最佳模型参数?

scala - 在 Apache Spark 中使用 RowMatrix.columnSimilarities 后打印 CooperativeMatrix

apache-spark - Spark 1.6 中可以保存 GBTClassifier 吗?

java - 为什么在这种情况下使用 scala 并行性会降低性能?

scala - 使用投影定义要在 Slick 中选择的列列表

scala - Play 2 框架的外部配置