使用XGBRegressor时遭遇AttributeError问题的解决咨询
解决XGBRegressor在Python 3.10中出现的
AttributeError: module 'collections' has no attribute 'Mapping'问题 问题场景
在Python 3.10.12版本的Jupyter Notebook中运行XGBRegressor代码:
from xgboost import XGBRegressor #xgb regressor module xgb = XGBRegressor(n_estimators = 3000,learning_rate=0.01) xgb.fit(X_train,y_train)
运行后抛出如下错误:
AttributeError Traceback (most recent call last) Cell In[287], line 4 1 from xgboost import XGBRegressor #xgb regressor module 3 xgb = XGBRegressor(n_estimators = 3000,learning_rate=0.01) ----> 4 xgb.fit(X_train,y_train) 5 pred_xgb = xgb.predict(X_test) 6 s6 = r2_score(Y_test,pred_xgb) File F:\Anaconda\lib\site-packages\xgboost\sklearn.py:320, in XGBModel.fit(self, X, y, sample_weight, eval_set, eval_metric, early_stopping_rounds, verbose, xgb_model, sample_weight_eval_set) 317 else: 318 params.update({'eval_metric': eval_metric}) ---> 320 self._Booster = train(params, trainDmatrix, 321 self.n_estimators, evals=evals, 322 early_stopping_rounds=early_stopping_rounds, 323 evals_result=evals_result, obj=obj, feval=feval, 324 verbose_eval=verbose, xgb_model=xgb_model) 326 if evals_result: 327 for val in evals_result.items(): File F:\Anaconda\lib\site-packages\xgboost\training.py:200, in train(params, dtrain, num_boost_round, evals, obj, feval, maximize, early_stopping_rounds, evals_result, verbose_eval, xgb_model, callbacks, learning_rates) 196 warnings.warn("learning_rates parameter is deprecated - use callback API instead", 197 DeprecationWarning) 198 callbacks.append(callback.reset_learning_rate(learning_rates)) ---> 200 return _train_internal(params, dtrain, 201 num_boost_round=num_boost_round, 202 evals=evals, 203 obj=obj, feval=feval, 204 xgb_model=xgb_model, callbacks=callbacks) File F:\Anaconda\lib\site-packages\xgboost\training.py:32, in _train_internal(params, dtrain, num_boost_round, evals, obj, feval, xgb_model, callbacks) 29 for eval_metric in eval_metrics: 30 params += [('eval_metric', eval_metric)] ---> 32 bst = Booster(params, [dtrain] + [d[0] for d in evals]) 33 nboost = 0 34 num_parallel_tree = 1 File F:\Anaconda\lib\site-packages\xgboost\core.py:862, in Booster.__init__(self, params, cache, model_file) 859 self.handle = ctypes.c_void_p() 860 _check_call(_LIB.XGBoosterCreate(dmats, c_bst_ulong(len(cache)), 861 ctypes.byref(self.handle))) ---> 862 self.set_param({'seed': 0}) 863 self.set_param(params or {}) 864 if model_file is not None: File F:\Anaconda\lib\site-packages\xgboost\core.py:995, in Booster.set_param(self, params, value) 985 def set_param(self, params, value=None): 986 """Set parameters into the Booster. 987 988 Parameters (...) 993 value of the specified parameter, when params is str key 994 """ ---> 995 if isinstance(params, collections.Mapping): 996 params = params.items() 997 elif isinstance(params, STRING_TYPES) and value is not None: AttributeError: module 'collections' has no attribute 'Mapping'
解决方案
问题原因:Python 3.10及以上版本中,
collections.Mapping已被移除,官方将其迁移到collections.abc.Mapping,而当前使用的XGBoost版本未适配该变化,导致报错。方法1:升级XGBoost到兼容版本(推荐)
在终端或Jupyter Notebook的代码单元格中执行以下命令升级:pip install --upgrade xgboost若使用Anaconda环境,可改用:
conda update xgboost方法2:临时兼容处理(仅应急使用)
在所有代码最开头添加以下两行,手动为collections模块补充Mapping属性:import collections.abc collections.Mapping = collections.abc.Mapping注意:这种方法属于临时补丁,可能引发其他未知问题,优先选择升级XGBoost。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

