防风草如何知道如何将“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
,其中 x
和 y
参数的常规角色被颠倒了:即 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
参数或从 x
到 x
)但是你是对的,有些模型使用不同的规范。这方面的一个例子是 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.
我正在尝试从现有建模函数 foo
.
parsnip
包创建一个新模型
我已经关注了tutorial in building new models in parsnip and followed the README on Github,但有些事情我还是想不通
parsnip
中的 fit
函数如何知道如何将其输入数据(例如矩阵)分配给我的特殊函数调用?
想象一下,如果有一个特殊的模型函数 foo
,其中 x
和 y
参数的常规角色被颠倒了:即 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
参数或从 x
到 x
)但是你是对的,有些模型使用不同的规范。这方面的一个例子是 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.