我希望使用R的expand.grid
来全面枚举和研究用于层次聚类分析的选项。我有一个最终函数acc
,它将获取一个矩阵并对其进行分析,以进行性能测量(如准确性,精度,F1等),返回一个命名列表(具有准确性,F1等):我正在寻找的最终输出是一个表,其中列出了所有超参数组合,并在其旁边的列中列出了不同的性能指标(准确性,F1等)。
组合表可以用例如来设置
hyperparams = expand.grid(meths=c("ward.D","ward.D2","single","complete","average","mcquitty","median","centroid"), dists=c("euclidean", "maximum", "manhattan", "canberra", "binary","minkowski"))
接下来,我们将与已知标签进行比较,并获得准确度,并包装了许多功能,为简洁起见,我尝试将其省略(例如cutree
):
t1 = table(df$Group, hclust(dist(df[-1],method="euclidean"), method="complete"))
Res1 = acc(t1)
目标是在我的method
中列出的变量之间更改dist
的dists
参数,并在我的method
中列出的变量之间更改hclust
的meths
参数。在最后一行,回想一下,我写了acc
,它将使用一个矩阵并输出一个精度,精度,F1的命名列表,我希望每个列表都在最终表的列上,其行是hyperparams
中的超参数组合。
现在,我的第一个问题是,我不确定如何以覆盖上述所有选项的方式使用unlist
。我很确定这是正确的功能,但不确定如何做到这一点。而且我还想为for循环创建表without,即使用apply之类的东西(我猜是沿着hyperparams
的行吗?...),因为我知道这样的解决方案通常更好在R中。
按照建议,最终的期望输出将有效地为hyperparams
,但作为带有附加列的数据帧,第三列包含精度,第四列包含精度,等等(在我的函数acc
中列出的度量) 。谁能告诉我如何到达那里吗?
如果您想为acc
玩一些游戏,我们可以使用
first = sum(x)
second = sum(x^2)
return(list(First=first,Second=second))
并且最终输出表将是两个超参数列,然后是First
(最终混淆矩阵中元素的总和,对应于该行的超参数组合)的一列和Second
(元素^ 2的总和)在最终的混淆矩阵中)。如果您想使用给定的功能,这只是一个假设的示例。
我真的更喜欢在R底下的解决方案! (如果绝对必要,也可以使用dplyr)
编辑:好,很多人都要求输入df
。让我们使用iris
,但是当然,如果我们要输出,就无法避免某些中间函数,例如cutree
。
现在有了iris
,您可以运行
contingtab1 = table(iris$Species, cutree(hclust(dist(iris[,1:4],method="euclidean"),method="complete"),3))
这给出了列联表。将其传递到acc
会得到一行期望的输出(与euclidean
和complete
对应的行。然后,期望的输出看起来像hyperparams
,其中两个当前列中的每一列都跟着(例如)两个更多列,acc
中我的两个性能指标之一。
我们可以在Map
中使用base R
Map(function(x, y) acc(hclust(dist(df[-1],method = x), method = y),
hyperparams[[1]], hyperparams[[2]])
一种方法可能是map2
中的purrr
library(purrr)
map2(hyperparams$meths, hyperparams$dists,
~ acc(hclust(dist(df[-1],method = .x), method = .y)))