《Hands-On ML2》中SGDRegressor设置tol=-np.infty报错如何解决
SGDRegressor早停代码tol参数报错解决方案
问题背景
学习《Hands-On Machine Learning 2》中的随机梯度下降早停技术时,运行书中代码触发参数校验错误:
sklearn.utils._param_validation.InvalidParameterError: The 'tol' parameter of SGDRegressor must be a float in the range [0, inf) or None. Got -inf instead.
原因是scikit-learn版本更新后,SGDRegressor的tol参数校验规则收紧,旧版本允许设置-inf来强制单次fit()仅执行一轮迭代,但新版本不再支持该写法。
解决方法
方法一:调整tol和n_iter_no_change参数
将tol设为None,同时添加n_iter_no_change=np.inf,让模型忽略收敛判断,每次fit()严格执行max_iter=1轮迭代,和原代码逻辑一致:
sgd_reg = SGDRegressor(max_iter=1, tol=None, n_iter_no_change=np.inf, warm_start=True, penalty=None, learning_rate="constant", eta0=0.0005, random_state=42)
方法二:改用partial_fit()实现逐轮训练
直接使用partial_fit()替代fit(),该方法本身就是为逐轮增量训练设计的,无需依赖tol和max_iter=1来控制迭代次数:
- 初始化模型时去掉相关参数:
sgd_reg = SGDRegressor(warm_start=True, penalty=None, learning_rate="constant", eta0=0.0005, random_state=42)
- 循环中替换为
partial_fit():
for epoch in range(1000): sgd_reg.partial_fit(X_train_poly_scaled, y_train) y_val_predict = sgd_reg.predict(X_val_poly_scaled) val_error = mean_squared_error(y_val, y_val_predict) if val_error < minimum_val_error: minimum_val_error = val_error best_epoch = epoch best_model = deepcopy(sgd_reg)
内容的提问来源于stack exchange,提问作者Utku Can
相关产品推荐
相关产品推荐

