|
|
library(jsonlite)
|
|
|
library(dplyr)
|
|
|
library(fmsb)
|
|
|
|
|
|
|
|
|
data <- fromJSON("summary.json", simplifyVector = FALSE)
|
|
|
|
|
|
|
|
|
final_results <- data$final_results
|
|
|
|
|
|
|
|
|
df_final <- lapply(names(final_results), function(model_name) {
|
|
|
metric <- final_results[[model_name]]
|
|
|
data.frame(
|
|
|
model = model_name,
|
|
|
accuracy = metric$accuracy,
|
|
|
precision = metric$precision,
|
|
|
recall = metric$recall,
|
|
|
f1 = metric$f1,
|
|
|
total_vulnerable = metric$total_vulnerable %||% NA,
|
|
|
percentage = metric$percentage %||% NA,
|
|
|
is_vulnerable = as.numeric(metric$is_vulnerable %||% NA),
|
|
|
train_time_sec = metric$train_time_sec %||% NA
|
|
|
)
|
|
|
}) %>% bind_rows()
|
|
|
|
|
|
print("=== FINAL RESULTS DATA ===")
|
|
|
print(df_final)
|
|
|
|
|
|
|
|
|
norm_df <- df_final
|
|
|
num_cols <- sapply(norm_df, is.numeric)
|
|
|
norm_df[num_cols] <- lapply(norm_df[num_cols], function(x) {
|
|
|
rng <- range(x, na.rm = TRUE)
|
|
|
if (rng[1] == rng[2]) rep(1, length(x)) else (x - rng[1]) / (rng[2] - rng[1])
|
|
|
})
|
|
|
|
|
|
|
|
|
radar_data <- norm_df %>% select(-model)
|
|
|
rownames(radar_data) <- df_final$model
|
|
|
|
|
|
max_val <- rep(1, ncol(radar_data))
|
|
|
min_val <- rep(0, ncol(radar_data))
|
|
|
radar_plot_data <- rbind(max_val, min_val, radar_data)
|
|
|
|
|
|
|
|
|
colors <- c("red", "blue", "green", "orange", "purple")
|
|
|
par(mfrow = c(1, 1), mar = c(2, 2, 4, 2))
|
|
|
|
|
|
radarchart(
|
|
|
radar_plot_data,
|
|
|
axistype = 1,
|
|
|
pcol = colors,
|
|
|
plwd = 3,
|
|
|
plty = 1,
|
|
|
cglcol = "grey",
|
|
|
cglty = 1,
|
|
|
axislabcol = "grey30",
|
|
|
caxislabels = seq(0, 1, 0.2),
|
|
|
cglwd = 0.8,
|
|
|
vlcex = 0.8,
|
|
|
title = "Final Results – Model Comparison (All Metrics Normalized)"
|
|
|
)
|
|
|
|
|
|
legend(
|
|
|
"bottomright",
|
|
|
legend = rownames(radar_data),
|
|
|
col = colors,
|
|
|
lty = 1,
|
|
|
lwd = 3,
|
|
|
bty = "n",
|
|
|
cex = 0.8
|
|
|
)
|
|
|
|