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
相关产品推荐
相关产品推荐

