我正在尝试使用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])
答案 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-learn
按print()
进行记录,要将其保存到外部文件中,则应将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()
)