2014-12-30 3 views
2

데이터 테이블 수식을 사용하여 모든 수준의 계수 (C1)에서 sum_logloss (아래 참조)를 계산하려고합니다. 그러나 그 결과는 내가 기대하는 바가 아니다. 다음은 내가 얻은 결과와 왜 다른 sum_logloss를 결과로 기대하는지 보여주는 작은 예제입니다.R data.table를 사용하여 계수의 수준에서 변수로 열을 사용하는 수식을 계산합니다.

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 

그래서 2 * LogLoss (1,0.6666667) + 1 * LogLoss (0,0.6666667) = 1.909543, 그리고 3.663061되어야 C1 = 1 sum_logloss.

+0

투손, 나는 당신이 data.table 태그 아래에 몇 가지 대답을 수락하지 않은 것을 참조하십시오 : [질문] (http://stackoverflow.com/q/24997556/ 559784), [Q2] (http://stackoverflow.com/q/23760455/559784), [Q3] (http://stackoverflow.com/q/23474094/559784), [Q4] (http : // stackoverflow .com/q/23471316/559784). 나는 당신이 따라 한 어떤 이슈도 보지 못합니다. 당신이 받아들이지 않은 특별한 이유가 있습니까? 또한 아콘의 대답을 제거한 것처럼 보입니다 ... 궁금합니다. – Arun

+0

@Arun 네, 저의 경우, 종종 답이 맞는지 다시 확인하고 때로는 돌아와서 확인하는 시간이 필요하지 않습니다. – tucson

+0

투손, 알겠습니다. 좋습니다. 그렇지만 후속 조치를 통해 질문에 대답 할 수 있다면 정말 좋을 것입니다. 고맙습니다. 감사합니다. – Arun

답변

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 
3

작은 메모를 시도 할 수 있습니다 : 당신이 다시 같은 변수에 data.table을 할당하고, 특히 내가 data.tables에 data.frames 변환 setDT()을 권 해드립니다.


@ akrun의 대답은 훌륭하지만 두 번 그룹화됩니다. 어떻게해야합니까 :

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

이것은 내가 찾고있는 것이지만 어떻게 든 잘못된 장소에() +1을 넣었습니다. – akrun

+0

@akrun, 아하겠습니다. 다음 번에 :-). – Arun

관련 문제