如何解决XGBoost分类器出现的ValueError: feature mismatch错误?
错误原因
这个feature_names mismatch报错是XGBoost的特征名校验机制触发的,XGBoost默认要求训练数据和预测数据的特征名、特征顺序、特征数量完全一致,你的代码有两个问题导致校验失败:
- RFE特征选择仅完成了拟合操作,没有对训练集、测试集同步应用特征筛选逻辑,同时你训练XGBoost时用的还是未经过RFE筛选的全量训练集特征,没有用到特征选择的结果
- SMOTE的
fit_resample方法如果输入是pandas DataFrame,默认返回numpy数组,丢失了原有的特征名。模型训练时用的是XGBoost自动生成的默认特征名f0、f1...,而测试集保留了原始特征名,二者不匹配
解决方法
修正逻辑
- RFE拟合完成后,调用
transform方法同步转换训练集和测试集,保证二者特征维度、顺序完全一致 - 统一训练集、测试集的特征名格式,要么全部保留特征名保证一致,要么统一转为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
相关产品推荐
相关产品推荐

