使用contextlib.redirect_stdout捕获LogisticRegression输出仅获最后一行的问题
问题原因
sklearn的LogisticRegression在设置verbose=1时,训练过程中的Epoch损失日志是输出到**标准错误流(stderr)**而非标准输出流(stdout)的。你之前用的redirect_stdout、sys.stdout操作以及Jupyter的%%capture默认只捕获stdout,自然拿不到完整的训练日志,只能抓到最后一行可能输出到stdout的收敛提示。
解决办法
方法1:捕获stderr流
用contextlib.redirect_stderr来捕获标准错误输出,就能拿到所有训练日志:
from contextlib import redirect_stderr from sklearn.linear_model import LogisticRegression import io log_capture_string = io.StringIO() model = LogisticRegression(verbose=1, max_iter=100) with redirect_stderr(log_capture_string): model.fit(X_train, y_train) # 获取完整日志 full_log = log_capture_string.getvalue() print(full_log)
方法2:同时捕获stdout和stderr(Jupyter环境)
在Jupyter中使用%%capture时,指定同时捕获stdout和stderr:
%%capture captured_output from sklearn.linear_model import LogisticRegression model = LogisticRegression(verbose=1, max_iter=100) model.fit(X_train, y_train) # 查看完整捕获内容 print(captured_output.stderr)
方法3:手动替换sys.stderr
如果需要更底层的控制,可以直接替换sys.stderr:
import sys from sklearn.linear_model import LogisticRegression import io old_stderr = sys.stderr sys.stderr = io.StringIO() model = LogisticRegression(verbose=1, max_iter=100) model.fit(X_train, y_train) full_log = sys.stderr.getvalue() sys.stderr = old_stderr # 恢复原stderr print(full_log)
内容的提问来源于stack exchange,提问作者neverreally
相关产品推荐
相关产品推荐

