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

XGBClassifier.fit()报错:意外关键字参数'early_stopping_rounds'如何解决?

解决XGBoost 2.1.0中XGBClassifier.fit()不识别early_stopping_rounds的问题

错误原因

XGBoost 2.0及以后版本,其scikit-learn兼容接口(如XGBClassifier)的fit方法移除了early_stopping_rounds参数,该功能需要通过模型初始化参数或回调函数来实现。

解决方案

下面提供两种可行的修正方式,同时修复原代码中一处提前引用X_train的语法错误:

方式1:初始化模型时指定早停参数

将early_stopping_rounds和eval_set直接放到XGBClassifier的初始化参数中:

from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
import pandas as pd

RANDOM_STATE = 55  # 保证复现性的随机种子
df = pd.read_csv("doc/heart.csv")

cat_variables = ['Sex', 'ChestPainType', 'RestingECG', 'ExerciseAngina', 'ST_Slope']
df = pd.get_dummies(data=df, prefix=cat_variables, columns=cat_variables)

var = [x for x in df.columns if x != 'HeartDisease']
X_train, X_test, y_train, y_test = train_test_split(df[var], df['HeartDisease'], train_size=0.8, random_state=RANDOM_STATE)
print(X_train.shape)

# 修正原代码中提前引用X_train的错误:先拆分数据集再计算n
n = int(len(X_train)*0.8)
X_train_fit, X_train_eval, y_train_fit, y_train_eval = X_train[:n], X_train[n:], y_train[:n], y_train[n:]

import xgboost
print(xgboost.__version__)    # 2.1.0

# 初始化模型时指定早停参数和验证集
xgb_model = XGBClassifier(
    n_estimators=500, 
    learning_rate=0.1,
    verbosity=1, 
    random_state=RANDOM_STATE,
    early_stopping_rounds=10,
    eval_set=[(X_train_eval, y_train_eval)]
)
xgb_model.fit(X_train_fit, y_train_fit)

方式2:使用EarlyStopping回调函数

通过callbacks参数传入EarlyStopping实例,这种方式更灵活,适合需要自定义早停逻辑的场景:

from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier, EarlyStopping
import pandas as pd

RANDOM_STATE = 55
df = pd.read_csv("doc/heart.csv")

cat_variables = ['Sex', 'ChestPainType', 'RestingECG', 'ExerciseAngina', 'ST_Slope']
df = pd.get_dummies(data=df, prefix=cat_variables, columns=cat_variables)

var = [x for x in df.columns if x != 'HeartDisease']
X_train, X_test, y_train, y_test = train_test_split(df[var], df['HeartDisease'], train_size=0.8, random_state=RANDOM_STATE)
print(X_train.shape)

n = int(len(X_train)*0.8)
X_train_fit, X_train_eval, y_train_fit, y_train_eval = X_train[:n], X_train[n:], y_train[:n], y_train[n:]

import xgboost
print(xgboost.__version__)    # 2.1.0

xgb_model = XGBClassifier(
    n_estimators=500, 
    learning_rate=0.1,
    verbosity=1, 
    random_state=RANDOM_STATE
)

# 定义早停回调
early_stop = EarlyStopping(
    rounds=10,
    verbose=1  # 打印早停日志
)

# fit时传入eval_set和callbacks
xgb_model.fit(
    X_train_fit, y_train_fit,
    eval_set=[(X_train_eval, y_train_eval)],
    callbacks=[early_stop]
)

额外说明

原代码中存在一处逻辑错误:n = int(len(X_train)*0.8)写在了train_test_split之前,此时X_train还未定义,会触发NameError,上面的修正代码已经将这行代码移到了数据集拆分之后。

内容的提问来源于stack exchange,提问作者user19554100

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 09:50:54