You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

《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来控制迭代次数:

  1. 初始化模型时去掉相关参数:
sgd_reg = SGDRegressor(warm_start=True, penalty=None, learning_rate="constant", eta0=0.0005, random_state=42)
  1. 循环中替换为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 11:57:39