Στο dataset Alzheimer's Disease Dataset.
Η παρούσα εργασία εξετάζει ένα case study πρόβλεψης με χρήση του dataset Alzheimer, το οποίο περιλαμβάνει ιατρικά και συμπεριφορικά δεδομένα από άτομα που συμμετείχαν σε μελέτη για τη γνωστική εξασθένηση και τη νόσο Alzheimer.
Ο στόχος είναι να μελετήσουμε ποιες μεταβλητές σχετίζονται με τη
διάγνωση Alzheimer και να δημιουργήσουμε ένα μοντέλο που προβλέπει αν
ένα άτομο έχει διαγνωστεί με τη νόσο (μεταβλητή
Diagnosis).
Το dataset περιέχει 2149 εγγραφές και αρχικά περιλάμβανε 35 μεταβλητές, εκ των οποίων επιλέχθηκαν 16 σημαντικές μεταβλητές(μαζί με την εξαρτημένη) για περαιτέρω ανάλυση και μοντελοποίηση.
## Rows: 2149 Columns: 35
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## chr (1): DoctorInCharge
## dbl (34): PatientID, Age, Gender, Ethnicity, EducationLevel, BMI, Smoking, A...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
## Rows: 2149 Columns: 16
## ── Column specification ────────────────────────────────────────────────────────
## Delimiter: ","
## dbl (16): Diagnosis, FunctionalAssessment, ADL, BehavioralProblems, MemoryCo...
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
str(alzheimer) # Δομή δεδομένων
## spc_tbl_ [2,149 × 16] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ Diagnosis : num [1:2149] 0 0 0 0 0 0 0 1 0 0 ...
## $ FunctionalAssessment : num [1:2149] 6.52 7.12 5.9 8.97 6.05 ...
## $ ADL : num [1:2149] 1.7259 2.5924 7.1195 6.4812 0.0147 ...
## $ BehavioralProblems : num [1:2149] 0 0 0 1 0 0 0 0 1 1 ...
## $ MemoryComplaints : num [1:2149] 0 0 0 0 0 0 0 0 0 0 ...
## $ Disorientation : num [1:2149] 0 0 1 0 0 0 0 0 0 0 ...
## $ MMSE : num [1:2149] 21.46 20.61 7.36 13.99 13.52 ...
## $ DifficultyCompletingTasks: num [1:2149] 1 0 1 0 1 0 0 0 0 0 ...
## $ EducationLevel : num [1:2149] 2 0 1 1 0 1 2 1 0 0 ...
## $ SleepQuality : num [1:2149] 9.03 7.15 9.67 8.39 5.6 ...
## $ BMI : num [1:2149] 22.9 26.8 17.8 33.8 20.7 ...
## $ PersonalityChanges : num [1:2149] 0 0 0 0 1 0 0 0 1 0 ...
## $ Smoking : num [1:2149] 0 0 0 1 0 0 1 0 0 1 ...
## $ CardiovascularDisease : num [1:2149] 0 0 0 0 0 0 0 0 0 1 ...
## $ Hypertension : num [1:2149] 0 0 0 0 0 0 0 0 1 0 ...
## $ Age : num [1:2149] 73 89 73 74 89 86 68 75 72 87 ...
## - attr(*, "spec")=
## .. cols(
## .. Diagnosis = col_double(),
## .. FunctionalAssessment = col_double(),
## .. ADL = col_double(),
## .. BehavioralProblems = col_double(),
## .. MemoryComplaints = col_double(),
## .. Disorientation = col_double(),
## .. MMSE = col_double(),
## .. DifficultyCompletingTasks = col_double(),
## .. EducationLevel = col_double(),
## .. SleepQuality = col_double(),
## .. BMI = col_double(),
## .. PersonalityChanges = col_double(),
## .. Smoking = col_double(),
## .. CardiovascularDisease = col_double(),
## .. Hypertension = col_double(),
## .. Age = col_double()
## .. )
## - attr(*, "problems")=<externalptr>
summary(alzheimer) # Περιγραφικά στατιστικά
## Diagnosis FunctionalAssessment ADL BehavioralProblems
## Min. :0.0000 Min. :0.00046 Min. : 0.001288 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:2.56628 1st Qu.: 2.342836 1st Qu.:0.0000
## Median :0.0000 Median :5.09444 Median : 5.038973 Median :0.0000
## Mean :0.3537 Mean :5.08005 Mean : 4.982958 Mean :0.1568
## 3rd Qu.:1.0000 3rd Qu.:7.54698 3rd Qu.: 7.581490 3rd Qu.:0.0000
## Max. :1.0000 Max. :9.99647 Max. : 9.999747 Max. :1.0000
## MemoryComplaints Disorientation MMSE
## Min. :0.000 Min. :0.0000 Min. : 0.005312
## 1st Qu.:0.000 1st Qu.:0.0000 1st Qu.: 7.167602
## Median :0.000 Median :0.0000 Median :14.441660
## Mean :0.208 Mean :0.1582 Mean :14.755132
## 3rd Qu.:0.000 3rd Qu.:0.0000 3rd Qu.:22.161028
## Max. :1.000 Max. :1.0000 Max. :29.991381
## DifficultyCompletingTasks EducationLevel SleepQuality BMI
## Min. :0.0000 Min. :0.000 Min. : 4.003 Min. :15.01
## 1st Qu.:0.0000 1st Qu.:1.000 1st Qu.: 5.483 1st Qu.:21.61
## Median :0.0000 Median :1.000 Median : 7.116 Median :27.82
## Mean :0.1587 Mean :1.287 Mean : 7.051 Mean :27.66
## 3rd Qu.:0.0000 3rd Qu.:2.000 3rd Qu.: 8.563 3rd Qu.:33.87
## Max. :1.0000 Max. :3.000 Max. :10.000 Max. :39.99
## PersonalityChanges Smoking CardiovascularDisease Hypertension
## Min. :0.0000 Min. :0.0000 Min. :0.0000 Min. :0.0000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:0.0000
## Median :0.0000 Median :0.0000 Median :0.0000 Median :0.0000
## Mean :0.1508 Mean :0.2885 Mean :0.1443 Mean :0.1489
## 3rd Qu.:0.0000 3rd Qu.:1.0000 3rd Qu.:0.0000 3rd Qu.:0.0000
## Max. :1.0000 Max. :1.0000 Max. :1.0000 Max. :1.0000
## Age
## Min. :60.00
## 1st Qu.:67.00
## Median :75.00
## Mean :74.91
## 3rd Qu.:83.00
## Max. :90.00
head(alzheimer, 5) # Πρώτες 5 εγγραφές
## # A tibble: 5 × 16
## Diagnosis FunctionalAssessment ADL BehavioralProblems MemoryComplaints
## <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 0 6.52 1.73 0 0
## 2 0 7.12 2.59 0 0
## 3 0 5.90 7.12 0 0
## 4 0 8.97 6.48 1 0
## 5 0 6.05 0.0147 0 0
## # ℹ 11 more variables: Disorientation <dbl>, MMSE <dbl>,
## # DifficultyCompletingTasks <dbl>, EducationLevel <dbl>, SleepQuality <dbl>,
## # BMI <dbl>, PersonalityChanges <dbl>, Smoking <dbl>,
## # CardiovascularDisease <dbl>, Hypertension <dbl>, Age <dbl>
| Μεταβλητή | Περιγραφή | Μονάδα Μέτρησης |
|---|---|---|
Diagnosis |
Η Εξαρτημένη μεταβλητή: αν υπάρχει διάγνωση με νόσο Alzheimer | Δυαδική (0/1) |
FunctionalAssessment |
Βαθμός λειτουργικότητας / αυτοεξυπηρέτησης | βαθμοί |
ADL |
Activities of Daily Living score (βαθμολογία καθημερινών δραστηριοτήτων) | βαθμοί |
BehavioralProblems |
Ένταση ή συχνότητα συμπεριφορικών προβλημάτων (π.χ. ευερεθιστότητα, άγχος) | δυαδική (0/1) |
MemoryComplaints |
Αριθμός ή ένταση καταγγελιών για προβλήματα μνήμης | δυαδική (0/1) |
Disorientation |
Συχνότητα επεισοδίων αποπροσανατολισμού | δυαδική (0/1) |
MMSE |
Mini-Mental State Examination score (0–30), διαγνωστικό τεστ νοητικής κατάστασης | βαθμοί |
DifficultyCompletingTasks |
Ένδειξη δυσκολίας στην ολοκλήρωση καθημερινών ή γνωστικών εργασιών | δυαδική (0/1) |
EducationLevel |
Επίπεδο εκπαίδευσης (σε 4 διαφορετικές κλίμακες βαθμίδες 0-3) | κατηγορικοί (0-3) |
SleepQuality |
Βαθμολογία ποιότητας ύπνου (π.χ. σε ώρες 4–10) | ώρες |
BMI |
Body Mass Index (βάρος/ύψος²), δείκτης σωματικής σύστασης | kg/m² |
PersonalityChanges |
Ένδειξη αλλαγών στην προσωπικότητα (π.χ. εναλλαγές διάθεσης) | δυαδική (0/1) |
Smoking |
Καπνιστική συμπεριφορά | δυαδική (0/1) |
CardiovascularDisease |
Παρουσία καρδιαγγειακής νόσου | δυαδική (0/1) |
Hypertension |
Διάγνωση υπέρτασης | δυαδική (0/1) |
Age |
Ηλικία του/της συμμετέχοντα σε χρόνια | χρόνια |
Σημείωση1: Επειδή το dataset είχε 35 μεταβλητές και είναι πάρα πολλές, βρήκα την μέση απόλυτη (και απλή) συσχέτιση κάθε μεταβλητής με όλες τις άλλες και κρατήσα τις πρώτες 15.
| Var1 | avg_abs_r | avg_r |
|---|---|---|
| Diagnosis | 0.062 | -0.016 |
| FunctionalAssessment | 0.031 | -0.007 |
| ADL | 0.027 | -0.011 |
| BehavioralProblems | 0.026 | 0.008 |
| MemoryComplaints | 0.025 | 0.008 |
| Disorientation | 0.021 | 0.003 |
| MMSE | 0.021 | 0.000 |
| DifficultyCompletingTasks | 0.020 | 0.000 |
| EducationLevel | 0.019 | -0.002 |
| SleepQuality | 0.018 | 0.006 |
| BMI | 0.018 | 0.000 |
| PersonalityChanges | 0.018 | -0.005 |
| Smoking | 0.018 | -0.006 |
| CardiovascularDisease | 0.018 | 0.003 |
| Hypertension | 0.018 | -0.001 |
| CholesterolTriglycerides | 0.017 | -0.002 |
| DietQuality | 0.017 | 0.002 |
| CholesterolLDL | 0.017 | 0.002 |
| Age | 0.017 | -0.001 |
| HeadInjury | 0.017 | -0.002 |
| PatientID | 0.016 | -0.004 |
| Gender | 0.016 | 0.001 |
| CholesterolHDL | 0.016 | 0.000 |
| Diabetes | 0.016 | -0.001 |
| Ethnicity | 0.016 | 0.000 |
| FamilyHistoryAlzheimers | 0.016 | 0.001 |
| Forgetfulness | 0.015 | 0.001 |
| CholesterolTotal | 0.015 | -0.002 |
| Depression | 0.014 | 0.001 |
| Confusion | 0.014 | -0.002 |
| PhysicalActivity | 0.014 | 0.002 |
| AlcoholConsumption | 0.014 | -0.005 |
| SystolicBP | 0.014 | -0.006 |
| DiastolicBP | 0.013 | -0.005 |
Ένα correlation matrix σε βοηθάει ώστε με μια γρήγορη ματιά να ξέρεις ποιες είναι οι δυνατές συσχετίσεις που υπάρχουν στο dataset.
Παραθέτω κάποια διαγράμματα μεταξύ κάποιων μεταβλητών-ζευγαριών για καλύτερη κατανόηση του dataset
Το histogram με την μεταβλητή Age δείχνει ότι οι ηλικίες
των συμμετεχόντων είναι σχετικά ισοκατανεμημένες στο δείγμα. Δεν
παρατηρείται κάποια έντονη συγκέντρωση τιμών σε συγκεκριμένη ηλικιακή
ομάδα, γεγονός που υποδηλώνει ότι το dataset καλύπτει επαρκώς ένα ευρύ
φάσμα ηλικιών.
Από το γράφημα παρατηρούμε ότι τα άτομα που ανέφεραν προβλήματα μνήμης παρουσιάζουν σε μεγάλο ποσοστό θετική διάγνωση για τη νόσο Alzheimer. Αντίθετα, μεταξύ όσων δεν ανέφεραν προβλήματα μνήμης, η πλειονότητα δεν διαγνώστηκε με τη νόσο.
Ένα απλό γράφημα στο οποίο δείχνω πώς κατανείμεται η εξαρτημένη μεταβλητή στο δείγμα, δηλάδη πόσους έχουμε με Alzheimer και πόσους χωρίς.
Το γράφημα παρουσιάζει τη σχέση ανάμεσα στο σκορ του γνωστικού τεστ MMSE και την πιθανότητα διάγνωσης με Alzheimer. Διακρίνεται ότι τα περισσότερα άτομα που διαγνώστηκαν με τη νόσο (Diagnosis = 1) είχαν χαμηλές επιδόσεις στο τεστ, γεγονός που αντανακλά γνωστικές δυσκολίες. Αντίθετα, τα άτομα που δεν διαγνώστηκαν (Diagnosis = 0) βαθμολογήθηκαν σε υψηλότερες τιμές του MMSE, επιβεβαιώνοντας τη διαγνωστική αξία του τεστ. Το γράφημα επιβεβαιώνει την ισχυρή αρνητική συσχέτιση μεταξύ MMSE score και διάγνωσης Alzheimer.
Διαχωρίζουμε το dataset μας σε trainset και testset
set.seed(3000)
spl <- sample.split(alzheimer$Diagnosis, SplitRatio = 0.7)
Train <- subset(alzheimer, spl == TRUE)
Test <- subset(alzheimer, spl == FALSE)
## Πλήθος στο training set: 1504
## Πλήθος στο test set: 645
Βάζουμε στο μοντέλο και τις 15 μεταβλητές με εξαρτημένη την
Diagnosis.
TreeModel <- rpart(Diagnosis ~ ., data = Train, method = "class")
prp(TreeModel)
Παρακάτω βλέπουμε και το print(TreeModel). Δεν έκανα το
summary() γιατί έχει πολύ μεγάλο και για Rmd αρχειο
output.
## n= 1504
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 1504 532 0 (0.64627660 0.35372340)
## 2) FunctionalAssessment>=4.966706 782 127 0 (0.83759591 0.16240409)
## 4) MemoryComplaints< 0.5 615 50 0 (0.91869919 0.08130081)
## 8) BehavioralProblems< 0.5 526 19 0 (0.96387833 0.03612167) *
## 9) BehavioralProblems>=0.5 89 31 0 (0.65168539 0.34831461)
## 18) ADL>=5.15993 45 2 0 (0.95555556 0.04444444) *
## 19) ADL< 5.15993 44 15 1 (0.34090909 0.65909091)
## 38) MMSE>=24.04367 9 0 0 (1.00000000 0.00000000) *
## 39) MMSE< 24.04367 35 6 1 (0.17142857 0.82857143) *
## 5) MemoryComplaints>=0.5 167 77 0 (0.53892216 0.46107784)
## 10) ADL>=4.840241 84 17 0 (0.79761905 0.20238095)
## 20) BehavioralProblems< 0.5 69 5 0 (0.92753623 0.07246377) *
## 21) BehavioralProblems>=0.5 15 3 1 (0.20000000 0.80000000) *
## 11) ADL< 4.840241 83 23 1 (0.27710843 0.72289157)
## 22) MMSE>=24.10395 19 0 0 (1.00000000 0.00000000) *
## 23) MMSE< 24.10395 64 4 1 (0.06250000 0.93750000) *
## 3) FunctionalAssessment< 4.966706 722 317 1 (0.43905817 0.56094183)
## 6) ADL>=5.036814 340 101 0 (0.70294118 0.29705882)
## 12) MemoryComplaints< 0.5 271 43 0 (0.84132841 0.15867159)
## 24) BehavioralProblems< 0.5 219 5 0 (0.97716895 0.02283105) *
## 25) BehavioralProblems>=0.5 52 14 1 (0.26923077 0.73076923)
## 50) MMSE>=23.79367 12 0 0 (1.00000000 0.00000000) *
## 51) MMSE< 23.79367 40 2 1 (0.05000000 0.95000000) *
## 13) MemoryComplaints>=0.5 69 11 1 (0.15942029 0.84057971)
## 26) MMSE>=24.02476 10 1 0 (0.90000000 0.10000000) *
## 27) MMSE< 24.02476 59 2 1 (0.03389831 0.96610169) *
## 7) ADL< 5.036814 382 78 1 (0.20418848 0.79581152)
## 14) MMSE>=24.02205 68 4 0 (0.94117647 0.05882353) *
## 15) MMSE< 24.02205 314 14 1 (0.04458599 0.95541401) *
Εφαρμόζουμε το μοντέλο που φτιάξαμε σε νέα δεδομένα, συγκεκριμένα στα test δεδομένα και παίρνουμε ακρίβεια 0.945. Άρα όπως θα δείτε παρακάτω είναι καλύτερο του baseline, ανταγωνιστικό του μοντέλου λογιστικής παλινδρόμησης και πολύ πιο ερμηνεύσιμο.
PredictCART <- predict(TreeModel, newdata = Test, type = "class")
table(Test$Diagnosis, PredictCART)
## PredictCART
## 0 1
## 0 405 12
## 1 23 205
accuracy <- sum(diag(table(Test$Diagnosis, PredictCART))) / nrow(Test)
accuracy # εμφάνιση ποσοστού ακρίβειας
## [1] 0.9457364
Tο μοντέλο baseline που δίνει πρόβλεψη πάντα
OXI ΔΙΑΓΝΩΣΗ έχει ακρίβεια 0.647.
# Count των τιμών της Diagnosis στο Test
table(Test$Diagnosis)
##
## 0 1
## 417 228
# Ποια είναι η πιο συχνή κατηγορία;
most_common_class <- names(which.max(table(Test$Diagnosis)))
# Υπολογισμός baseline accuracy: προβλέπουμε πάντα την πιο συχνή κατηγορία
baseline_accuracy <- sum(Test$Diagnosis == most_common_class) / nrow(Test)
## Baseline accuracy (predict always 0 ): 0.647
Αν είχαμε χτίσει μοντέλο λογιστικής παλινδρόμησης, αυτό θα έδινε ακρίβεια περίπου 0.854.
# Confusion matrix
table(Actual = Test$Diagnosis, Predicted = log_pred_class)
## Predicted
## Actual 0 1
## 0 379 38
## 1 56 172
## Logistic Regression Accuracy: 0.854
PredictROC <- predict(TreeModel, newdata = Test)
head(PredictROC, 10)
## 0 1
## 1 0.96387833 0.03612167
## 2 0.96387833 0.03612167
## 3 0.95555556 0.04444444
## 4 0.96387833 0.03612167
## 5 0.04458599 0.95541401
## 6 0.06250000 0.93750000
## 7 0.03389831 0.96610169
## 8 0.95555556 0.04444444
## 9 0.95555556 0.04444444
## 10 0.04458599 0.95541401
pred <- prediction(PredictROC[,2], Test$Diagnosis)
perf <- performance(pred, "tpr", "fpr")
plot(perf)
as.numeric(performance(pred, "auc")@y.values)
## [1] 0.9447863
Βρήκαμε μια καλή τιμή, σκεφτείτε όταν είναι κοντά στο 0.5 οι τιμές είναι σχεδόν τυχαίες, οπότε θέλουμε όσο γίνεται πιο κοντά στο 1.
Για να πειραματιστούμε με το δέντρο και να δούμε αν το κάναμε υπερβολικά περίπλοκο ή απλό αλλάζουμε το min-bucket, έτσι κάνουμε το αντίστοιχο pruning. Αυτό σημαίνει ότι με τις ίδιες μεταβλητές στο μοντέλο μπορεί να πετύχουμε διαφορετική ακρίβεια. Για τον λόγο αυτό κάνουμε cross-validation και χρησιμοποιήσουμε μια παράμετρο που ονομάζεται παράμετρος πολυπλοκότητας (cp). Αυτή που θα δώσει την υψηλότερη ακρίβεια, την κρατάμε και με αυτήν εκπαιδεύουμε το μοντέλο μας στο train.
# Βήμα 1: Ορισμός cross-validation (7-fold)
numFolds <- trainControl(method = "cv", number = 7)
# Βήμα 2: Ορισμός grid για παράμετρο cp
cpGrid <- expand.grid(.cp = seq(0.01, 0.2, 0.01))
# Βήμα 3: Μετατροπή της εξαρτημένης σε factor (μόνο μία φορά!)
Train$Diagnosis <- factor(Train$Diagnosis, levels = c(0, 1), labels = c("No", "Yes"))
# Βήμα 4: Εκπαίδευση μοντέλου με cross-validation
cvModel <- train(
Diagnosis ~ .,
data = Train,
method = "rpart",
trControl = numFolds,
tuneGrid = cpGrid
)
# Βήμα 5: Εμφανίζουμε βασικά αποτελέσματα
print(cvModel)
## CART
##
## 1504 samples
## 15 predictor
## 2 classes: 'No', 'Yes'
##
## No pre-processing
## Resampling: Cross-Validated (7 fold)
## Summary of sample sizes: 1289, 1289, 1290, 1289, 1289, 1289, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.01 0.9448039 0.8793661
## 0.02 0.9222095 0.8272298
## 0.03 0.9042693 0.7836508
## 0.04 0.8750054 0.7109624
## 0.05 0.8716832 0.7009196
## 0.06 0.8710187 0.6988831
## 0.07 0.8710187 0.6988831
## 0.08 0.8590493 0.6674950
## 0.09 0.8497469 0.6421304
## 0.10 0.8324433 0.5962913
## 0.11 0.8158320 0.5628387
## 0.12 0.8052007 0.5416900
## 0.13 0.8025429 0.5361878
## 0.14 0.7899183 0.5160516
## 0.15 0.7805725 0.5030746
## 0.16 0.7805725 0.5030746
## 0.17 0.7805725 0.5030746
## 0.18 0.7805725 0.5030746
## 0.19 0.7805725 0.5030746
## 0.20 0.7626323 0.4276306
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.01.
Και παίρνουμε ως αποτέλεσμα: The final value used for the model was cp = 0.01.
plot(cvModel)
Βλέπουμε στο γράφημα ότι όσο αυξάνουμε το cp το δέντρο πρακτικά γίνεται πιο απλό και μικρό οπότε χάνουμε ακρίβεια. Τελικά κρατάμε το 0.01 και προχωράμε.
# Βήμα 6: Εκπαίδευση τελικού CART με το καλύτερο cp
best_cp <- cvModel$bestTune$cp
AlzheimerTreeCV <- rpart(Diagnosis ~ ., data = Train, method = "class", cp = best_cp)
Μετά κάνουμε την πρόβλεψη μας στο test και βλέπουμε την ακρίβεια.
# Βήμα 7: Πρόβλεψη και πίνακας σύγχυσης
PredictCV <- predict(AlzheimerTreeCV, newdata = Test, type = "class")
table(Test$Diagnosis, PredictCV)
## PredictCV
## No Yes
## 0 405 12
## 1 23 205
Το confusion matrix δείχνει ότι το μοντέλο με cross-validation προβλέπει σωστά τόσο τις θετικές όσο και τις αρνητικές περιπτώσεις, με σχετικά μικρό αριθμό σφαλμάτων (12 false positives και 23 false negatives).
## [1] 0.9457364
Η ακρίβεια που επιτεύχθηκε στο test set ήταν 0.945, η οποία είναι ελαφρώς βελτιωμένη σε σχέση με την ακρίβεια 0.944 του αρχικού δέντρου χωρίς χρήση cross-validation.
Παρότι η διαφορά στην ακρίβεια μεταξύ απλού και optimized δέντρου είναι μικρή (0.945 > 0.944), η χρήση cross-validation παραμένει σημαντική, καθώς προσφέρει σταθερότερη επιλογή υπερπαραμέτρων, μειώνει την πιθανότητα υπερπροσαρμογής, και εξασφαλίζει ότι η τιμή cp δεν επιλέγεται αυθαίρετα ή μόνο με βάση την ακρίβεια στο training set.
Ο cp ελέγχει το pruning (κλάδεμα) στο δέντρο αποφάσεων
Η χρήση k-fold cross-validation σε βοηθάει στο να επιλέξεις μια τιμή cp με βάση την απόδοση στο training set.
Το dataset φάνηκε αρκετά ισορροπημένο, αφού δεν είχαμε σημαντικά προβλήματα στην πρόβλεψη της μειοψηφικής κλάσης του να διαγνωστεί κάποιος με τη νόσο.
Είχα μεγάλο θέμα στο feature selection γιατί το αρχικό dataset είχε 35 στήλες και δεν γινόταν να τις κρατήσω όλες, πχ δεν μπορούσα να κάνω το heatmap με τις συσχετίσεις.
Επειδή πολλές από τις μεταβλητές ήταν δυαδικές δηλαδή 0 ή 1 δεν μπορούσα να βγάλω ωραία γραφήματα που να δείχνουν κάποια ενδιαφέρουσα σχέση
Δεν μπορούσα να κάνω fetch το best_cp επειδή χρησιμοποιούσα λάθος
την μέθοδο με την οποία το επιτυγάνεις, συγκεκριμένα:
best_cp <- cvModel$bestTune$.cp ενω θα επρεπε
best_cp <- cvModel$bestTune$cp