1. Περιγραφή του Dataset και Προετοιμασία

Το dataset Hitters προέρχεται από το πακέτο ISLR και περιλαμβάνει στατιστικά στοιχεία για 322 παίκτες της Major League Baseball από τη σεζόν του 1986. Περιλαμβάνει 20 μεταβλητές, όπως τα Hits (χτυπήματα), τα Home Runs, τα Runs, και τα Years (χρόνια προϋπηρεσίας).

Ο στόχος μας είναι να προβλέψουμε αν ο μισθός (Salary) ενός παίκτη είναι υψηλός ή χαμηλός. Επειδή η μεταβλητή Salary έχει ελλιπείς τιμές, το πρώτο μας βήμα είναι ο καθαρισμός.

# Φόρτωση βιβλιοθηκών
library(ISLR)
library(rpart)
library(rpart.plot)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(ROCR)

# Καθαρισμός δεδομένων (αφαίρεση NA)
data(Hitters)
hitters_clean <- na.omit(Hitters)

# Δημιουργία δίτιμης μεταβλητής μισθού (High/Low) με βάση τη διάμεσο
median_salary <- median(hitters_clean$Salary)
hitters_clean$SalaryStatus <- as.factor(ifelse(hitters_clean$Salary > median_salary, "High", "Low"))

# Αφαίρεση της αρχικής μεταβλητής Salary για να μην επηρεάσει το μοντέλο
hitters_clean$Salary <- NULL

# Διαχωρισμός σε Train (70%) και Test Set (30%)
set.seed(123)
train_index <- createDataPartition(hitters_clean$SalaryStatus, p = 0.7, list = FALSE)
train_data <- hitters_clean[train_index, ]
test_data <- hitters_clean[-train_index, ]

2. Εκπαίδευση του Μοντέλου CART

Εκπαιδεύουμε το δέντρο αποφάσεων. Το πλεονέκτημα του CART είναι ότι μπορεί να διαχειριστεί αυτόματα μη γραμμικές σχέσεις και αλληλεπιδράσεις μεταβλητών.

# Εκπαίδευση του δέντρου
baseball_tree <- rpart(SalaryStatus ~ ., data = train_data, method = "class", 
                       control = rpart.control(minbucket = 5, cp = 0.01))

# Οπτικοποίηση του δέντρου
prp(baseball_tree, type = 2, extra = 104, nn = TRUE, main = "Decision Tree for Player Salary")

Σχολιασμός

Ο κυριότερος παράγοντας που καθορίζει τον μισθό είναι τα συνολικά χτυπήματα καριέρας (CHits), καθώς η πλειονότητα των παικτών με λιγότερα από 451 χτυπήματα κατατάσσεται αυτόματα στην κατηγορία χαμηλού μισθού με πιθανότητα 93%.

Για τους πιο έμπειρους παίκτες, καθοριστικό ρόλο παίζει η πρόσφατη απόδοση σε πόντους (Runs), όπου όσοι σημειώνουν πάνω από 34 πόντους έχουν 91% πιθανότητα να ανήκουν στους υψηλόμισθους.

Συμπερασματικά, το μοντέλο CART αναδεικνύει μια ιεραρχική σχέση όπου η εμπειρία θέτει τη βάση, αλλά η τρέχουσα παραγωγικότητα είναι αυτή που “κλειδώνει” τις υψηλές απολαβές, προσφέροντας μια πολύ πιο άμεση και οπτική ερμηνεία σε σχέση με τους συντελεστές μιας λογιστικής παλινδρόμησης.

3. Βελτιστοποίηση με Cross-Validation (Pruning)

Για να αποφύγουμε το overfitting, αναζητούμε τη βέλτιστη παράμετρο πολυπλοκότητας (\(cp\)) που ελαχιστοποιεί το σφάλμα μέσω cross-validation.

# Εύρεση βέλτιστου CP
printcp(baseball_tree)
## 
## Classification tree:
## rpart(formula = SalaryStatus ~ ., data = train_data, method = "class", 
##     control = rpart.control(minbucket = 5, cp = 0.01))
## 
## Variables actually used in tree construction:
## [1] CHits Runs  Years
## 
## Root node error: 91/185 = 0.49189
## 
## n= 185 
## 
##         CP nsplit rel error xerror     xstd
## 1 0.736264      0   1.00000 1.0879 0.074549
## 2 0.038462      1   0.26374 0.2967 0.052770
## 3 0.010000      3   0.18681 0.2967 0.052770
best_cp <- baseball_tree$cptable[which.min(baseball_tree$cptable[,"xerror"]),"CP"]

