# This R environment comes with all of CRAN preinstalled, as well as many other helpful packages
# The environment is defined by the kaggle/rstats docker image: https://github.com/kaggle/docker-rstats
library(readr) # CSV file I/O, e.g. the read_csv function

img_list = read_csv("../input/driver_imgs_list.csv")

## Create a 1% of labelled images using data partition of classname
library(caret)
set.seed(1927)
samp1 <- createDataPartition(img_list$classname, p = .1, list = FALSE, times = 1)
img_list <- img_list[samp1, ]
summary(img_list)

## Load images using EBImage package
rsz = 64
img_matrix<-matrix(nrow=nrow(img_list), ncol=(rsz*rsz))

require(EBImage)
library(methods)
library(graphics)
library(abind)
for(i in 1:nrow(img_list)) {
    path1 <- sprintf("../input/train/%s/%s", img_list[i, "classname"], img_list[i, "img"])
    x = readImage(path1)
    y = channel(x, "grey") # luminance
    yr = resize(y, rsz, rsz)
    img_matrix[i, ] <- yr
    if(i %% 100 == 0) { 
        print(i)
        display(yr)
    }
}
train <- data.frame(IFILE=img_list$img, TARGET=as.numeric(factor(img_list$classname))-1, img_matrix)
feature.names <- names(train)[3:ncol(train)]
pca=TRUE
if (pca) {
    cat("do ICA with 64 components\n")
    date()
    preProcValues <- preProcess(train[, feature.names], method = c("ica"), n.comp=64)
    train1 <- predict(preProcValues, train[, feature.names])
    train <- data.frame(SUBJ=img_list$subject, IFILE=img_list$img, TARGET=as.numeric(factor(img_list$classname))-1, train1)
    feature.names <- names(train)[4:ncol(train)]
}

trainIndex <- createDataPartition(train$SUBJ, p = .5, list = FALSE, times = 1)
Strain <- train[trainIndex, ]
Sval  <- train[-trainIndex, ]
table(Sval$TARGET)
table(Strain$TARGET)

boost=TRUE
if(boost) {
    library(xgboost)

    param1 <- list( objective           = "multi:softprob", 
                    num_class           = 10, 
                    eta                 = 0.15, 
                    max_depth           = 3,
                    eval_metric         = "mlogloss"
                    )
    
    xgbtrain <- xgb.DMatrix(data.matrix(Strain[, feature.names]), label=Strain$TARGET)
    xgbval <- xgb.DMatrix(data.matrix(Sval[,feature.names]), label=Sval$TARGET)
    Watchlist <- list(val=xgbval, train=xgbtrain)
    
    fit <- xgb.train(data=xgbtrain, params=param1, nround=90, watchlist=Watchlist, verbose=1, print.every.n = 5)
    print(date())      
    print(summary(fit))
    
    importance_matrix <- xgb.importance(model = fit)
    
    print(feature.names[c(as.numeric(importance_matrix$Feature[1:nrow(importance_matrix)])+1)])
    
    predtarget <- predict(fit, newdata=xgbval)
    probs <- t(matrix(predtarget, nrow=10, ncol=length(predtarget)/10))
    date()   
    
    val <- data.frame(img=Sval$IFILE, 
                      TARGET=Sval$TARGET, 
                      c0=probs[, 1],
                      c1=probs[, 2],
                      c2=probs[, 3],
                      c3=probs[, 4],
                      c4=probs[, 5],
                      c5=probs[, 6],
                      c6=probs[, 7],
                      c7=probs[, 8],
                      c8=probs[, 9],
                      c9=probs[, 10]
                      )
    write_csv(val, "SF_xgbTree_val.csv")
    
#    cat("Final MultiLogLoss\n")
#    library("MLmetrics")
#    print(MultiLogLoss(Sval$TARGET, probs))
}