防风草如何知道如何将“fit”参数与模型的函数参数相匹配?

how does parsnip know how to match `fit` arguments to function arguments for a model?

我正在尝试从现有建模函数 foo.

parsnip 包创建一个新模型

我已经关注了tutorial in building new models in parsnip and followed the README on Github,但有些事情我还是想不通

parsnip 中的 fit 函数如何知道如何将其输入数据(例如矩阵)分配给我的特殊函数调用?

想象一下,如果有一个特殊的模型函数 foo,其中 xy 参数的常规角色被颠倒了:即 foo(x,y) 其中 x应该是一个结果向量,y应该是一个预测矩阵,很奇怪。

例如:假设 a 是预测变量矩阵,b 是结果向量。然后我调用 fit_xy(object=my_model, x=a, y=b)。在内部,fit_xy() 是如何知道调用 foo(x=y,y=x) 的?

验证输入的函数是check_final_param,它要求每个参数例如必须命名。这就是为什么顺序不重要的原因。 https://github.com/tidymodels/parsnip/blob/f7ba069671684f61af0ca1eadb1927fedec8a9c6/R/misc.R#L235

您所链接的 README 文件指出: “要创建模型拟合调用,保护参数会填充适当的对象(通常来自数据集),并且 rlang::call2 用于创建可以执行的调用."

使用 ntree 而不是默认树参数的 randomForest 示例。 他们创建了一个翻译调用,将在评估期间使用。 https://github.com/tidymodels/parsnip/blob/228a6dc6975fc91562b63d191e43d2164cc78e3d/R/rand_forest_data.R#L339

如果我们使用 call2 并解压命名参数,顺序无关紧要。正如我们所知,由于额外的翻译步骤,args 将被正确命名。

args <- list(na.rm = TRUE, trim = 0)

rlang::call2("mean", 1:10, !!!args)

我们这样做的方法是通过 set_fit() 函数。大多数模型都非常合理,我们可以使用默认映射(例如,从 data 参数到 data 参数或从 xx)但是你是对的,有些模型使用不同的规范。这方面的一个例子是 Spark 模型,它使用 x 来表示我们通常用 formula 方法调用的 data

Spark 的随机森林 set_fit() 函数如下所示:

set_fit(
  model = "rand_forest",
  eng = "spark",
  mode = "classification",
  value = list(
    interface = "formula",
    data = c(formula = "formula", data = "x"),
    protect = c("x", "formula", "type"),
    func = c(pkg = "sparklyr", fun = "ml_random_forest"),
    defaults = list(seed = expr(sample.int(10 ^ 5, 1)))
  )
)

请特别注意 value 参数的 data 元素。你可以 read a bit more here.