写scikit - 学习详细日志到外部文件

时间:2017-01-06 14:27:01

标签: python scikit-learn svm jupyter-notebook cross-validation

我正在尝试使用GridSearchCV来优化SVR模型并因为过度拟合而面临问题,为了克服这个问题,我试图减少迭代次数而不是将其留下来直到收敛。为了比较两种模型我需要两种情况的迭代次数。

我尝试通过verbose = 1执行此操作,但它在jupyter笔记本中没有用。我需要访问迭代次数并将其保存为变量以绘制优化结果。将详细日志写入外部文件可以解决问题,但我无法做到。

我从上一个问题中得到了一些信息 Knowing the number of iterations needed for convergence in SVR scikit-learn 但仍然无法解决问题

以下是我的代码示例:

model_1=SVR(kernel='rbf',C=316,epsilon=0, gamma=0.003162,max_iter=2500,verbose=1)
model_1.fit(tr_sets[:,:2],tr_sets[:,2])

2 个答案:

答案 0 :(得分:2)

如果我理解scikit中的日志记录正确学习,他们根本就没有使用python日志记录基础结构,而是直接使用print(),这使得捕获它非常困难,特别是与jupyter笔记本一起使用时,这对于捕获标准流。

Aha发现它,它在内部使用了joblibs详细的打印基础设施,这就是我提到的问题。

https://github.com/scikit-learn/scikit-learn/blob/master/sklearn/cross_validation.py

我过去曾使用过这个技巧来使用normall日志记录工具来创建joblib:https://github.com/joblib/joblib/issues/190 但我不知道如何在scikit中进行那种猴子修补工作

答案 1 :(得分:2)

考虑到基督徒在答案中所说的话,如果scikit-learnprint()进行记录,要将其保存到外部文件中,则应将sys.stdout重定向到您希望的文件,然后任何print()输出将打印到文件而不是控制台。

要将sys.stdout重定向到文件,请执行以下操作:

import sys

sys.stdout=open("external_file.txt","w")
print ("this is a log message")

sys.stdout.close()

现在,如果你打开external_file.txt,你会在文件中看到“这是一条日志消息”文本

不要忘记在脚本末尾关闭文件!sys.stdout.close()