# riiid-test-answer-baseline.R
#
#################################################

library(data.table)
library(caret)
library(Matrix)
library(lightgbm)
library(pROC)
library(reticulate)

####################################################################

DAT_DIR <- '../input/riiid-test-answer-prediction'
train <- fread(file.path(DAT_DIR, 'train.csv'), sep=',')
lectures <- fread(file.path(DAT_DIR, 'lectures.csv'), sep=',')
questions <- fread(file.path(DAT_DIR, 'questions.csv'), sep=',')
example_test <- fread(file.path(DAT_DIR, 'example_test.csv'), sep=',')
sample_submt <- fread(file.path(DAT_DIR, 'example_sample_submission.csv'), sep=',')

#####################################################################

train <- train[! is.na(content_type_id)]
setorder(train, timestamp)
set(train, , j=c("row_id", "timestamp", "content_type_id"), NULL)
gc()
###########################

results_c <- train[, .(answered_correctly_mean=mean(answered_correctly, na.rm=TRUE)), 
                   by=.(content_id)]
names(results_c) <- c("content_id", "answered_correctly_content")

results_u <- train[, .(answered_correctly_mean=mean(answered_correctly, na.rm=TRUE),
                       answered_correctly_sum=sum(answered_correctly, na.rm=TRUE)),
                   by=.(user_id)]
names(results_u) <- c("user_id", "answered_correctly_user", "Total_Answer_Correct")

saveRDS(results_c, 'results_c.rds')
saveRDS(results_u, 'results_u.rds')
saveRDS(questions, 'questions.rds')
###########################

X <- train[80000000:nrow(train)]
rm(train)
gc()

X <- merge(X, results_c, by="content_id")
X <- merge(X, results_u, by="user_id")
X <- merge(X, questions, by.x="content_id", by.y="question_id")

X <- X[answered_correctly != -1]
X[, prior_question_had_explanation_enc:=as.numeric(prior_question_had_explanation)]
target <- as.numeric(copy(X$answered_correctly))

X[, .(content_id, answered_correctly_user, answered_correctly_content, Total_Answer_Correct,
      prior_question_elapsed_time, prior_question_had_explanation_enc, part)] -> X

categorical_feature <- c("content_id", "prior_question_had_explanation_enc", "part")

##############################

tri <- createDataPartition(target, p=0.8, list=FALSE)
dval <- Matrix(as.matrix(X[-tri]), sparse=TRUE)
dtrain <- Matrix(as.matrix(X[tri]), sparse=TRUE)
gc()

##############################

dtrain <- lgb.Dataset(data=dtrain, label=target[tri], categorical_feature = categorical_feature)
dval <- lgb.Dataset(data=dval, label=target[-tri], categorical_feature = categorical_feature)

lgb.grid <- list(objective='binary'
                 ,num_boost_round=1000
                 ,metric="auc")

set.seed(123)
lgb.model <- lgb.train(params=lgb.grid
                       , data=dtrain
                       , valids=list(val=dtrain, val1=dval)
                       , lambda_l1 = 9.277442449206187e-06
                       , lambda_l2 = 5.145214812238188e-06
                       , feature_fraction = 0.7
                       , bagging_fraction = 0.6696041270563738
                       , bagging_freq = 3
                       , min_child_samples = 20
                       , learning_rate = 0.02
                       , num_leaves = 43
                       , early_stopping_rounds = 10
                       , eval_freq = 10)

tree.imp <- lgb.importance(lgb.model, percentage=TRUE)
lgb.plot.importance(tree.imp, top_n=50, measure='Gain')

#############################################################################

lgb.save(lgb.model, 'lgb_model.bin')
