feature_names 尽管具有相同的列,但 xgboost 中的错误

feature_names mismach in xgboost despite having same columns

我将训练 (X) 和测试数据 (test_data_process) 设置为相同的列和顺序,如下所示:

但是当我这样做时

predictions = my_model.predict(test_data_process)    

它给出了以下错误:

ValueError: feature_names mismatch: ['f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'f10', 'f11', 'f12', 'f13', 'f14', 'f15', 'f16', 'f17', 'f18', 'f19', 'f20', 'f21', 'f22', 'f23', 'f24', 'f25', 'f26', 'f27', 'f28', 'f29', 'f30', 'f31', 'f32', 'f33', 'f34'] ['MSSubClass', 'LotFrontage', 'LotArea', 'OverallQual', 'OverallCond', 'YearBuilt', 'YearRemodAdd', 'MasVnrArea', 'BsmtFinSF1', 'BsmtFinSF2', 'BsmtUnfSF', 'TotalBsmtSF', '1stFlrSF', '2ndFlrSF', 'LowQualFinSF', 'GrLivArea', 'BsmtFullBath', 'BsmtHalfBath', 'FullBath', 'HalfBath', 'BedroomAbvGr', 'KitchenAbvGr', 'TotRmsAbvGrd', 'Fireplaces', 'GarageYrBlt', 'GarageCars', 'GarageArea', 'WoodDeckSF', 'OpenPorchSF', 'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'MiscVal', 'YrMoSold'] expected f22, f25, f0, f34, f32, f5, f20, f3, f33, f15, f24, f31, f28, f9, f8, f19, f14, f18, f17, f2, f13, f4, f27, f16, f1, f29, f11, f26, f10, f7, f21, f30, f23, f6, f12 in input data training data did not have the following fields: OpenPorchSF, BsmtFinSF1, LotFrontage, GrLivArea, YrMoSold, FullBath, TotRmsAbvGrd, GarageCars, YearRemodAdd, BedroomAbvGr, PoolArea, KitchenAbvGr, LotArea, HalfBath, MiscVal, EnclosedPorch, BsmtUnfSF, MSSubClass, BsmtFullBath, YearBuilt, 1stFlrSF, ScreenPorch, 3SsnPorch, TotalBsmtSF, GarageYrBlt, MasVnrArea, OverallQual, Fireplaces, WoodDeckSF, 2ndFlrSF, BsmtFinSF2, BsmtHalfBath, LowQualFinSF, OverallCond, GarageArea

所以它抱怨训练数据 (X) 没有这些字段,而它有。

如何解决这个问题?

[更新]:

我的代码:

X = data.select_dtypes(exclude=['object']).drop(columns=['Id'])
X['YrMoSold'] = X['YrSold'] * 12 + X['MoSold']
X = X.drop(columns=['YrSold', 'MoSold', 'SalePrice'])
X = X.fillna(0.0000001)

train_X, val_X, train_y, val_y = train_test_split(X.values, y.values, test_size=0.2)

my_model = XGBRegressor(n_estimators=100, learning_rate=0.05, booster='gbtree')
my_model.fit(train_X, train_y, early_stopping_rounds=5, 
    eval_set=[(val_X, val_y)], verbose=False)

test_data_process = test_data.select_dtypes(exclude=['object']).drop(columns=['Id'])
test_data_process['YrMoSold'] = test_data_process['YrSold'] * 12 + test_data['MoSold']
test_data_process = test_data_process.drop(columns=['YrSold', 'MoSold'])
test_data_process = test_data_process.fillna(0.0000001)
test_data_process = test_data_process[X.columns]

predictions = my_model.predict(test_data_process)    

这是一个无心的错误。

使用 np 数组输入数据时:

train_X, val_X, train_y, val_y = train_test_split(X.values, y.values, test_size=0.2)

(X.values 是一个 np.array)

没有定义列名

输入数据集进行预测时,您正在使用数据框

你应该使用 numpy 数组,你可以使用以下方法转换它:

predictions = my_model.predict(test_data_process.values)  

(添加 .values)

我也遇到了同样的问题,花了好几个小时查看了很多SO和GitHub的Q&A。终于,问题解决了:)。我感谢 ianozsvald 的 this response,他提到我们必须在开始时传递 numpy 数组。

在我的例子中,当我单独处理 XGBoost 时(当我没有将它作为基础学习器包含在 Stacking 分类器中时),没有产生任何问题。但是,当包含 XGBoost 的多个基础学习器包含在 Stacking 分类器中时,当我试图调用 SHAPley Additive Explanations 的 KernelExplainer 来解释 Stacking 分类器时,我得到了错误。

这是我解决问题的方法。

  1. 首先,我在拟合 Stacking 分类器时将 train_x_df 更改为 train_x_df.values
  2. 其次,我把train_x_df改成了train_x_df.values,作为KernelExplainer的数据传过去了。

一句话,要解决这个问题,到处都得用numpy表示dataframe(可以用属性.values)。请记住,只执行第二步是行不通的(至少在我的情况下),因为它仍然不匹配。