RandomizedSearchCV与BaggingRegressor结合报错求助
我之前碰到过一模一样的报错,这个AttributeError: 'NoneType' object has no attribute 'write'基本是多进程并行环境下的verbose输出冲突导致的,结合你的代码和运行环境,我来帮你拆解问题并给出可行的解决办法:
问题根源
你在RandomizedSearchCV中设置了n_jobs>1(多进程并行),同时又把verbose=1放进了BaggingRegressor的调参字典里。在Windows系统的多进程机制下,子进程的标准输出(stdout)可能会被置为None,当子进程尝试写入verbose日志时,就会触发这个报错。另外你给基估计器HuberRegressor设置了warm_start=True,虽然单独训练没问题,但并行调参时可能会引发状态共享的潜在风险,但这次的核心矛盾还是verbose输出的问题。
解决方案
方案1:移除调参字典中的verbose参数
把bagparams里的"verbose": [1]删掉,改为在初始化BaggingRegressor时设置(或者直接关闭verbose),因为并行调参时的日志输出很容易引发IO冲突:
modelfinal = HuberRegressor(fit_intercept=True, alpha=4.2200999999999995, epsilon=1.3100000000000003, warm_start=True, max_iter=450) bagmodel = BaggingRegressor(verbose=0) # 这里设置verbose为0,默认也是0可以不写 bagparams = {"max_samples": np.arange(0.05, 1.01, 0.05), "max_features": np.arange(0.05, 1.01, 0.05), "bootstrap": [True, False], "bootstrap_features": [True, False], "n_estimators": np.arange(10, 600, 10), "base_estimator": [modelfinal], "random_state": [baseseed]} bagmodelrs = RandomizedSearchCV(bagmodel, bagparams, n_iter=100, n_jobs=njobs, scoring="neg_mean_absolute_error", verbose=1, cv=kf) bagmodelrs.fit(X_df_train, y_df_train)
方案2:关闭RandomizedSearchCV的verbose
如果方案1还报错,可以把RandomizedSearchCV的verbose也设为0,彻底规避并行时的输出问题:
bagmodelrs = RandomizedSearchCV(bagmodel, bagparams, n_iter=100, n_jobs=njobs, scoring="neg_mean_absolute_error", verbose=0, cv=kf)
方案3:调整HuberRegressor的warm_start参数(可选)
虽然不是这次报错的直接原因,但warm_start=True在Bagging的并行训练中可能会导致不同基估计器共享状态,建议改为warm_start=False,避免后续出现其他奇怪的问题:
modelfinal = HuberRegressor(fit_intercept=True, alpha=4.2200999999999995, epsilon=1.3100000000000003, warm_start=False, max_iter=450)
验证建议
优先尝试方案1,这是解决当前报错最直接的办法。如果还是不行,再依次尝试方案2和3。
内容的提问来源于stack exchange,提问作者CGmeiner

