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

rcs*_*rcs 12 python xgboost

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

在此处输入图片说明

但是当我这样做时

predictions = my_model.predict(test_data_process)    
Run Code Online (Sandbox Code Playgroud)

它给出了以下错误:

ValueError: feature_names 不匹配: ['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', 'BsmtFinSF2', 'BsmtFinSF2', 'BsmtFmsF,'stFmSF', 'YearBuilt', 'YearRemodAdd' 2ndFlrSF','LowQualFinSF'、'GrLivArea'、'BsmtFullBath'、'BsmtHalfBath'、'FullBath'、'HalfBath'、'BedroomAbvGr'、'KitchenAbvGr'、'TotRmsAbvGrd'、'Garage'sGarage's ', 'WoodDeckSF', 'OpenPorchSF', 'EnclosedPorch', '3SsnPorch', 'ScreenPorch', 'PoolArea', 'MiscVal', 'YrMoSold'] 预期 f22, f25, f0, f34, f320, f35 , 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 没有以下字段: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、FireplacesH、BSFRmF、WoodQual、Fireplaces、FarplacesF、WoodsF、WoodFull、FW

所以它抱怨训练数据 (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)    
Run Code Online (Sandbox Code Playgroud)

epa*_*aro 14

这是一个诚实的错误。

提供数据时,您使用的是 np 数组:

train_X, val_X, train_y, val_y = train_test_split(X.values, y.values, test_size=0.2)
Run Code Online (Sandbox Code Playgroud)

X.values是一个 np.array )

没有定义列名

输入数据集进行预测时,您使用的是数据框

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

predictions = my_model.predict(test_data_process.values)  
Run Code Online (Sandbox Code Playgroud)

(添加.values

  • np队友。你试过使用 lightgbm 吗?它是比 xgboost 更好的 SGD 实现。 (3认同)
  • 我有类似的问题,但是,添加 .values 并不能解决问题。 (2认同)