将所有输出从sklearn GridSearchCV打印到文件?

时间:2018-06-10 19:17:54

标签: python-3.x scikit-learn

我正在使用sklearn运行长网格搜索,并且我想将所有(强调所有)控制台输出记录到文件中。 使用>从终端运行并将stdout更改为打开的文件等都可以...但只是部分,这是接受的答案hereprint调用的任何内容都会保存到文件中,但保存在控制台上显示的 所有。特别是:

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)]的所有内容都将丢失。有谁知道如何将其保存到文件中?

1 个答案:

答案 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()