##Εώς το πρωί θα φτιάξω το 2ο part

Εισαγωγή

Στόχος αυτού του εργαστηρίου είναι η πρόβλεψη κακοήθειας όγκων χρησιμοποιώντας το dataset Breast Cancer (Wisconsin). Θα εφαρμόσουμε τον αλγόριθμο Random Forest για την ταξινόμηση και θα αξιολογήσουμε την απόδοσή του.

  1. Προετοιμασία Δεδομένων Αρχικά, φορτώνουμε τις απαραίτητες βιβλιοθήκες και το dataset. Προχωράμε σε καθαρισμό των δεδομένων, αφαίρεση περιττών στηλών (Id) και διαχείριση ελλιπών τιμών.
# Φόρτωση δεδομένων
data("BreastCancer", package = "mlbench")
bc <- BreastCancer

# Καθαρισμός
bc$Id <- NULL
bc <- na.omit(bc)

# Μετατροπή των χαρακτηριστικών σε αριθμητικά (numeric)
bc[, 1:9] <- lapply(bc[, 1:9], function(x) as.numeric(as.character(x)))

str(bc)
## 'data.frame':    683 obs. of  10 variables:
##  $ Cl.thickness   : num  5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : num  1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : num  1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : num  1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : num  2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : num  1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : num  3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: num  1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : num  1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
##  - attr(*, "na.action")= 'omit' Named int [1:16] 24 41 140 146 159 165 236 250 276 293 ...
##   ..- attr(*, "names")= chr [1:16] "24" "41" "140" "146" ...

2. Διαχωρισμός Δεδομένων (TODO 1)

Πραγματοποιούμε ένα stratified split (70/30) για να διατηρήσουμε τις αναλογίες των κλάσεων (benign / malignant) τόσο στο training όσο και στο test set.

set.seed(42)
train_idx <- createDataPartition(bc$Class, p = 0.7, list = FALSE)

train <- bc[train_idx, ]
test  <- bc[-train_idx, ]

# Έλεγχος αναλογιών
cat("Αναλογίες στο Train set:\n")
## Αναλογίες στο Train set:
round(prop.table(table(train$Class)), 3)
## 
##    benign malignant 
##     0.649     0.351
cat("\nΑναλογίες στο Test set:\n")
## 
## Αναλογίες στο Test set:
round(prop.table(table(test$Class)), 3)
## 
##    benign malignant 
##     0.652     0.348

3. Εκπαίδευση Μοντέλου Random Forest (TODO 2)

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

set.seed(42)
rf_model <- randomForest(
  Class ~ .,            
  data = train,        
  ntree = 500,         
  importance = TRUE    
)

print(rf_model)
## 
## Call:
##  randomForest(formula = Class ~ ., data = train, ntree = 500,      importance = TRUE) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 3.76%
## Confusion matrix:
##           benign malignant class.error
## benign       301        10  0.03215434
## malignant      8       160  0.04761905

4. Αξιολόγηση Μοντέλου (TODO 3)

Υπολογίζουμε τις προβλέψεις στο test set και εξάγουμε τις μετρήσεις ακρίβειας (Accuracy), ευαισθησίας (Sensitivity) και την περιοχή κάτω από την καμπύλη (AUC).

# Προβλέψεις
rf_pred  <- predict(rf_model, test)
rf_prob  <- predict(rf_model, test, type = "prob")[, "malignant"]

# Confusion Matrix
rf_cm <- confusionMatrix(rf_pred, test$Class, positive = "malignant")
print(rf_cm)
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       131         2
##   malignant      2        69
##                                           
##                Accuracy : 0.9804          
##                  95% CI : (0.9506, 0.9946)
##     No Information Rate : 0.652           
##     P-Value [Acc > NIR] : <2e-16          
##                                           
##                   Kappa : 0.9568          
##                                           
##  Mcnemar's Test P-Value : 1               
##                                           
##             Sensitivity : 0.9718          
##             Specificity : 0.9850          
##          Pos Pred Value : 0.9718          
##          Neg Pred Value : 0.9850          
##              Prevalence : 0.3480          
##          Detection Rate : 0.3382          
##    Detection Prevalence : 0.3480          
##       Balanced Accuracy : 0.9784          
##                                           
##        'Positive' Class : malignant       
## 
# AUC & ROC Curve
rf_roc <- roc(test$Class, rf_prob, levels = c("benign", "malignant"))
## Setting direction: controls < cases
plot(rf_roc, col = "royalblue", lwd = 2, main = "ROC Curve - Random Forest")

cat("\n--- Τελικές Μετρήσεις ---\n")
## 
## --- Τελικές Μετρήσεις ---
cat("Accuracy:   ", round(rf_cm$overall["Accuracy"], 4), "\n")
## Accuracy:    0.9804
cat("Sensitivity:", round(rf_cm$byClass["Sensitivity"], 4), "\n")
## Sensitivity: 0.9718
cat("RF AUC:     ", round(rf_roc$auc, 3), "\n")
## RF AUC:      0.999

5. Σημασία Μεταβλητών (TODO 4)

Αναλύουμε ποια χαρακτηριστικά των κυττάρων παίζουν τον σημαντικότερο ρόλο στην πρόβλεψη της κακοήθειας.

varImpPlot(rf_model, pch = 19, col = "darkred", main = "Variable Importance — Random Forest")

# Πίνακας σημασίας
importance_table <- as.data.frame(importance(rf_model))
importance_table %>% arrange(desc(MeanDecreaseGini))
##                    benign malignant MeanDecreaseAccuracy MeanDecreaseGini
## Cell.size       11.605774 16.330563            19.826188        60.344346
## Cell.shape      10.417048 20.502944            21.800283        53.561147
## Bare.nuclei     20.271034 19.036320            26.035566        34.154820
## Normal.nucleoli 11.849778 11.676750            15.229482        23.815034
## Bl.cromatin      6.086543 14.621620            14.691182        14.587449
## Cl.thickness    12.702656 19.830096            19.363837        11.845927
## Epith.c.size    10.510480  3.579421            11.128863        11.709247
## Marg.adhesion    6.228395 12.425305            13.009741         5.977215
## Mitoses          4.984157  0.839361             4.608274         1.550928

Συμπέρασμα

Με βάση το παραπάνω γράφημα, τα top 3 χαρακτηριστικά είναι:

Bare.nuclei

Cell.shape

Cell.size

Αυτές οι τρεις μεταβλητές προσφέρουν τη μεγαλύτερη πληροφορία στο μοντέλο για τον διαχωρισμό μεταξύ καλοήθων και κακοήθων όγκων.