Στην εργασία αυτή εφαρμόζονται δύο μοντέλα ταξινόμησης: Decision Trees (CART) και Logistic Regression. Στόχος είναι η πρόβλεψη της μεταβλητής Unconst με βάση τα χαρακτηριστικά του dataset.
Γίνεται εισαγωγή των δεδομένων στο R από αρχείο CSV ώστε να είναι διαθέσιμα για ανάλυση.
data <- read.csv("stevens.csv", stringsAsFactors = FALSE)
library(rpart)
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.5.3
library(nnet)
Ελέγχουμε τη δομή, τις πρώτες γραμμές και βασικά στατιστικά για να κατανοήσουμε τα χαρακτηριστικά του dataset.
head(data)
## Docket Term Circuit Issue Petitioner Respondent LowerCourt
## 1 93-1408 1994 2nd EconomicActivity BUSINESS BUSINESS liberal
## 2 93-1577 1994 9th EconomicActivity BUSINESS BUSINESS liberal
## 3 93-1612 1994 5th EconomicActivity BUSINESS BUSINESS liberal
## 4 94-623 1994 1st EconomicActivity BUSINESS BUSINESS conser
## 5 94-1175 1995 7th JudicialPower BUSINESS BUSINESS conser
## 6 95-129 1995 9th EconomicActivity BUSINESS BUSINESS conser
## Unconst Reverse
## 1 0 1
## 2 0 1
## 3 0 1
## 4 0 1
## 5 0 1
## 6 1 0
str(data)
## 'data.frame': 566 obs. of 9 variables:
## $ Docket : chr "93-1408" "93-1577" "93-1612" "94-623" ...
## $ Term : int 1994 1994 1994 1994 1995 1995 1996 1997 1997 1999 ...
## $ Circuit : chr "2nd" "9th" "5th" "1st" ...
## $ Issue : chr "EconomicActivity" "EconomicActivity" "EconomicActivity" "EconomicActivity" ...
## $ Petitioner: chr "BUSINESS" "BUSINESS" "BUSINESS" "BUSINESS" ...
## $ Respondent: chr "BUSINESS" "BUSINESS" "BUSINESS" "BUSINESS" ...
## $ LowerCourt: chr "liberal" "liberal" "liberal" "conser" ...
## $ Unconst : int 0 0 0 0 0 1 0 1 0 0 ...
## $ Reverse : int 1 1 1 1 1 0 1 1 1 1 ...
summary(data)
## Docket Term Circuit Issue
## Length:566 Min. :1994 Length:566 Length:566
## Class :character 1st Qu.:1995 Class :character Class :character
## Mode :character Median :1997 Mode :character Mode :character
## Mean :1997
## 3rd Qu.:1999
## Max. :2001
## Petitioner Respondent LowerCourt Unconst
## Length:566 Length:566 Length:566 Min. :0.0000
## Class :character Class :character Class :character 1st Qu.:0.0000
## Mode :character Mode :character Mode :character Median :0.0000
## Mean :0.2473
## 3rd Qu.:0.0000
## Max. :1.0000
## Reverse
## Min. :0.0000
## 1st Qu.:0.0000
## Median :1.0000
## Mean :0.5459
## 3rd Qu.:1.0000
## Max. :1.0000
colnames(data)
## [1] "Docket" "Term" "Circuit" "Issue" "Petitioner"
## [6] "Respondent" "LowerCourt" "Unconst" "Reverse"
Μετατρέπουμε τις κατηγορικές μεταβλητές σε factor ώστε να μπορούν να χρησιμοποιηθούν σωστά στα μοντέλα ταξινόμησης.
data$Unconst <- as.factor(data$Unconst)
data$Docket <- as.factor(data$Docket)
data$Term <- as.factor(data$Term)
data$Circuit <- as.factor(data$Circuit)
data$Issue <- as.factor(data$Issue)
data$Petitioner <- as.factor(data$Petitioner)
data$Respondent <- as.factor(data$Respondent)
data$LowerCourt <- as.factor(data$LowerCourt)
Χωρίζουμε τα δεδομένα σε σύνολο εκπαίδευσης και ελέγχου για να αξιολογήσουμε την απόδοση των μοντέλων σε νέα δεδομένα.
set.seed(123)
sample_index <- sample(1:nrow(data), 0.7 * nrow(data))
train <- data[sample_index, ]
test <- data[-sample_index, ]
test$Docket <- factor(test$Docket, levels = levels(train$Docket))
test$Term <- factor(test$Term, levels = levels(train$Term))
test$Circuit <- factor(test$Circuit, levels = levels(train$Circuit))
test$Issue <- factor(test$Issue, levels = levels(train$Issue))
test$Petitioner <- factor(test$Petitioner, levels = levels(train$Petitioner))
test$Respondent <- factor(test$Respondent, levels = levels(train$Respondent))
test$LowerCourt <- factor(test$LowerCourt, levels = levels(train$LowerCourt))
Δημιουργείται το μοντέλο δέντρου αποφάσεων, το οποίο χωρίζει τα δεδομένα με βάση κανόνες και χαρακτηριστικά για να κάνει προβλέψεις.
library(rpart)
library(rpart.plot)
tree_model <- rpart(Unconst ~ Docket + Term + Circuit + Issue + Petitioner + Respondent + LowerCourt,
data = train,
method = "class")
rpart.plot(tree_model)
# 7. Αξιολόγηση CART Υπολογίζουμε τις προβλέψεις του μοντέλου και
μετράμε την ακρίβεια του μέσω confusion matrix και accuracy.
pred_tree <- predict(tree_model, test, type = "class")
conf_tree <- table(Predicted = pred_tree, Actual = test$Unconst)
conf_tree
## Actual
## Predicted 0 1
## 0 114 21
## 1 20 15
accuracy_tree <- mean(pred_tree == test$Unconst)
accuracy_tree
## [1] 0.7588235
Εκπαιδεύεται ένα μοντέλο λογιστικής παλινδρόμησης που εκτιμά πιθανότητες για κάθε κατηγορία της μεταβλητής στόχου.
library(nnet)
log_model <- multinom(Unconst ~ Docket + Term + Circuit + Issue + Petitioner + Respondent + LowerCourt,
data = train)
## # weights: 619 (618 variable)
## initial value 274.486284
## iter 10 value 22.885837
## iter 20 value 0.112832
## iter 30 value 0.000882
## final value 0.000065
## converged
Γίνονται προβλέψεις στο test set και υπολογίζεται η απόδοση του μοντέλου.
pred_log <- predict(log_model, test)
conf_log <- table(Predicted = pred_log, Actual = test$Unconst)
conf_log
## Actual
## Predicted 0 1
## 0 107 14
## 1 27 22
accuracy_log <- mean(pred_log == test$Unconst)
accuracy_log
## [1] 0.7588235
Συγκρίνεται η ακρίβεια των δύο μοντέλων για να αξιολογηθεί ποιο αποδίδει καλύτερα.
results <- data.frame(
Model = c("Decision Tree (CART)", "Logistic Regression"),
Accuracy = c(accuracy_tree, accuracy_log)
)
results
## Model Accuracy
## 1 Decision Tree (CART) 0.7588235
## 2 Logistic Regression 0.7588235
Το Decision Tree παρέχει καλύτερη ερμηνευσιμότητα, ενώ η Logistic Regression προσφέρει πιο σταθερές προβλέψεις. Η επιλογή μοντέλου εξαρτάται από την ακρίβεια και την ανάγκη ερμηνείας.