library(plyr)
library(dplyr)
library(data.table)
library(caret)

# Get the number of clicks on an ad
getClickProb <- function(x){
  clicks <- x %>%
    group_by(ad_id) %>%
    summarise(
      click_count = sum(clicked),
      impressions = n(),
      click_prob = sum(clicked) / n()
    )
  clicks
}

clicks <- fread("../input/clicks_train.csv", sep = ",", nrows = 1000000)
ad.probs <- getClickProb(clicks)
clicks.train <- join(clicks, ad.probs, by="ad_id")

# train a model based on the impressions and probability of clicks
train.index <- createDataPartition(clicks.train$clicked, p=0.8, list = FALSE)

fit.control <- trainControl(method = "cv", number = 2)
grid.gbm <-  expand.grid(interaction.depth = c(2), 
                        n.trees = 20, 
                        shrinkage = 0.1,
                        n.minobsinnode = 10)
model <- train(clicked ~., 
               data=clicks.train[train.index,.(clicked, impressions, click_prob)], 
               method = "gbm",
               verbose = FALSE,
               tuneGrid = grid.gbm)

clicks.test <- fread("../input/clicks_test.csv", sep = ",", nrows = 1000000)
clicks.test <- join(clicks.test, ad.probs, by="ad_id")
probs <- predict(model, clicks.test[train.index,.(clicked, impressions, click_prob)], type = "prob")
clicks.test$probs <- probs

pre.sub.ordered <- clicks.test[order(-probs),]
submission <- pre.sub.ordered[,.(ad_id=paste(ad_id, collapse=" ")),by=display_id]
write.csv(submission,"basic_submission.csv", row.names = FALSE)