Python使用XGBoost Regressor报feature_names mismatch错误解决方法
错误产生原因
这个报错和特征是否为数值型、是否存在缺失值没有关联,核心触发原因有两个:
- 核心错误是
score()方法传参完全不符合接口要求。XGBRegressor遵循sklearn模型API规范,score()方法的参数顺序为score(X, y, sample_weight=None),第一个位置必须传入待评估的特征矩阵,第二个位置传入特征对应的真实标签。你的代码中写的是xgboostmodel.score(y_test, y_pred),第一个参数传入了一维的真实标签序列y_test,既不是训练时使用的3列结构的特征集,也没有对应的列名,XGBoost处理无明确列名的数组输入时,会自动生成f0、f1、f2……格式的默认特征名,和训练阶段传入的带明确列名(Product Visitors/Product Pageviews/Rating)的特征集无法匹配,直接触发特征名校验错误。 - 报错信息中提示缺失
f34、f5、f11、f7等字段,说明当前运行环境中存在残留的旧模型变量:你之前大概率用35个以上特征、无列名的数组训练过同名的xgboostmodel,没有清空变量就直接运行当前代码段,导致调用的是旧训练结果,和当前仅3个特征的数据集结构完全不匹配。
修复方案
按以下步骤调整即可解决问题:
- 清空当前运行环境的变量(重置Python内核/重启运行环境),彻底清除残留的旧模型,避免历史训练结果干扰。
- 修正
score()方法的传参逻辑,按照接口要求传入测试集特征和对应真实标签,不要把预测值、真实标签的顺序和位置传错。修正后的可运行代码如下:
cols_to_use = ['Product Visitors', 'Product Pageviews', 'Rating'] X = df[cols_to_use] y = df['Revenue'] X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) # 重新初始化模型,避免旧参数残留 xgboostmodel = XGBRegressor(n_estimators=1000, max_depth=7) xgboostmodel.fit(X_train, y_train) y_pred = xgboostmodel.predict(X_test) # 正确调用score方法:第一个参数为测试集特征,第二个为测试集真实标签 model_r2_score = xgboostmodel.score(X_test, y_test)
- 如果后续仍偶发特征名不匹配问题,可以在传入特征时将pandas DataFrame转为numpy数组(传入
X_train.values、X_test.values),直接跳过特征名校验流程,但该方案需要提前保证训练集、测试集的特征列顺序完全一致,避免列错位导致预测结果异常。
内容的提问来源于stack exchange,提问作者Nekojell
相关产品推荐
相关产品推荐

