我已经在GCP的AI平台(ex-ML Engine)上部署了XGBoost模型以进行预测(它作为joblib文件存储在GCS中)。但是,当我尝试对一系列功能进行预测时,会出现“功能不匹配”错误。
AI平台要求输入数据采用特定格式:
此外,当我在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平台的解决方案。
答案 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
将为空,并且一切正常,因为模型和预测实例都没有有关要素列表的信息。