我正在尝试从现有建模函数 parsnip
为 foo
包创建新模型。
我已经遵循 tutorial 在欧洲防风草中构建新模型并遵循 README on Github,但我仍然无法弄清楚一些事情。
fit
中的 parsnip
函数如何知道如何将其输入数据(例如矩阵)分配给我的特殊函数调用?
想象一下,如果有一个特殊的模型函数 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)
?
答案 0 :(得分:3)
验证输入的函数是 check_final_param
,它要求每个参数,例如必须被命名。这就是为什么顺序不重要的原因。
https://github.com/tidymodels/parsnip/blob/f7ba069671684f61af0ca1eadb1927fedec8a9c6/R/misc.R#L235
你所链接的README文件指出: “为了创建模型拟合调用,保护参数填充有适当的对象(通常来自数据集),并且 rlang::call2 用于创建可以执行的调用。“< /p>
使用 ntree
而不是默认树参数的 randomForest 示例。
他们创建了一个翻译调用,将在评估期间使用。
https://github.com/tidymodels/parsnip/blob/228a6dc6975fc91562b63d191e43d2164cc78e3d/R/rand_forest_data.R#L339
如果我们使用 call2
并解包命名的 args,则顺序无关紧要。正如我们所知,由于额外的翻译步骤,args 将被正确命名。
args <- list(na.rm = TRUE, trim = 0)
rlang::call2("mean", 1:10, !!!args)
答案 1 :(得分:1)
我们这样做的方法是通过 set_fit()
函数。大多数模型都非常合理,我们可以使用默认映射(例如,从 data
参数到 data
参数或 x
到 x
),但您是对的,某些模型使用不同的规范。这方面的一个例子是 Spark 模型,它使用 x
来表示我们通常通过 data
方法调用的 formula
。
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)))
)
)
请特别注意 data
参数的 value
元素。你可以read a bit more here。