分析 R 代码时如何验证函数评估的次数

Posted

技术标签:

【中文标题】分析 R 代码时如何验证函数评估的次数【英文标题】:How to verify number of function evaluations when profiling R code 【发布时间】:2013-09-27 12:56:59 【问题描述】:

当使用 Rprof 类型的函数分析 R 代码时,我们会得到单独花在函数上的时间以及花在函数和被调用者上的时间。但是,据我所知,我们没有得到给定函数被评估的次数。

例如,假设我想比较两个积分函数:

integrate_1(myfunc, from = -Inf, to = Inf)
integrate_2(myfunc, from = -Inf, to Inf)

我可以很容易地看到每个函数花费了多少时间以及这些时间花在了哪里,但我不知道如何检查每个集成函数中必须对 myfunc 进行多少次求值。

谢谢,

【问题讨论】:

一个相当粗略的方法是修改myfunc 以在每次调用时增加一个计数器。可能使用assign,因为您很可能希望计数器存在于您可以控制的单独环境中。 【参考方案1】:

实现 Joran 的计数器方法的一种方法是使用 trace 函数。

例如,首先我们将计数器设置为零。 (为方便起见,在全局环境中分配。)

count <- 0

然后设置跟踪。在这里,我们将它设置在 identity 函数上(它只返回您输入给它的值)。

trace("identity", quote(count <<- count + 1), print = FALSE)

现在,每当调用 identity 时,count 的值就会增加。 print = FALSE 只是在调用函数时停止向控制台打印消息。

让我们调用几次函数并检查计数:

for(i in seq_len(123)) identity(1)
count
## [1] 123

【讨论】:

【参考方案2】:

Rprof 通过在计时器上对调用堆栈进行采样来工作。它不计算调用次数。

它将采样的调用堆栈记录在一个文件中,虽然它不记录调用发生的行号,但这些示例对于查看导致花费时间的原因仍然很有用。

例如,如果您碰巧查看了 M 个随机样本,并且您看到 A 调用 B 调用 C 对其中 N 个样本的模式,那么您知道程序花费了大约 N/M 的时间来做这件事(假设N > 1)。 如果您看到这样的事情,并且您可以想办法避免其中的一部分,您将节省总时间的很大一部分。

Rprof 带有一个汇总工具,可以为您提供您提到的数字类型,但我认为这些数字无论如何都没有用。 我更愿意真正了解正在发生的事情。

【讨论】:

以上是关于分析 R 代码时如何验证函数评估的次数的主要内容,如果未能解决你的问题,请参考以下文章

R语言构建xgboost文本分类模型(bag of words):xgb.cv函数交叉验证确定xgboost模型的最优子树个数交叉验证获取最优子树之后构建最优xgboost模型并评估模型文本分类效能

R语言使用yardstick包的rmse函数评估回归模型的性能评估回归模型在每个交叉验证(或者重采样)的每一折fold上的RMSE以及整体的均值RMSE(其他指标maemape等计算方式类似)

R语言使用yardstick包的lift_curve函数评估多分类(Multiclass)模型的性能并使用autoplot函数可视化模型在每个交叉验证(或者重采样)的每一折fold在每个分类上的提升

如何防止短路评估?

R验证源代码

R语言vtreat包的mkCrossFrameCExperiment函数交叉验证构建数据处理计划并进行模型训练通过显著性进行变量筛选(删除相关性较强的变量)构建多变量模型转化为分类模型模型评估