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

如何解决XGBoost分类器出现的ValueError: feature mismatch错误?

错误原因

这个feature_names mismatch报错是XGBoost的特征名校验机制触发的,XGBoost默认要求训练数据和预测数据的特征名、特征顺序、特征数量完全一致,你的代码有两个问题导致校验失败:

  • RFE特征选择仅完成了拟合操作,没有对训练集、测试集同步应用特征筛选逻辑,同时你训练XGBoost时用的还是未经过RFE筛选的全量训练集特征,没有用到特征选择的结果
  • SMOTE的fit_resample方法如果输入是pandas DataFrame,默认返回numpy数组,丢失了原有的特征名。模型训练时用的是XGBoost自动生成的默认特征名f0、f1...,而测试集保留了原始特征名,二者不匹配

解决方法

修正逻辑

  1. RFE拟合完成后,调用transform方法同步转换训练集和测试集,保证二者特征维度、顺序完全一致
  2. 统一训练集、测试集的特征名格式,要么全部保留特征名保证一致,要么统一转为numpy数组跳过XGBoost的特征名校验

修正后代码

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from imblearn.over_sampling import SMOTE
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from xgboost import XGBClassifier

# 数据集拆分
X_train, X_test, y_train, y_test = train_test_split(
     features, label, test_size=0.50, random_state=42)

# 过采样,处理后保留特征名
oversample = SMOTE()
X_train, y_train = oversample.fit_resample(X_train, y_train)
# 过采样后如果返回numpy数组,转回DataFrame保留原特征名
if isinstance(X_train, np.ndarray):
    X_train = pd.DataFrame(X_train, columns=features.columns)

# 特征选择
estimator = LogisticRegression()
selector = RFE(estimator, n_features_to_select=5, step=1)
selector = selector.fit(X_train, y_train)
# 同步转换训练集和测试集为筛选后的特征
X_train_selected = selector.transform(X_train)
X_test_selected = selector.transform(X_test)
# 统一转成numpy数组,跳过特征名校验
X_train_selected = np.array(X_train_selected)
X_test_selected = np.array(X_test_selected)

# 模型训练预测
model = XGBClassifier()
model.fit(X_train_selected, y_train)
y_pred = model.predict(X_test_selected)

临时快速解决方案

如果不需要保留特征名,也可以直接在预测时把测试集转为numpy数组,跳过特征名校验:

y_pred = model.predict(np.array(X_test))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 06:45:02