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

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个特征的数据集结构完全不匹配。
修复方案

按以下步骤调整即可解决问题:

  1. 清空当前运行环境的变量(重置Python内核/重启运行环境),彻底清除残留的旧模型,避免历史训练结果干扰。
  2. 修正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)
  1. 如果后续仍偶发特征名不匹配问题,可以在传入特征时将pandas DataFrame转为numpy数组(传入X_train.values、X_test.values),直接跳过特征名校验流程,但该方案需要提前保证训练集、测试集的特征列顺序完全一致,避免列错位导致预测结果异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:57:24