我正在使用sklearn
运行长网格搜索,并且我想将所有(强调所有)控制台输出记录到文件中。 使用>
从终端运行并将stdout更改为打开的文件等都可以...但只是部分,这是接受的答案here。 print
调用的任何内容都会保存到文件中,但保存在控制台上显示的不 所有。特别是:
Fitting 5 folds for each of 128 candidates, totalling 640 fits
[Parallel(n_jobs=4)]: Done 42 tasks | elapsed: 2.7s
[Parallel(n_jobs=4)]: Done 192 tasks | elapsed: 12.3s
[Parallel(n_jobs=4)]: Done 442 tasks | elapsed: 35.1s
[Parallel(n_jobs=4)]: Done 640 out of 640 | elapsed: 55.7s finished
第一行确实保存到文件中。但是不保存来自[Parallel(n_jobs=4)]
的日志记录。代替:
Fitting 5 folds for each of 128 candidates, totalling 640 fits
{'estimator__max_depth': 5, 'estimator__min_samples_leaf': 4, 'estimator__min_samples_split': 8}
...
...
第二行是我简单地打印获得的最佳参数; [Parallel(n_jobs=4)]
的所有内容都将丢失。有谁知道如何将其保存到文件中?
答案 0 :(得分:0)
来自内部joblib
用于并行化的sklearn
包的source:
def _print(self, msg, msg_args):
"""Display the message on stout or stderr depending on verbosity"""
# XXX: Not using the logger framework: need to
# learn to use logger better.
if not self.verbose:
return
if self.verbose < 50:
writer = sys.stderr.write
else:
writer = sys.stdout.write
msg = msg % msg_args
writer('[%s]: %s\n' % (self, msg))
因此OP使用verbose=1
时,重定向stderr
应该捕获缺失的行。但是这不会得到stdout
。因此,可以使用this answer合并它们并执行:
# necessary imports
logfile = open('test.txt', 'w')
original_stderr = sys.stderr
original_stdout = sys.stdout
sys.stdout = Tee(sys.stdout, logfile)
sys.stderr = sys.stdout
.
.
[code to log]
.
.
sys.stdout = original_stdout
sys.stderr = original_stderr
logfile.close()