【问题标题】:R data.table to calculate a formula using a column as a variable across levels of a factorR data.table 使用列作为跨因子水平的变量来计算公式
【发布时间】:2014-12-30 10:53:59
【问题描述】:

我想使用数据表公式计算因子 (C1) 的所有级别的输出 sum_logloss(见下文)。但结果不是我所期望的。这是一个小例子,展示了我得到了什么以及为什么我期望不同的 sum_logloss 作为结果。

LogLoss <- function(actual, predicted, eps=0.00001) {
  predicted <- pmin(pmax(predicted, eps), 1-eps)
  -1/length(actual)*(sum(actual*log(predicted)+(1-actual)*log(1-predicted)))
}

# THIS RETURNS TOTAL LOGLOSS
TotalLogLossVector <- function(actual_vector, predicted_vector) {
sum(mapply(LogLoss, actual_vector, predicted_vector))
}

df = data.frame(C1=c(1,1,2,2,1), C2=c(4,5,4,5,5), click=c(1,0,0,1,1))
df <- data.table(df)
df
   C1 C2 click
1:  1  4     1
2:  1  5     0
3:  2  4     0
4:  2  5     1
5:  1  5     1
df[,list(mean_CTR=mean(click),count=.N, sum_logloss=TotalLogLossVector(click,rep(mean_CTR,.N)) ),by=C1]
   C1  mean_CTR count sum_logloss
1:  1 0.6666667     3    3.663061
2:  2 0.5000000     2    1.928626

LogLoss(1,0.6666667)
[1] 0.4054651
LogLoss(0,0.6666667)
[1] 1.098612
TotalLogLossVector(c(1,0,1), c(0.6666667,0.6666667,0.6666667))
[1] 1.909543

所以 C1=1 的 sum_logloss 应该是 2 * LogLoss(1,0.6666667) + 1 * LogLoss(0,0.6666667) = 1.909543,而不是 3.663061。

【问题讨论】:

  • 图森,我看到你没有接受 data.table 标签下的几个答案:Q1Q2Q3Q4。我没有看到您跟进的任何问题。有什么特别的理由你没有接受吗?此外,您似乎已从 akrun 的此处删除了已接受的答案...只是想知道。
  • @Arun 是的,我的错,我经常想再次确认答案是否正确,有时不花时间回来验证。
  • 图森,我明白了。这很好,但如果您能跟进(如果您必须)并在他们确实回答您的问题时关闭这些问题,那就太好了。谢谢。

标签: r data.table


【解决方案1】:

一个小提示:我建议 setDT() 将 data.frames 转换为 data.tables,尤其是当您将 data.table 分配回同一个变量时。


@akrun 的回答很好,但它分组了两次,我认为这是不必要的。这是我的做法:

setDT(df)[, {
    tmp = mean(click);
    list(mean_CTR = tmp, count = .N, sum_logloss = 
         TotalLogLossVector(click, tmp))}, by=C1]

【讨论】:

  • 这是我一直在寻找的,但不知何故我把 { 放在了错误的地方 (+1)
  • @akrun,啊,我明白了。那么下次:-)。
【解决方案2】:

你可以试试

 df[, paste0('V', 1:2):=list(mean(click), .N), by=C1][,
    list(mean_CTR=V1[1L], count=V2[1L], sum_logloss=
              TotalLogLossVector(click, V1)), by=C1]

 #  C1  mean_CTR count sum_logloss
 #1:  1 0.6666667     3    1.909543
 #2:  2 0.5000000     2    1.386294

【讨论】:

    猜你喜欢
    • 2021-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    相关资源
    最近更新 更多