ValueError:feature_names mismatch:在predict()函数的xgboost中

Suj*_*mar 12 python regression machine-learning pandas xgboost

我训练了一个XGBoostRegressor模型.当我必须使用这个训练模型来预测新输入时,predict()函数会抛出feature_names不匹配错误,尽管输入特征向量具有与训练数据相同的结构.

此外,为了在与训练数据相同的结构中构建特征向量,我正在进行大量低效的处理,例如添加新的空列(如果数据不存在),然后重新排列数据列以使其与培训结构.是否有更好,更清晰的格式化输入方式,以便与训练结构相匹配?

Ath*_*har 22

这是模型构建时列名的顺序与模型评分时列名的顺序不同的情况。

我已使用以下步骤来克服此错误

首先加载pickle文件

model = pickle.load(open("saved_model_file", "rb"))
Run Code Online (Sandbox Code Playgroud)

按照使用顺序提取所有列

cols_when_model_builds = model.get_booster().feature_names
Run Code Online (Sandbox Code Playgroud)

重新排序熊猫数据框

pd_dataframe = pd_dataframe[cols_when_model_builds]
Run Code Online (Sandbox Code Playgroud)

  • 我尝试检查推理数据的特征名称,这是一个 numpy 数组,但没有得到任何结果。 (2认同)

Suj*_*mar 6

根据我的发现,预测函数不会将DataFrame(或稀疏矩阵)作为输入.这是可以在这里找到的错误之一https://github.com/dmlc/xgboost/issues/1238

为了解决这个问题,在DataFrame的情况下使用as_matrix()函数,或者在稀疏矩阵的情况下使用toarray().

在修复错误或以不同方式实现功能之前,这是唯一的解决方法.


小智 6

当我使用pandas DataFrame(非稀疏表示)时,我也遇到了这个问题。

我将训练和测试数据转换为numpy ndarray

          `X_train = X_train.as_matrix()
           X_test = X_test.as_matrix()` 
Run Code Online (Sandbox Code Playgroud)

这就是我摆脱该错误的方法!

  • “as_matrix()”方法现在似乎已被贬值。建议使用“.values”,这对我不起作用,但文档在[此处](https://pandas.pydata.org/pandas-docs/version/0.23.4/ generated/pandas. DataFrame.as_matrix.html)。 (2认同)

Cat*_*ian 5

我遇到了同样的问题,通过添加以下代码将列车数据帧列名称传递给测试数据帧已经解决了这个问题:

test_df = test_df[train_df.columns]
Run Code Online (Sandbox Code Playgroud)


sau*_*mar 5

尝试在将数据传递到适合/预测之前将其转换为ndarray。例如:如果您的火车数据是train_df而测试数据是test_df。使用以下代码:

train_x = train_df.values
test_x = test_df.values
Run Code Online (Sandbox Code Playgroud)

现在拟合模型:

xgb.fit(train_x,train_y)
Run Code Online (Sandbox Code Playgroud)

最后,预测:

pred = xgb.predict(test_x)
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!