我将训练 (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)