library(data.table) 
library(dplyr)
library(xgboost)
library(data.table)
library(caret)
library(mlr)

train <- fread("../input/train.csv", showProgress=F)
all_11<-subset(train, is_attributed == 1)


smp_size<-floor(0.1*nrow(train))
set.seed(123)
tr_samp1<-sample(seq_len(nrow(train)), size=smp_size)
all1<-train[tr_samp1,]

all_1<-all1[which(all1$is_attributed==1),]
all_0<-all1[which(all1$is_attributed==0),]

set.seed(123)
samp_0<-sample(seq_len(nrow(all_0)), size=150000)
s_data_0<-all_0[samp_0,]


samp_1<-sample(seq_len(nrow(all_11)), size=150000)
s_data_1<-all_11[samp_1,]

bal<-rbind(s_data_1,s_data_0)

#v_data_0<-all_0[-samp_0,]
#v_data_1<-all_11[-samp_1,]
#v_data<-rbind(v_data_0, v_data_1)


dist_ip<-train%>%select(ip)%>%group_by(ip)%>%summarise(ip_cnt=n())
bal_cnt<-merge(bal, dist_ip, by.x='ip', by.y='ip', al.x=TRUE)
#v_data_cnt<-merge(v_data, dist_ip, by.x='ip', by.y='ip', al.x=TRUE)

fwrite(bal_cnt, "instantDownloads.csv")

smp_size<-floor(0.75*nrow(bal_cnt))
set.seed(123)
smp_seq<-sample(seq_len(nrow(bal_cnt)), size=smp_size)


train_200<-bal_cnt[smp_seq,]
test_200<-bal_cnt[-smp_seq,]

col_train<-colnames(train_200)[sapply(train_200,is.character)]
col_test<-colnames(test_200)[sapply(test_200, is.character)]

for (i in col_train) set(train_200,j=i,value = factor(train_200[[i]]))
for (i in col_test) set(test_200,j=i,value = factor(test_200[[i]]))

traintask <- makeClassifTask (data = train_200,target = "is_attributed")
testtask<-makeClassifTask(data=test_200, target="is_attributed")

traintask <- createDummyFeatures (obj = traintask) 
testtask <- createDummyFeatures (obj = testtask)

lrn <- makeLearner("classif.xgboost",predict.type = "response")
lrn$par.vals <- list( objective="binary:logistic", eval_metric="error", nrounds=100L, eta=0.1)

params <- makeParamSet( makeDiscreteParam("booster",values = c("gbtree","gblinear")), makeIntegerParam("max_depth",lower = 3L,upper = 10L), makeNumericParam("min_child_weight",lower = 1L,upper = 10L), makeNumericParam("subsample",lower = 0.5,upper = 1), makeNumericParam("colsample_bytree",lower = 0.5,upper = 1))
rdesc <- makeResampleDesc("CV",stratify = T,iters=5L)
ctrl <- makeTuneControlRandom(maxit = 10L)
mytune <- tuneParams(learner = lrn, task = traintask, resampling = rdesc, measures = acc, par.set = params, control = ctrl, show.info = T)



##-----xgboost
labels<-train_200$is_attributed
ts_labels<-test_200$is_attributed
v_labels<-v_data_cnt$is_attributed

new_tr<-train_200[,c("ip", "app", "device", "os", "channel", "ip_cnt")]
new_ts<-test_200[,c("ip", "app", "device", "os", "channel", "ip_cnt")]
new_v<-v_data_cnt[,c("ip", "app", "device", "os", "channel", "ip_cnt")]

new_train<-setDT(new_tr)
new_test<-setDT(new_ts)
new_val<-setDT(new_v)

new_tr <- model.matrix(~.+0,data = new_train) 
new_ts <- model.matrix(~.+0,data = new_test)
new_v<-model.matrix(~.+0, data=new_val)

dtrain <- xgb.DMatrix(data = new_tr,label = labels) 
dtest <- xgb.DMatrix(data = new_ts,label=ts_labels)
dval<-xgb.DMatrix(data=new_v, label=v_labels)
#---0.92
params <- list(booster = "gbtree", objective = "binary:logistic", eta=0.3, gamma=0, max_depth=7, min_child_weight=1, subsample=1, colsample_bytree=1)
xgbcv <- xgb.cv( params = params, data = dtrain, nrounds = 100, nfold = 5, showsd = T, stratified = T, print_every_n = 10, early_stoping_round = 20, maximize = F)
xgb1 <- xgb.train (params = params, data = dtrain, nrounds = 100, watchlist = list(val=dtest,train=dtrain), print_every_n = 10, early_stoping_round = 10, maximize = F , eval_metric = "error")

xgbpred <- predict (xgb1,dtest)
xgbpred <- ifelse (xgbpred > 0.5,1,0)
table(xgbpred,ts_labels)

xgbval <- predict (xgb1,dval)
xgbval <- ifelse (xgbval > 0.5,1,0)
table(xgbval,v_labels)