# Κλάδεμα (Pruning) του δέντρου
pruned_tree <- prune(baseball_tree, cp = best_cp)

# Οπτικοποίηση του κλαδεμένου δέντρου
prp(pruned_tree, type = 2, extra = 104, main = "Pruned Decision Tree")

Σχολιασμός

Στο κλαδεμένο δέντρο, η διαδικασία βελτιστοποίησης μέσω της παραμέτρου πολυπλοκότητας (\(cp\)) οδήγησε σε ένα εξαιρετικά απλό και ερμηνεύσιμο μοντέλο, διατηρώντας μόνο την πιο ισχυρή μεταβλητή πρόβλεψης, τα CHits.

Το μοντέλο διαχωρίζει το σύνολο των παικτών σε δύο μόνο κατηγορίες:

  1. όσοι έχουν λιγότερα από 451 χτυπήματα καριέρας ταξινομούνται ως χαμηλόμισθοι (Low) με πιθανότητα 93% (το 44% του δείγματος),
  2. ενώ όσοι ξεπερνούν αυτό το όριο κατατάσσονται αυτόματα στην κατηγορία υψηλού μισθού (High) με πιθανότητα 83% (το 56% του δείγματος).

Αυτή η απλοποίηση αποτρέπει το φαινόμενο του overfitting, αφαιρώντας λιγότερο σημαντικούς διαχωρισμούς (όπως τα Runs ή τα Years που υπήρχαν στο αρχικό δέντρο) και εστιάζοντας στην ουσιαστική πληροφορία που προσφέρει η μακροχρόνια εμπειρία στην πρόβλεψη των απολαβών.

4. Αξιολόγηση και Σύγκριση

Τέλος, αξιολογούμε την απόδοση στο Test Set και τη συγκρίνουμε με τη λογιστική παλινδρόμηση. Ενώ η παλινδρόμηση μας δίνει πιθανότητες, το δέντρο μας δίνει μια ξεκάθαρη διαδρομή αποφάσεων.

# Προβλέψεις στο Test Set
tree_preds <- predict(pruned_tree, test_data, type = "class")

# Confusion Matrix
conf_matrix <- confusionMatrix(tree_preds, test_data$SalaryStatus)
print(conf_matrix)
## Confusion Matrix and Statistics
## 
##           Reference
## Prediction High Low
##       High   36   7
##       Low     2  33
##                                           
##                Accuracy : 0.8846          
##                  95% CI : (0.7922, 0.9459)
##     No Information Rate : 0.5128          
##     P-Value [Acc > NIR] : 3.16e-12        
##                                           
##                   Kappa : 0.7698          
##                                           
##  Mcnemar's Test P-Value : 0.1824          
##                                           
##             Sensitivity : 0.9474          
##             Specificity : 0.8250          
##          Pos Pred Value : 0.8372          
##          Neg Pred Value : 0.9429          
##              Prevalence : 0.4872          
##          Detection Rate : 0.4615          
##    Detection Prevalence : 0.5513          
##       Balanced Accuracy : 0.8862          
##                                           
##        'Positive' Class : High            
## 
# Υπολογισμός AUC (Area Under the Curve)
tree_probs <- predict(pruned_tree, test_data, type = "prob")[,2]
pred_obj <- prediction(tree_probs, test_data$SalaryStatus)
perf <- performance(pred_obj, "tpr", "fpr")
plot(perf, main = "ROC Curve", col = "blue")
abline(a=0, b=1, lty=2)

Σχολιασμός

Η καμπύλη ROC αποτελεί το τελικό εργαλείο αξιολόγησης της απόδοσης του μοντέλου μας, απεικονίζοντας τη σχέση μεταξύ της ευαισθησίας (True Positive Rate) και της ειδικότητας (False Positive Rate).

Η μπλε γραμμή βρίσκεται σημαντικά πάνω από τη διαγώνιο (διακεκομμένη γραμμή), γεγονός που αποδεικνύει ότι το κλαδεμένο δέντρο έχει ισχυρή προβλεπτική ικανότητα και δεν λειτουργεί τυχαία.

Η απότομη άνοδος της καμπύλης στην αρχή του άξονα δείχνει ότι το μοντέλο επιτυγχάνει υψηλά ποσοστά σωστής πρόβλεψης των “High” μισθών με πολύ χαμηλό ποσοστό λανθασμένων συναγερμών, επιβεβαιώνοντας ότι η επιλογή των CHits ως κύριου κριτηρίου ήταν στατιστικά ορθή και αποδοτική.