```{r}
library(data.table)
library(Matrix)
library(xgboost)
```


Undersample from train
```{r}
row_x <- 165000000

train <- fread("../input/train.csv",
               showProgress = FALSE,
               nrows = row_x)
               
each  <- sum(train$is_attributed)

under <- train[ , .SD[sample(.N, each)], by = is_attributed]

rm(train)

to_sparse <- function(vec) {
  sparseMatrix(i = 1:length(vec),
               j = vec + 1,
               x = 1,
               dims = c(length(vec), 5000))
}  

create_X <- function(dt) {
  cBind(to_sparse(dt$app),
        to_sparse(dt$device),
        to_sparse(dt$os),
        to_sparse(dt$channel))
}

X_under <- create_X(under)
Y_under <- under$is_attributed
rm(under)
```


Create validation
```{r}
vars  <- fread("../input/train.csv", nrows = 0)

valid <- fread("../input/train.csv",
               showProgress = FALSE,
               skip = row_x,
               col.names = names(vars))

X_valid <- create_X(valid)
Y_valid <- valid$is_attributed
rm(valid)
```


Xgboost
```{r}
dunder  <- xgb.DMatrix(X_under, label = Y_under)
dvalid  <- xgb.DMatrix(X_valid, label = Y_valid)
watchlist <- list(train = dunder, valid = dvalid)

param <- list(max_depth = 2,
              eta = 1,
              objective = "binary:logistic",
              eval_metric = "auc")

bst <- xgb.train(param, dunder, nrounds = 100, watchlist)


rm(X_under, X_valid, Y_under, Y_valid, dunder, dvalid)
```


Apply to test
```{r}
test <- fread("../input/test.csv",
              select = c("click_id", "app", "channel", "device", "os"),
              showProgress = FALSE)

X_test <- create_X(test)

pred <- data.table(click_id = test$click_id,
                   is_attributed = predict(bst, X_test))

head(pred)

fwrite(pred, "pred.csv")
```