##Εώς το πρωί θα φτιάξω το 2ο part
Στόχος αυτού του εργαστηρίου είναι η πρόβλεψη κακοήθειας όγκων χρησιμοποιώντας το dataset Breast Cancer (Wisconsin). Θα εφαρμόσουμε τον αλγόριθμο Random Forest για την ταξινόμηση και θα αξιολογήσουμε την απόδοσή του.
# Φόρτωση δεδομένων
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" ...
Πραγματοποιούμε ένα 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
Εκπαιδεύουμε το μοντέλο χρησιμοποιώντας 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
Υπολογίζουμε τις προβλέψεις στο 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
Αναλύουμε ποια χαρακτηριστικά των κυττάρων παίζουν τον σημαντικότερο ρόλο στην πρόβλεψη της κακοήθειας.
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
Αυτές οι τρεις μεταβλητές προσφέρουν τη μεγαλύτερη πληροφορία στο μοντέλο για τον διαχωρισμό μεταξύ καλοήθων και κακοήθων όγκων.