Accuracy comparison
Load data
data(package="mlbench")
data(Sonar, package="mlbench")
data(DNA, package="mlbench")
data.list <- list(
Sonar=list(
input.mat=as.matrix(Sonar[,1:60]),
output.vec=ifelse(Sonar$Class=="R", 1, -1)),
DNA=list(
input.mat=ifelse(as.matrix(DNA[,1:180])==0, 0, 1),
output.vec=ifelse(DNA$Class=="n", -1, 1)))
Define functions for computing loss and gradient
N <- 10
set.seed(1)
rand.pred.vec <- rnorm(N)
subtrain.output.vec <- rep(c(-1, 1), l=N)
subtrain.diff.count.dt <- aum::aum_diffs_binary(subtrain.output.vec, denominator="count")
subtrain.diff.rate.dt <- aum::aum_diffs_binary(subtrain.output.vec, denominator="rate")
library(data.table)
PairsDT <- function(output.vec){
is.positive <- output.vec == 1
data.table(expand.grid(
positive=which(is.positive),
negative=which(!is.positive)))
}
subtrain.pairs.dt <- PairsDT(subtrain.output.vec)
margin <- 1
## Note: for efficiency subtrain labels are assumed to be pre-computed
## in the enclosing environment, once before the optimization starts.
equal.class.weights <- function(output.vec){
otab <- table(output.vec)
as.numeric(1/otab[paste(output.vec)])
}
subtrain.obs.weights <- equal.class.weights(subtrain.output.vec)
Logistic <- function(pred.vec, output.vec, obs.weights){
list(
gradient=-obs.weights*output.vec/(1+exp(output.vec*pred.vec)),
loss=sum(obs.weights*log(1+exp(-output.vec*pred.vec))))
}
AUM <- function(pred.vec, diff.dt){
L <- aum::aum(diff.dt, pred.vec)
d <- L$derivative_mat
non.diff <- abs(d[,1] - d[,2]) > 1e-6
if(any(non.diff)){
cat(sprintf("%d non-diff points\n", sum(non.diff)))
print(d[non.diff, ])
}
with(L, list(gradient=derivative_mat[,1], loss=aum))
}
loss.list <- list(
logistic=function(pred.vec, output.vec=subtrain.output.vec, ...){
Logistic(pred.vec, output.vec, 1/length(pred.vec))
},
logistic.weighted=
function(pred.vec, output.vec=subtrain.output.vec,
obs.weights=subtrain.obs.weights, ...){
Logistic(pred.vec, output.vec, obs.weights)
},
aum.count=function(pred.vec, diff.count.dt=subtrain.diff.count.dt, ...){
AUM(pred.vec, diff.count.dt)
},
aum.rate=function(pred.vec, diff.rate.dt=subtrain.diff.rate.dt, ...){
AUM(pred.vec, diff.rate.dt)
},
squared.hinge.all.pairs=function(pred.vec, pairs.dt=subtrain.pairs.dt, ...){
pairs.dt[, diff := pred.vec[positive]-pred.vec[negative]-margin]
pairs.dt[, diff.clipped := ifelse(diff<0, diff, 0)]
pairs.tall <- data.table::melt(
pairs.dt,
measure.vars=c("positive", "negative"),
value.name="pred.i",
variable.name="label")
## d/dx (x - y - m)^2 = x - y - m
## d/dy (x - y - m)^2 = -(x - y - m)
pairs.tall[, grad.sign := ifelse(label=="positive", 1, -1)]
N.pairs <- nrow(pairs.dt)
grad.dt <- pairs.tall[, .(
gradient=sum(grad.sign*diff.clipped)
), keyby=pred.i]
list(
gradient=grad.dt$gradient/N.pairs,
loss=sum(pairs.dt$diff.clipped^2)/N.pairs)
}
)
result.list <- list()
for(loss.name in names(loss.list)){
fun <- loss.list[[loss.name]]
result.list[[loss.name]] <- fun(rand.pred.vec)
}
str(result.list)
#> List of 5
#> $ logistic :List of 2
#> ..$ gradient: num [1:10] 0.0348 -0.0454 0.0302 -0.0169 0.0582 ...
#> ..$ loss : num 0.687
#> $ logistic.weighted :List of 2
#> ..$ gradient: num [1:10] 0.0697 -0.0908 0.0605 -0.0337 0.1163 ...
#> ..$ loss : num 1.37
#> $ aum.count :List of 2
#> ..$ gradient: num [1:10] 0 -1 0 0 1 -1 1 0 1 -1
#> ..$ loss : num 2.33
#> $ aum.rate :List of 2
#> ..$ gradient: num [1:10] 0 -0.2 0 0 0.2 -0.2 0.2 0 0.2 -0.2
#> ..$ loss : num 0.467
#> $ squared.hinge.all.pairs:List of 2
#> ..$ gradient: num [1:10] 0.0825 -0.1613 0.0582 0 0.2209 ...
#> ..$ loss : num 1.39
sapply(result.list, "[[", "gradient")
#> logistic logistic.weighted aum.count aum.rate squared.hinge.all.pairs
#> [1,] 0.03483151 0.06966301 0 0.0 0.08251408
#> [2,] -0.04542178 -0.09084355 -1 -0.2 -0.16126764
#> [3,] 0.03024562 0.06049125 0 0.0 0.05818398
#> [4,] -0.01686422 -0.03372844 0 0.0 0.00000000
#> [5,] 0.05816396 0.11632792 1 0.2 0.22087679
#> [6,] -0.06943358 -0.13886715 -1 -0.2 -0.36131911
#> [7,] 0.06195006 0.12390012 1 0.2 0.24614420
#> [8,] -0.03233706 -0.06467412 0 0.0 -0.08710976
#> [9,] 0.06400961 0.12801922 1 0.2 0.26028057
#> [10,] -0.05757592 -0.11515184 -1 -0.2 -0.25830311
Optimization
out.loss.list <- list()
data.name <- "Sonar"
input.output.list <- data.list[[data.name]]
input.mat <- input.output.list[["input.mat"]]
full.input.mat <- scale(input.mat)
full.output.vec <- input.output.list[["output.vec"]]
stopifnot(full.output.vec %in% c(-1, 1))
set.seed(1)
n.folds <- 2
unique.folds <- 1:n.folds
fold.vec <- sample(rep(unique.folds, l=length(full.output.vec)))
validation.fold <- 1
is.set.list <- list(
validation=fold.vec == validation.fold,
subtrain=fold.vec != validation.fold)
set.data.list <- list()
for(set.name in names(is.set.list)){
is.set <- is.set.list[[set.name]]
output.vec <- full.output.vec[is.set]
set.data.list[[set.name]] <- list(
output.vec=output.vec,
obs.weights=equal.class.weights(output.vec),
input.mat=full.input.mat[is.set,],
diff.rate.dt=aum::aum_diffs_binary(output.vec, denominator="rate"),
diff.count.dt=aum::aum_diffs_binary(output.vec, denominator="count"),
pairs.dt=PairsDT(output.vec))
}
X.mat <- set.data.list$subtrain$input.mat
for(loss.name in names(loss.list)){
loss.grad.fun <- loss.list[[loss.name]]
step.size <- 0.1
cat(sprintf("loss=%s\n", loss.name))
set.seed(1)
weight.vec <- last.w <- rnorm(ncol(X.mat))
done <- FALSE
iteration <- 0
prev.set.loss.vec <- rep(1e10, 2)
while(!done){
iteration <- iteration+1
loss.for.weight <- function(w, set.data=set.data.list$subtrain){
pred <- set.data$input.mat %*% w
set.data$pred.vec <- pred
out <- do.call(loss.grad.fun, set.data)
out$pred <- pred
out
}
loss.before.step <- loss.for.weight(weight.vec)
direction <- -t(X.mat) %*% loss.before.step[["gradient"]]
loss.for.step <- function(step.size){
new.weight <- weight.vec + step.size * direction
out <- loss.for.weight(new.weight)
out$new.weight <- new.weight
out$step.size <- step.size
out
}
loss.after.step <- loss.for.step(step.size)
weight.vec <- loss.after.step[["new.weight"]]
diff.w <- sum(abs(weight.vec-last.w))
last.w <- weight.vec
set.loss.vec <- numeric()
for(set.name in names(set.data.list)){
set.data <- set.data.list[[set.name]]
set.loss <- loss.for.weight(weight.vec, set.data)
set.loss.vec[[set.name]] <- set.loss[["loss"]]
roc.df <- WeightedROC::WeightedROC(
set.loss[["pred"]],
set.data[["output.vec"]])
auc <- WeightedROC::WeightedAUC(roc.df)
out.dt <- data.table(
loss.name,
iteration,
set.name,
auc,
loss.value=set.loss$loss)
for(aum.type in c("count", "rate")){
diff.name <- paste0("diff.", aum.type, ".dt")
aum.list <- aum::aum(set.data[[diff.name]], set.loss[["pred"]])
out.col <- paste0("aum.", aum.type)
out.dt[[out.col]] <- aum.list[["aum"]]
}
out.loss.list[[paste(
loss.name,
iteration,
set.name
)]] <- out.dt
if(2000 < iteration || diff.w < 1e-6){
done <- TRUE
}
}#for(set.name
}#while(!done
}#for(loss.name
#> loss=logistic
#> loss=logistic.weighted
#> loss=aum.count
#> loss=aum.rate
#> loss=squared.hinge.all.pairs
out.loss <- do.call(rbind, out.loss.list)
(max.valid.auc <- out.loss[
set.name=="validation",
.SD[which.max(auc), .(iteration, auc, set.name)],
by=.(loss.name)])
#> loss.name iteration auc set.name
#> <char> <num> <num> <char>
#> 1: logistic 1421 0.8731399 validation
#> 2: logistic.weighted 1181 0.8723958 validation
#> 3: aum.count 9 0.9002976 validation
#> 4: aum.rate 237 0.7663690 validation
#> 5: squared.hinge.all.pairs 1086 0.8121280 validation
library(ggplot2)
ggplot(,aes(
iteration, auc, color=set.name))+
geom_line(
data=out.loss)+
geom_point(
data=max.valid.auc)+
facet_grid(
. ~ loss.name,
labeller="label_both",
scales='free',
space='fixed')
![plot of chunk unnamed-chunk-3](data:image/png;base64,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)