knitr::opts_chunk$set(echo = TRUE)
We want to have a baseline estimate to compare the Neural Network approach of Daniel.
library(data.table) library(DBI) library(jsonlite) library(dplyr) library(ggplot2) library(rpart) library(rattle) library(caret) library(ranger) library(class)
dbConfig <- fromJSON("../config.json") con <- dbConnect(RPostgreSQL::PostgreSQL(), dbname = "FOGDB", host = dbConfig[["host"]], port = 9418, user = dbConfig[["user"]], password = dbConfig[["pw"]])
train <- readRDS("~/Desktop/Daniel/Training/ImageDescription2.rds") test <- readRDS("~/Desktop/Daniel/Testing/ImageDescription2.rds")
selectedFeatures <- c("mean_edge", "change_point", #"fractal_dim", "mean_hue", "mean_saturation", "mean_brightness") sqlSelect <- "SELECT image_id, " sqlSelect <- paste0(sqlSelect, paste(selectedFeatures, collapse = ", ")) sqlSelect <- paste0(sqlSelect, " FROM image_features WHERE image_id IN ") sqlSelect <- paste0(sqlSelect, "(", paste(train[, image_id], collapse = ", "), ")") trainFeatures <- as.data.table(dbGetQuery(con, sqlSelect)) sqlSelect <- "SELECT image_id, " sqlSelect <- paste0(sqlSelect, paste(selectedFeatures, collapse = ", ")) sqlSelect <- paste0(sqlSelect, " FROM image_features WHERE image_id IN ") sqlSelect <- paste0(sqlSelect, "(", paste(test[, image_id], collapse = ", "), ")") testFeatures <- as.data.table(dbGetQuery(con, sqlSelect))
train <- merge(train, trainFeatures, by = "image_id") train[, camera_id := as.factor(camera_id)] test <- merge(test, testFeatures, by = "image_id") test[, camera_id := as.factor(camera_id)]
NormalizeByMedian <- function(x) { (x - median(x)) / mad(x) } trainNorm <- train %>% group_by(camera_id) %>% mutate(edges = NormalizeByMedian(mean_edge)) %>% mutate(changepoint = NormalizeByMedian(change_point)) %>% mutate(hue = NormalizeByMedian(mean_hue)) %>% mutate(saturation = NormalizeByMedian(mean_saturation)) %>% mutate(brightness = NormalizeByMedian(mean_brightness)) %>% select(camera_id, image_id, mor_visibility, vis_class, edges, changepoint, hue, saturation, brightness) %>% ungroup() %>% as.data.table() testNorm <- test %>% group_by(camera_id) %>% mutate(edges = NormalizeByMedian(mean_edge)) %>% mutate(changepoint = NormalizeByMedian(change_point)) %>% mutate(hue = NormalizeByMedian(mean_hue)) %>% mutate(saturation = NormalizeByMedian(mean_saturation)) %>% mutate(brightness = NormalizeByMedian(mean_brightness)) %>% select(camera_id, image_id, mor_visibility, vis_class, edges, changepoint, hue, saturation, brightness) %>% ungroup() %>% as.data.table() ggplot(trainNorm, aes(x = mor_visibility, y = edges, col = camera_id)) + scale_x_log10() + geom_point(alpha = 0.5)
dbDisconnect(con)
Based on the training set we obtain the following preliminary decision tree:
trainNorm[, vis_class_bi := vis_class == "A"] fogTree <- rpart(vis_class ~ edges + changepoint + hue + saturation + brightness, trainNorm[camera_id==2 | camera_id==3], control = rpart.control(cp = 0.01)) # fogTree <- ranger(vis_class ~ edges + changepoint + hue + # saturation + brightness, # trainNorm[camera_id==1])
# fancyRpartPlot(fogTree, sub="")
trainPred <- predict(fogTree, trainNorm[camera_id==2 | camera_id==3, ], type = "class") confusionMat <- confusionMatrix(trainPred, trainNorm[camera_id==2 | camera_id==3, vis_class]) confusionMat$table confusionMat$overall[1] # trainNorm[camera_id==2 | camera_id==3, ][which(trainPred == "D" & trainNorm[camera_id==2 | camera_id==3, vis_class] == "A"), image_id]
testPred <- predict(fogTree, testNorm[camera_id==2 | camera_id==3], type = "class") confusionMat <- confusionMatrix(testPred, testNorm[camera_id==2 | camera_id==3, vis_class]) confusionMat$table confusionMat$overall[1]
testPred <- predict(fogTree, testNorm[camera_id==1], type = "class") confusionMat <- confusionMatrix(testPred, testNorm[camera_id==1, vis_class]) confusionMat$table confusionMat$overall[1]
testPred <- knn(trainNorm[camera_id==1, .(edges, changepoint, hue, saturation, brightness)], testNorm[camera_id==1, .(edges, changepoint, hue, saturation, brightness)], trainNorm[camera_id==1, vis_class]) confusionMat <- confusionMatrix(testPred, testNorm[camera_id==1, vis_class]) confusionMat$table confusionMat$overall[1]
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.