Το Titanic - Machine Learning from Disaster κοινοποιήθηκε το 2012 στο Kaggle, ένα αποθετήριο βάσεων, συνόλων δεδομένων και θεωριών πεδίων. Εντάσσεται στον χώρο της μηχανικής μάθησης και χρησιμοποιείται ευρέως για σκοπούς εκπαίδευσης και επίδειξης αλγορίθμων ταξινόμησης. Βασίζεται στο ναυάγιο του Τιτανικού, του διάσημου επιβατηγού πλοίου που βυθίστηκε το 1912 και περιέχει πληροφορίες για τους επιβάτες. Στόχος του είναι η πρόβλεψη της επιβίωσης (Survived) κάθε επιβάτη, με βάση τα χαρακτηριστικά του.
Η ανάλυση των δεδομένων του dataset βοηθά την κατανόηση των παραγόντων που επηρέασαν την πιθανότητα επιβίωσης των επιβατών. Αν και πρόκειται για ιστορικά δεδομένα, η πρακτική αξία της ανάλυσης έγκειται στην εκπαίδευση μοντέλων πρόβλεψης, την ανάλυση συμπεριφοράς και την ανάπτυξη ικανοτήτων στην επεξεργασία και ερμηνεία δεδομένων, που είναι κρίσιμες σε πραγματικά επιχειρησιακά περιβάλλοντα.
Το train dataset αποτελείται από 891 εγγραφές και 12 μεταβλητές.
| Μεταβλητή | Περιγραφή | Τύπος | Εύρος | Μονάδα Μέτρησης |
|---|---|---|---|---|
| PassengerId | Αναγνωριστικό Επιβάτη | Αριθμητική | 1 - 891 |
|
| Survived | Κατάφερε να επιβιώσει (ναι/όχι) | Αριθμητική | 0 - 1 |
|
| Pclass | Κατηγορία Εισιτηρίου | Αριθμητική | 1 - 3 |
|
| Name | Όνομα | Κατηγορική | Calic, Mr. Petar, Markoff, Mr. Marin, Kelly, Miss. Anna Katherine “Annie Kate”, Moor, Mrs. (Beila), Douglas, Mr. Walter Donald |
|
| Sex | Φύλλο | Κατηγορική | female, male |
|
| Age | Ηλικία | Αριθμητική | NA - NA | Έτη |
| Sibsp | Αριθμός αδελφών/συζύγου στο πλοίο | Αριθμητική | 0 - 8 |
|
| Parch | Αριθμός γονέων/παιδιών στο πλοίο | Αριθμητική | 0 - 6 |
|
| Ticket | Αριθμός εισιτηρίου | Κατηγορική | 349224, 19928, 19943, 370365, PC 17558 |
|
| Fare | Τιμή εισιτηρίου | Αριθμητική | 0 - 512.3292 | Δολλάρια ($) |
| Cabin | Αριθμός καμπίνας | Κατηγορική | B101, D7, E50, D35, B42 |
|
| Embarked | Λιμάνι επιβίβασης | Κατηγορική | , C, Q, S |
|
Παρατηρούμε πως το dataset έχει κάποια missing values, καθώς στο εύρος των τιμών για τις ηλικίες των επιβατών εμφανίζεται NA. Επιπλέον στην μεταβλητή που δείχνει σε ποιο λιμάνι επιβιβάστηκε ο πελάτης φαίνεται να υπάρχει empty string ““, πριν τους χαρακτηριστικούς τύπους C = Cherbourg, Q = Queenstown και S = Southampton.
Ελλιπείς Τιμές
cat(sum(is.na(train)))
## 177
Διπλότυπες Εγγραφές
cat(sum(duplicated(train)))
## 0
Αφαιρούμε από το dataset τις εγρραφές που έχουν missing values.
train$Embarked[train$Embarked == ""] <- NA
clean_train <- na.omit(train)
| Μεταβλητή | Περιγραφή | Τύπος | Εύρος | Μονάδα Μέτρησης |
|---|---|---|---|---|
| Age | Ηλικία Επιβάτη | Αριθμητική | 0.42 - 80 | Έτη |
| Embarked | Λιμάνι επιβίβασης | Κατηγορική | C, Q, S |
|
## Συνολικές εγγραφές του dataset μετά την αφαίρεση των ελλειπών τιμών: 712
Κατανομή των τιμών της εξαρτημένης μεταβλητής Survived του dataset:
table(clean_train$Survived)
##
## 0 1
## 424 288
baseaccprop <- (288/712)*100
cat(round(baseaccprop, digits = 1))
## 40.4
Σχόλιο
Παρατηρείται πως μόνο οι 288 επιβάτες
από τους 712 κατάφεραν να επιβιώσουν. Έαν λοιπόν προβλέψουμε ότι όλοι οι
επιβάτες του πλοίου σώθηκαν τότε σύμφωνα με την μέθοδο της απλής
βάσης θα πετύχουμε το αποτέλεσμα με ακρίβεια της τάξης του
40.4%. Εφαρμόζοντας τη λογιστική παλινδρόμηση στοχεύουμε στην
καλύτερη ικανότητα αναγνώρισης των διασωθέντων επιβατών, δηλαδή στην
αύξηση του παραπάνω ποσοστού πρόβλεψης.
Μετατρέπουμε όλες τις κατηγορικές μεταβλητές σε factors.
clean_train$Survived <- as.factor(clean_train$Survived)
clean_train$Pclass <- as.factor(clean_train$Pclass)
clean_train$Sex <- as.factor(clean_train$Sex)
clean_train$Cabin <- as.factor(clean_train$Cabin)
clean_train$Embarked <- as.factor(clean_train$Embarked)
Αφαιρούμε από το μοντέλο της ανεξάρτητες μεταβλητές PassengerId, Name και Ticket, καθώς αυτές αποτελούν μοναδικά αναγνωριστικά για κάθε επιβάτη και άρα δεν έχουν κάποια επίδραση στο αποτέλεσμα της πρόβλεψης.
LRmodel <- glm(Survived ~ Pclass + Cabin + Sex + Age + SibSp + Parch + Fare + Embarked, data = clean_train, family = "binomial")
summary(LRmodel)
##
## Call:
## glm(formula = Survived ~ Pclass + Cabin + Sex + Age + SibSp +
## Parch + Fare + Embarked, family = "binomial", data = clean_train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.972e+00 8.258e-01 4.809 1.51e-06 ***
## Pclass2 -7.848e-01 6.233e-01 -1.259 0.208016
## Pclass3 -1.868e+00 6.516e-01 -2.866 0.004153 **
## CabinA10 -1.848e+01 6.523e+03 -0.003 0.997739
## CabinA16 1.709e+01 6.523e+03 0.003 0.997910
## CabinA20 1.964e+01 6.523e+03 0.003 0.997598
## CabinA23 2.128e+01 6.523e+03 0.003 0.997397
## CabinA24 -1.842e+01 6.523e+03 -0.003 0.997747
## CabinA26 1.966e+01 6.523e+03 0.003 0.997595
## CabinA31 1.892e+01 6.523e+03 0.003 0.997685
## CabinA34 1.717e+01 6.523e+03 0.003 0.997900
## CabinA36 -1.758e+01 6.523e+03 -0.003 0.997849
## CabinA5 -1.673e+01 6.523e+03 -0.003 0.997953
## CabinA6 1.870e+01 6.523e+03 0.003 0.997713
## CabinA7 -1.743e+01 6.523e+03 -0.003 0.997868
## CabinB101 1.443e+01 6.523e+03 0.002 0.998234
## CabinB18 1.570e+01 4.425e+03 0.004 0.997169
## CabinB19 -1.681e+01 6.523e+03 -0.003 0.997944
## CabinB20 1.805e+01 3.685e+03 0.005 0.996091
## CabinB22 -1.471e-03 2.620e+00 -0.001 0.999552
## CabinB3 1.525e+01 6.523e+03 0.002 0.998135
## CabinB30 -1.724e+01 6.523e+03 -0.003 0.997891
## CabinB35 1.515e+01 4.612e+03 0.003 0.997379
## CabinB37 -1.732e+01 6.523e+03 -0.003 0.997881
## CabinB38 -1.753e+01 6.523e+03 -0.003 0.997856
## CabinB39 1.528e+01 6.523e+03 0.002 0.998131
## CabinB4 1.649e+01 6.523e+03 0.003 0.997983
## CabinB41 2.000e+01 6.523e+03 0.003 0.997554
## CabinB42 1.566e+01 6.523e+03 0.002 0.998085
## CabinB49 1.714e+01 3.798e+03 0.005 0.996400
## CabinB5 1.425e+01 4.565e+03 0.003 0.997510
## CabinB50 1.854e+01 6.523e+03 0.003 0.997732
## CabinB51 B53 B55 -1.706e+00 2.928e+00 -0.583 0.560082
## CabinB57 B59 B63 B66 1.429e+01 4.610e+03 0.003 0.997527
## CabinB58 B60 -3.002e+00 2.070e+00 -1.451 0.146884
## CabinB69 1.723e+01 6.523e+03 0.003 0.997892
## CabinB71 -1.793e+01 6.523e+03 -0.003 0.997807
## CabinB73 1.563e+01 6.523e+03 0.002 0.998088
## CabinB77 1.577e+01 4.610e+03 0.003 0.997271
## CabinB79 1.501e+01 6.523e+03 0.002 0.998164
## CabinB80 1.613e+01 6.523e+03 0.002 0.998027
## CabinB82 B84 -1.834e+01 6.523e+03 -0.003 0.997756
## CabinB86 -1.941e+01 6.523e+03 -0.003 0.997625
## CabinB94 -1.753e+01 6.523e+03 -0.003 0.997855
## CabinB96 B98 1.747e+01 2.712e+03 0.006 0.994860
## CabinC101 1.813e+01 6.523e+03 0.003 0.997782
## CabinC103 1.758e+01 6.523e+03 0.003 0.997849
## CabinC104 1.991e+01 6.523e+03 0.003 0.997564
## CabinC110 -1.765e+01 6.523e+03 -0.003 0.997841
## CabinC111 -1.867e+01 6.523e+03 -0.003 0.997717
## CabinC118 -1.832e+01 6.523e+03 -0.003 0.997759
## CabinC123 -4.554e-01 1.847e+00 -0.247 0.805228
## CabinC124 -1.752e+01 6.523e+03 -0.003 0.997857
## CabinC125 1.610e+01 4.527e+03 0.004 0.997162
## CabinC126 2.003e+01 6.523e+03 0.003 0.997550
## CabinC148 1.825e+01 6.523e+03 0.003 0.997768
## CabinC2 -1.086e+00 1.920e+00 -0.566 0.571697
## CabinC22 C26 -3.905e+00 1.639e+00 -2.383 0.017163 *
## CabinC23 C25 C27 -1.720e+00 1.952e+00 -0.881 0.378200
## CabinC30 -1.707e+01 6.523e+03 -0.003 0.997911
## CabinC32 1.515e+01 6.523e+03 0.002 0.998147
## CabinC45 1.444e+01 6.523e+03 0.002 0.998234
## CabinC46 -1.792e+01 6.523e+03 -0.003 0.997808
## CabinC49 -2.036e+01 6.523e+03 -0.003 0.997510
## CabinC50 1.661e+01 6.523e+03 0.003 0.997968
## CabinC52 1.878e+01 6.523e+03 0.003 0.997703
## CabinC54 1.503e+01 6.523e+03 0.002 0.998162
## CabinC62 C64 1.397e+01 6.523e+03 0.002 0.998291
## CabinC65 -2.249e+00 1.885e+00 -1.193 0.232749
## CabinC68 -9.526e-01 1.988e+00 -0.479 0.631834
## CabinC7 1.510e+01 6.523e+03 0.002 0.998153
## CabinC70 1.715e+01 6.523e+03 0.003 0.997903
## CabinC78 -1.391e-02 2.227e+00 -0.006 0.995018
## CabinC82 -2.039e+01 6.523e+03 -0.003 0.997506
## CabinC83 -5.286e-01 1.963e+00 -0.269 0.787742
## CabinC85 1.632e+01 6.523e+03 0.003 0.998004
## CabinC86 -1.788e+01 6.523e+03 -0.003 0.997812
## CabinC87 -1.670e+01 6.523e+03 -0.003 0.997957
## CabinC90 1.533e+01 6.523e+03 0.002 0.998125
## CabinC91 -1.896e+01 6.523e+03 -0.003 0.997681
## CabinC92 1.935e+01 6.523e+03 0.003 0.997633
## CabinC93 1.821e+01 3.842e+03 0.005 0.996218
## CabinC99 1.550e+01 6.523e+03 0.002 0.998104
## CabinD 2.058e-01 1.529e+00 0.135 0.892943
## CabinD10 D12 1.783e+01 6.523e+03 0.003 0.997818
## CabinD11 1.729e+01 6.523e+03 0.003 0.997884
## CabinD15 1.548e+01 6.523e+03 0.002 0.998106
## CabinD17 1.713e+01 4.612e+03 0.004 0.997037
## CabinD19 1.973e+01 6.523e+03 0.003 0.997586
## CabinD20 1.699e+01 4.611e+03 0.004 0.997060
## CabinD26 -1.850e+01 4.362e+03 -0.004 0.996617
## CabinD28 1.545e+01 6.523e+03 0.002 0.998110
## CabinD30 -1.852e+01 6.523e+03 -0.003 0.997734
## CabinD33 1.846e+01 3.902e+03 0.005 0.996226
## CabinD35 1.867e+01 4.039e+03 0.005 0.996313
## CabinD36 1.542e+01 4.595e+03 0.003 0.997322
## CabinD37 1.736e+01 6.523e+03 0.003 0.997877
## CabinD46 -1.749e+01 6.523e+03 -0.003 0.997860
## CabinD47 1.574e+01 6.523e+03 0.002 0.998075
## CabinD48 -1.801e+01 6.523e+03 -0.003 0.997797
## CabinD49 1.789e+01 6.523e+03 0.003 0.997812
## CabinD50 -1.680e+01 6.523e+03 -0.003 0.997945
## CabinD56 1.998e+01 6.523e+03 0.003 0.997556
## CabinD6 -1.833e+01 6.523e+03 -0.003 0.997757
## CabinD7 1.788e+01 6.523e+03 0.003 0.997813
## CabinD9 1.533e+01 6.523e+03 0.002 0.998125
## CabinE10 2.100e+01 6.523e+03 0.003 0.997431
## CabinE101 1.713e+01 4.605e+03 0.004 0.997032
## CabinE12 1.975e+01 6.523e+03 0.003 0.997584
## CabinE121 1.902e+01 4.204e+03 0.005 0.996390
## CabinE17 1.990e+01 6.523e+03 0.003 0.997566
## CabinE24 1.930e+01 4.599e+03 0.004 0.996652
## CabinE25 1.917e+01 4.612e+03 0.004 0.996684
## CabinE31 -1.728e+01 6.523e+03 -0.003 0.997886
## CabinE33 1.561e+01 6.523e+03 0.002 0.998091
## CabinE34 1.588e+01 6.523e+03 0.002 0.998057
## CabinE36 1.555e+01 6.523e+03 0.002 0.998098
## CabinE38 -1.655e+01 6.523e+03 -0.003 0.997975
## CabinE40 1.540e+01 6.523e+03 0.002 0.998116
## CabinE44 -6.632e-02 1.967e+00 -0.034 0.973106
## CabinE46 -1.731e+01 6.523e+03 -0.003 0.997882
## CabinE49 1.629e+01 6.523e+03 0.002 0.998008
## CabinE50 1.848e+01 6.523e+03 0.003 0.997739
## CabinE58 -1.742e+01 6.523e+03 -0.003 0.997869
## CabinE63 -1.753e+01 6.523e+03 -0.003 0.997855
## CabinE67 -2.030e-01 2.003e+00 -0.101 0.919259
## CabinE68 1.522e+01 6.523e+03 0.002 0.998139
## CabinE77 -1.867e+01 6.523e+03 -0.003 0.997716
## CabinE8 1.810e+01 3.978e+03 0.005 0.996370
## CabinF G63 -1.564e+01 6.523e+03 -0.002 0.998087
## CabinF G73 -1.662e+01 4.603e+03 -0.004 0.997119
## CabinF2 1.419e+00 1.307e+00 1.086 0.277574
## CabinF33 1.711e+01 3.751e+03 0.005 0.996361
## CabinF4 1.824e+01 3.932e+03 0.005 0.996300
## CabinG6 -8.281e-01 1.084e+00 -0.764 0.444953
## CabinT -1.760e+01 6.523e+03 -0.003 0.997847
## Sexmale -2.655e+00 2.517e-01 -10.547 < 2e-16 ***
## Age -4.868e-02 1.048e-02 -4.643 3.43e-06 ***
## SibSp -5.037e-01 1.508e-01 -3.341 0.000835 ***
## Parch -2.407e-02 1.362e-01 -0.177 0.859708
## Fare 8.820e-03 6.854e-03 1.287 0.198179
## EmbarkedQ -7.944e-01 6.627e-01 -1.199 0.230622
## EmbarkedS -4.011e-01 3.623e-01 -1.107 0.268273
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 960.90 on 711 degrees of freedom
## Residual deviance: 490.18 on 569 degrees of freedom
## AIC: 776.18
##
## Number of Fisher Scoring iterations: 17
Ερμηνεία Συσχετίσεων
Θεωρούμε στατιστικά σημαντικές τις
ανεξάρτητες μεταβλητές που στη στήλη Pr(>|z|) έχουν
τιμές <0.01, δηλαδή αυτές που έχουν τουλάχιστον δύο
** από δίπλα τους.
| Μεταβλητή | Συντελεστής (Estimate) | P-value | Επίδραση |
|---|---|---|---|
| Pclass3 | -1.868e+00 | 0.004153 | Ισχυρή |
| Sexmale | -2.655e+00 | < 2e-16 | Πολύ ισχυρή |
| Age | -4.868e-02 | 3.43e-06 | Αρκετά ισχυρή |
| SibSp | -5.037e-01 | 0.000835 | Ισχυρή |
Παρατηρήσεις:
Εάν το εισιτήριο του επιβάτη ανήκει στην 2η (ή και 3η όπως θα δούμε παρακάτω) κατηγορία, τότε η πιθανότητα επιβίωσης μειώνεται.
Εάν ο επιβάτης είναι άνδρας, τότε η πιθανότητα επιβίωσης μειώνεται.
Όσο μεγαλύτερος είναι ο επιβάτης ηλικιακά, τόσο μικρότερη είναι η πιθανότητα επιβίωσης.
Η ύπαρξη αδελφών ή και συζύγου στο πλοίο μειώνει την πιθανότητα επιβίωσης του επιβάτη.
Με βάση τον παραπάνω πίνακα, έχει νοήμα να κρατήσουμε στο τελικό μοντέλο της λογιστικής παλινδρόμησης τις ανεξάρτητες μεταβλητές Pclass, Sex, Age και SibSp.
LRmodel2 <- glm(Survived ~ Pclass + Sex + Age + SibSp , data = clean_train, family = "binomial")
summary(LRmodel2)
##
## Call:
## glm(formula = Survived ~ Pclass + Sex + Age + SibSp, family = "binomial",
## data = clean_train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.325373 0.450707 9.597 < 2e-16 ***
## Pclass2 -1.406282 0.284836 -4.937 7.93e-07 ***
## Pclass3 -2.644961 0.285906 -9.251 < 2e-16 ***
## Sexmale -2.618972 0.215008 -12.181 < 2e-16 ***
## Age -0.044938 0.008237 -5.456 4.88e-08 ***
## SibSp -0.378564 0.121377 -3.119 0.00182 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 960.90 on 711 degrees of freedom
## Residual deviance: 636.04 on 706 degrees of freedom
## AIC: 648.04
##
## Number of Fisher Scoring iterations: 5
Σχόλιο
Όπως φαίνεται και από τον δείκτη AIC, το
δεύτερο μοντέλο λογιστικής παλινδρόμησης προβλέπει καλύτερα την
πιθανότητα της επιβίωσης.
LRmodel: AIC = 776.18
LRmodel2: AIC = 648.04
test <- read.csv("test.csv")
clean_test <- na.omit(test)
clean_test$Survived <- as.factor(clean_test$Survived)
clean_test$Pclass <- as.factor(clean_test$Pclass)
clean_test$Sex <- as.factor(clean_test$Sex)
predictTest <- predict(LRmodel2, newdata = clean_test, type = "response")
threshold <- 0.5
pred_class <- ifelse(predictTest >= threshold, "Survived", "Died")
pred_class <- factor(pred_class, levels = c("Died", "Survived"))
actual_class <- factor(clean_test$Survived, levels = c(0, 1), labels = c("Died", "Survived"))
conf_mat <- table(Predicted = pred_class, Actual = actual_class)
print(conf_mat)
## Actual
## Predicted Died Survived
## Died 188 10
## Survived 16 117
cat("Accuracy =", sum(diag(conf_mat)) / sum(conf_mat), "\n",
"Sensitivity =", conf_mat["Survived", "Survived"] / sum(conf_mat[, "Survived"]), "\n",
"Specificity =", conf_mat["Died", "Died"] / sum(conf_mat[, "Died"]))
## Accuracy = 0.9214502
## Sensitivity = 0.9212598
## Specificity = 0.9215686
Σχόλιο
Σαφώς πιο βελτιωμένη η
τιμή του Accuracy στο μοντέλο της λογιστικής παλινδρόμησης από την
αντίστοιχη του baseline (0.404).
ROCRpredLR <- prediction(predictTest, clean_test$Survived)
ROCperf <- performance(ROCRpredLR, "tpr", "fpr")
plot(ROCperf, colorize = TRUE, main = "ROC Curve", xlab = "Specificity", ylab = "Sensitivity")
cat("AUC =", as.numeric(performance(ROCRpredLR, "auc")@y.values))
## AUC = 0.9759148
Σχόλιο
Η καμπύλη ROC δείχνει ότι το μοντέλο
λογιστικής παλινδρόμησης έχει πολύ καλή ικανότητα πρόβλεψης των επιβατών
που κατάφεραν να επιβιώσουν. Η τιμή του AUC = 0.9759148
μας δίνει την απόλυτη τιμή της ποιότητας πρόβλεψης, δηλαδή ότι το
μοντέλο προβλέπει με ακρίβεια 97.6%.
numFolds <- trainControl(method = "cv", number=7)
cpGrid <- expand.grid(.cp = seq(0.01,0.47,0.01))
train(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Cabin + Embarked, data=clean_train, method="rpart", trControl=numFolds, tuneGrid=cpGrid)
## CART
##
## 712 samples
## 8 predictor
## 2 classes: '0', '1'
##
## No pre-processing
## Resampling: Cross-Validated (7 fold)
## Summary of sample sizes: 610, 611, 610, 610, 609, 611, ...
## Resampling results across tuning parameters:
##
## cp Accuracy Kappa
## 0.01 0.8060944 0.57757756
## 0.02 0.7963318 0.56460612
## 0.03 0.7794557 0.52728267
## 0.04 0.7738529 0.51819048
## 0.05 0.7795107 0.53450047
## 0.06 0.7795107 0.53450047
## 0.07 0.7795107 0.53450047
## 0.08 0.7795107 0.53450047
## 0.09 0.7795107 0.53450047
## 0.10 0.7795107 0.53450047
## 0.11 0.7795107 0.53450047
## 0.12 0.7795107 0.53450047
## 0.13 0.7795107 0.53450047
## 0.14 0.7795107 0.53450047
## 0.15 0.7795107 0.53450047
## 0.16 0.7795107 0.53450047
## 0.17 0.7795107 0.53450047
## 0.18 0.7795107 0.53450047
## 0.19 0.7795107 0.53450047
## 0.20 0.7795107 0.53450047
## 0.21 0.7795107 0.53450047
## 0.22 0.7795107 0.53450047
## 0.23 0.7795107 0.53450047
## 0.24 0.7795107 0.53450047
## 0.25 0.7795107 0.53450047
## 0.26 0.7795107 0.53450047
## 0.27 0.7795107 0.53450047
## 0.28 0.7795107 0.53450047
## 0.29 0.7795107 0.53450047
## 0.30 0.7795107 0.53450047
## 0.31 0.7795107 0.53450047
## 0.32 0.7795107 0.53450047
## 0.33 0.7795107 0.53450047
## 0.34 0.7795107 0.53450047
## 0.35 0.7795107 0.53450047
## 0.36 0.7795107 0.53450047
## 0.37 0.7795107 0.53450047
## 0.38 0.7795107 0.53450047
## 0.39 0.7795107 0.53450047
## 0.40 0.7795107 0.53450047
## 0.41 0.7795107 0.53450047
## 0.42 0.7795107 0.53450047
## 0.43 0.7795107 0.53450047
## 0.44 0.7153976 0.35681421
## 0.45 0.6291176 0.11449984
## 0.46 0.6291176 0.11449984
## 0.47 0.6067086 0.04476307
##
## Accuracy was used to select the optimal model using the largest value.
## The final value used for the model was cp = 0.01.
Σχόλιο
Η ιδανική τιμή για το cp που προκύπτει
είναι 0.01.
Κρατάμε τις ίδιες 8 ανεξάρτητες μεταβλητές που δώσαμε και στο μοντέλο της λογιστικής παλινδρόμησης.
SurvivedTree <- rpart(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked, data = clean_train, method="class", cp=0.01)
prp(SurvivedTree)
Παρατηρήσεις
Το δέντρο βασίζεται κυρίως στις
μεταβλητές Sex, Age, SibSp, Pclass,
Fare και Parch για να καταλήξει σε απόφαση. Αποφεύγει
την προσθήκη της μεταβλητής Cabin, καθώς σε αρκετές εγγραφές
έχει missing values, αλλά και της Embarked, η οποία έχει λίγες
κατηγορίες (π.χ. S, C, Q) και μικρή επίδραση στο Survived. Κάθε
διαδρομή από τη ρίζα έως ένα φύλλο (0 ή 1) αποτελεί μια πιθανή διαδρομή
απόφασης.
predictTestCart <- predict(SurvivedTree, newdata = clean_test, type = "prob")[, 2]
predictTestCart_class <- predict(SurvivedTree, newdata = clean_test, type = "class")
conf_mat <- table(
Predicted = factor(predictTestCart_class, levels = c(0, 1), labels = c("Died", "Survived")),
Actual = factor(clean_test$Survived, levels = c(0, 1), labels = c("Died", "Survived"))
)
print(conf_mat)
## Actual
## Predicted Died Survived
## Died 198 20
## Survived 6 107
cat("Accuracy =", sum(diag(conf_mat)) / sum(conf_mat), "\n",
"Sensitivity =", conf_mat["Survived", "Survived"] / sum(conf_mat[, "Survived"]), "\n",
"Specificity =", conf_mat["Died", "Died"] / sum(conf_mat[, "Died"]))
## Accuracy = 0.9214502
## Sensitivity = 0.8425197
## Specificity = 0.9705882
Σχόλιο
Η τιμή του Accuracy στο μοντέλο Cart
είναι ίδια με την αντίστοιχη της λογιστικής παλινδρόμησης (0.9214502).
Ωστόσο το μοντέλο Cart προβλέπει 10 παραπάνω True
Negatives και 10 λιγότερα True Positives, από
το μοντέλο της λογιστικής παλινδρόμησης.
ROCRpredCart <- prediction(predictTestCart, clean_test$Survived)
ROCperfCart <- performance(ROCRpredCart, "tpr", "fpr")
plot(ROCperfCart, colorize = TRUE, main = "ROC Curve", xlab = "Specificity", ylab = "Sensitivity")
cat("AUC =", as.numeric(performance(ROCRpredCart, "auc")@y.values))
## AUC = 0.9025012
Σχόλια
Η καμπύλη ROC δείχνει ότι το μοντέλο
Cart έχει αρκετά καλή ικανότητα πρόβλεψης των επιβατών που κατάφεραν να
επιβιώσουν. Η τιμή του AUC = 0.9025012 μας δίνει την
απόλυτη τιμή της ποιότητας πρόβλεψης, δηλαδή ότι το μοντέλο προβλέπει με
ακρίβεια 90.2%.
| Μετρική | Logistic Regression | CART |
|---|---|---|
| Accuracy | 0.9214502 | 0.9214502 |
| AUC (ROC) | 0.9759148 | 0.9025012 |
| Sensitivity | 0.9212598 | 0.8425197 |
| Specificity | 0.9215686 | 0.9705882 |
| Confusion Matrix | Απόλυτα συμμετρικός | Σχετικά συμμετρικός |
Σχολιασμός Αποτελεσμάτων
Και τα δύο μοντέλα έχουν την ίδια ακρίβεια στις προβλέψεις του test set (ίδιο Accuracy / 0.921), γεγονός που δείχνει ότι είναι εξίσου ικανά στο να προβλέπουν σωστά την πιθανότητα επιβίωσης. Ωστόσο, η τιμή αυτή από μόνη της δεν επαρκεί για την πλήρη αξιολόγηση της απόδοσης, ειδικά σε περιπτώσεις ανισορροπίας μεταξύ των κλάσεων.
Το μοντέλο της λογιστικής παλινδρόμησης παρουσιάζει υψηλότερη τιμή AUC, κάτι που δείχνει ότι είναι πιο ικανό να διαχωρίζει τις δύο κλάσεις με βάση τις προβλεπόμενες πιθανότητες. Το μοντέλο Cart από την άλλη, λόγω του διακριτού χαρακτήρα των προβλέψεών του, έχει χαμηλότερη ευελιξία στο διαχωρισμό, με συνέπεια χαμηλότερη AUC.
Το μοντέλο της λογιστικής παλινδρόμησης έχει πιο ισορροπημένες τιμές: Sensitivity = 0.921 και Specificity = 0.922, σε αντίθεση με το μοντέλο CART που παρουσιάζει ελαφρώς πιο συντηρητική συμπεριφορά: Specificity = 0.971 και Sensitivity = 0.843. Αυτό σημαίνει πως το μοντέλο CART είναι πιο αυστηρό στο να προβλέπει την πιθανότητα επιβίωσης, με αποτέλεσμα να μειώνει τα False Positives, αλλά και να αυξάνει τα False Negatives.
Γενικότερα όταν ο στόχος της μελέτης είναι η βέλτιστη διαχωριστική ικανότητα μεταξύ των πιθανών αποτελεσμάτων, τότε το μοντέλο της λογιστικής παλινδρόμησης είναι καλύτερη επιλογή. Από την άλλη αν η ερμηνευσιμότητα είναι πιο σημαντική, τότε το μοντέλο CART προσφέρει απλούστερους και κατανοητούς κανόνες.