如果使用 LDA 而不是线性回归,mlflow 服务 r 模型失败

mlflow serving r models failed if use LDA instead of linear regression

我有一个关于服务 R 模型的 mlflow 问题,下面是我训练和序列化 R 模型的代码。

library(mlflow)
library(caret)
library(carrier)

set.seed(101)
sample <- createDataPartition(iris$Species, p=0.80, list=FALSE)
iris_train <- iris[sample,]
iris_test <- iris[-sample,]


with(mlflow_start_run()  , {
  control <- trainControl(method='cv', number=10)
  metric <- 'Accuracy'

  # Linear Discriminant Analysis (LDA)
  model <- train(Species~., data=iris_train, method='lda', trControl=control, metric=metric,
                preProcess=c("center", "scale"))
  fn <- crate(~ caret::predict.train(model, .x), model = model)
  # fn <- crate(~ stats::predict(model, .x), model = model)
  iris_prediction <- predict(model, iris_test)

  mlflow_log_model(model = fn, artifact_path="model")
})

但是,当我用 API 请求提供服务时,

curl --location --request POST 'localhost:5000/invocations' \
--header 'Content-Type: application/json' \
--data-raw '{"columns": ["Sepal.Length", "Sepal.With", "Petal.Length", "Petal.Width"], "data": [[5.2, 4.1, 1.5, 0.1], [6.4, 2.8, 5.6, 2.1], [7.9, 3.8, 6.4, 2.0], [6.7, 3.1, 5.6, 2.4], [6.3, 3.4, 5.6, 2.4]]}'

我有以下错误: Invalid Request. object 'Sepal.Width' not found

注意,如果我将训练更改为使用线性回归模型,

with(mlflow_start_run(), {
  model <- lm(Sepal.Width ~ Sepal.Length, iris)
  mlflow_log_model(
    crate(~ stats::predict(model, .x), model=model), "model")
})

同样的API请求,一切正常。

谁能帮我找到线索?我对R不是很熟悉

非常感谢!

事实证明问题是 curl 脚本中的拼写错误。是 Sepal.Width 而不是 Sepal.With。

curl --location --request POST 'localhost:5000/invocations' \
--header 'Content-Type: application/json' \
--data-raw '{"columns": ["Sepal.Length", "Sepal.Width", "Petal.Length", "Petal.Width"], "data": [[5.2, 4.1, 1.5, 0.1], [6.4, 2.8, 5.6, 2.1], [7.9, 3.8, 6.4, 2.0], [6.7, 3.1, 5.6, 2.4], [6.3, 3.4, 5.6, 2.4]]}'