XGBoost预测在AI平台上不起作用:“功能名称不匹配”

时间:2019-07-30 07:41:41

标签: pandas machine-learning google-cloud-platform xgboost google-cloud-ml

我已经在GCP的AI平台(ex-ML Engine)上部署了XGBoost模型以进行预测(它作为joblib文件存储在GCS中)。但是,当我尝试对一系列功能进行预测时,会出现“功能不匹配”错误。

AI平台要求输入数据采用特定格式:

An instances list

此外,当我在JupyterLab上测试预测时,我的分类器的.predict方法在给我一个DataFrame时起作用,但是如果我尝试对DataFrame的数组或单行做出预测就不会起作用。

我获得的错误消息(在AI平台和JupyterLab上)均为

{
  "error": "Prediction failed: Exception during sklearn prediction:
 feature_names mismatch: [THE FEATURES LIST] ['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', 'f35', 'f36', 'f37', 'f38', 'f39', 'f40', 'f41', 'f42', 'f43', 'f44', 'f45', 'f46', 'f47', 'f48', 'f49', 'f50', 'f51', 'f52', 'f53', 'f54', 'f55', 'f56']
\nexpected [THE FEATURES LIST BUT NOT IN THE SAME ORDER] in input data
\ntraining data did not have the following fields: f23, f14, f41, f6, f19, f35, f5, f49, f50, f18, f25, f45, f36, f21, f42, f0, f2, f37, f44, f47, f16, f22, f1, f3, f8, f53, f33, f11, f38, f48, f12, f31, f39, f27, f40, f52, f26, f29, f43, f20, f4, f10, f7, f13, f28, f9, f56, f24, f17, f32, f34, f54, f51, f15, f30, f46, f55"
}

也许我提供的输入不是预期的。但似乎AI平台上没有其他输入选项。我要找的是专门针对Google Cloud AI平台的解决方案。

2 个答案:

答案 0 :(得分:1)

我通过将版本框架设置为XGBoost(以前是sklearn)解决了这个问题,并在存储桶中上传了.bst文件而不是.joblib < / p>

感谢您的帮助@ user260826:)

答案 1 :(得分:1)

TLDR:在保存到存储桶之前,请执行以下操作:model.feature_names = None

我也遇到了这个问题。像您一样,我通过将.bst文件上传到存储桶中来解决了该问题。我想做更多调查,这是我的发现。

假设模型是通过joblib joblib.dump(xgbm, 'model.joblib')保存的。

然后,加载模型model = joblib.load("model.joblib")并调用model.feature_names,将为您提供功能名称列表,这意味着功能列表存储在model.joblib文件内的某个位置。

但是,对AI平台的请求不包括列名列表(AFAIK除非您正在执行自定义预测例程,否则无法将其包括在内),因此当Google尝试执行某些操作时会引发feature_names不匹配错误model.predict(xgb.DMatrix(np.asarray(instances)))的行。

如果使用pickle保存模型也是如此。

如果模型另存为.bst,则调用model.feature_names将为空,并且一切正常,因为模型和预测实例都没有有关要素列表的信息。