我已经在GCP的AI平台(ex-ML引擎)上部署了一个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平台的解决方案。
发布于 2019-07-31 16:31:30
我通过将版本的框架设置为XGBoost (以前是sklearn)并在存储桶中上传了一个.bst文件而不是.joblib来解决了这个问题
感谢您的帮助@user260826 :)
发布于 2019-10-03 20:51:26
TLDR:在保存到存储桶之前执行以下操作:model.feature_names = None
我也遇到了这个问题。和您一样,我通过将.bst文件上传到存储桶中解决了这个问题。我想要做更多的调查,这是我的发现。
假设模型是通过joblib joblib.dump(xgbm, 'model.joblib')保存的。
然后,加载模型model = joblib.load("model.joblib")并调用model.feature_names,将为您提供特性名称列表,这意味着特性列表存储在model.joblib文件中的某个位置。
然而,对AI平台的请求不包括列名列表(除非您正在执行自定义预测例程,否则无法包括它),因此当谷歌尝试按照model.predict(xgb.DMatrix(np.asarray(instances)))的方式执行某些操作时,它会抛出feature_names不匹配错误。
如果使用pickle保存模型,情况也是如此。
如果模型另存为.bst,则调用model.feature_names将为空,并且一切正常,因为模型和预测实例都没有关于特征列表的信息。
https://stackoverflow.com/questions/57266635
复制相似问题