Δέντρο απόφασης στο R: Δέντρο ταξινόμησης με παράδειγμα
⚡ Έξυπνη Σύνοψη
Τα Δέντρα Αποφάσεων στο R διαιρούν τα δεδομένα σε κλάδους χρησιμοποιώντας απλούς κανόνες ναι ή όχι, μέχρι κάθε φύλλο να έχει μια κυρίαρχη κλάση. Αυτή η αναλυτική παρουσίαση δημιουργεί, σχεδιάζει, αξιολογεί και συντονίζει ένα δέντρο ταξινόμησης rpart στο σύνολο δεδομένων επιβίωσης του Τιτανικού.

Τι είναι τα Δέντρα Απόφασης;
Αποφάσεις δέντρων είναι ένας ευέλικτος αλγόριθμος Μηχανικής Μάθησης που μπορεί να εκτελέσει εργασίες ταξινόμησης και παλινδρόμησης. Είναι πολύ ισχυροί αλγόριθμοι, ικανοί να προσαρμόσουν σύνθετα σύνολα δεδομένων. Επιπλέον, τα δέντρα αποφάσεων είναι θεμελιώδη συστατικά των τυχαίων δασών, τα οποία συγκαταλέγονται στους πιο ισχυρούς αλγόριθμους Μηχανικής Μάθησης που διατίθενται σήμερα.
Πριν από την κατασκευή ενός δέντρου σε κώδικα, είναι χρήσιμο να γνωρίζουμε πώς ένα δέντρο αποφασίζει πού θα χωριστεί.
Πώς λειτουργεί ένα Δέντρο Αποφάσεων;
Ένα δέντρο αποφάσεων μετατρέπει ένα σύνολο δεδομένων σε ένα διάγραμμα ροής με ερωτήσεις ναι ή όχι, το οποίο αποτελείται από τρία είδη κόμβων: ρίζα διατηρεί κάθε παρατήρηση εκπαίδευσης, μια εσωτερικός κόμβος θέτει μια ερώτηση σχετικά με έναν προγνωστικό παράγοντα και χωρίζει τα δεδομένα σε δύο, και ένα φύλλο σταματάει τη διαίρεση και επιστρέφει την κλάση πλειοψηφίας.
Η ανάπτυξη ακολουθεί μια άπληστη διαδικασία που ονομάζεται αναδρομική δυαδική διαμέριση:
- Αξιολογήστε κάθε υποψήφια ομάδα. Για κάθε προγνωστικό παράγοντα και σημείο αποκοπής, μετρήστε πόσο ακάθαρτες θα είναι οι δύο ομάδες που προκύπτουν.
- Κράτα το καλύτερο. Η διάσπαση που μειώνει περισσότερο την ακαθαρσία γίνεται το ερώτημα που τίθεται σε αυτόν τον κόμβο.
- Επαναλάβετε σε κάθε παιδί μέχρι να το σταματήσει ένας κανόνας ελέγχου: minsplit, minbucket, maxdepth ή cp.
- Κλαδεύω. Στη συνέχεια, το cp κλαδεύει τα κλαδιά που δεν αποδίδουν τον εαυτό τους, γεγονός που εμποδίζει το δέντρο να απομνημονεύσει το σύνολο εκπαίδευσης.
Επειδή κάθε ερώτηση συγκρίνει μια μεταβλητή με ένα όριο, ο αλγόριθμος δεν χρειάζεται ποτέ κλιμάκωση ή εικονική κωδικοποίηση.
Δείκτης Gini έναντι Εντροπίας σε Δέντρα Αποφάσεων
Αυτή η πρόσμειξη μπορεί να μετρηθεί με δύο τρόπους και το rpart σας επιτρέπει να επιλέξετε.
| Κριτήρια | Δείκτης Gini | Εντροπία (Κέρδος Πληροφοριών) |
|---|---|---|
| Τύπος | 1 – άθροισμα των τετραγώνων των αναλογιών των κλάσεων | -άθροισμα του p επί log2(p) |
| Εύρος (δύο κλάσεις) | από 0 έως 0.5 | από 0 έως 1 |
| Υπολογισμός | Ταχύτερα, χωρίς λογάριθμο | Πιο αργό, χρησιμοποιεί λογάριθμους |
| ρύθμιση rpart | Προεπιλογή | parms = λίστα(split = “πληροφορίες”) |
fit_entropy <- rpart(survived~., data = data_train, method = 'class', parms = list(split = "information"))
Στην πράξη, και τα δύο κριτήρια επιλέγουν την ίδια διαίρεση τις περισσότερες φορές, επομένως ο προεπιλεγμένος δείκτης Gini είναι μια ασφαλής επιλογή.
Πλεονεκτήματα και μειονεκτήματα των δέντρων αποφάσεων
Οι συμβιβασμοί σας λένε πότε ένα μόνο δέντρο είναι αρκετό και πότε να μετακινηθείτε σε ένα σύνολο.
Πλεονεκτήματα
- Πλήρως ερμηνεύσιμο: Το προσαρμοσμένο μοντέλο είναι ένα διάγραμμα που μπορεί να διαβάσει οποιοσδήποτε ενδιαφερόμενος.
- Ελάχιστη προεπεξεργασία: Δεν απαιτείται κλιμάκωση ή κανονικοποίηση και οι παράγοντες λειτουργούν εγγενώς.
- Χειρίζεται και τις δύο εργασίες: Η method = 'class' ταιριάζει σε έναν ταξινομητή και η method = 'anova' ταιριάζει σε ένα δέντρο παλινδρόμησης.
- Γρήγορη προπόνηση: Τα μεγάλα σύνολα δεδομένων χωράνε σε δευτερόλεπτα, επομένως τα δέντρα αποτελούν μια χρήσιμη πρώτη γραμμή βάσης.
Μειονεκτήματα
- Υψηλή διακύμανση: Μια μικρή αλλαγή στα δεδομένα εκπαίδευσης μπορεί να παράγει ένα εντελώς διαφορετικό δέντρο.
- Επιρρεπείς σε υπερβολική προσαρμογή: Ένα δέντρο χωρίς περιορισμούς αναπτύσσεται μέχρι κάθε φύλλο να είναι καθαρό, εκτός εάν το cp και το μέγιστο βάθος το περιορίζουν.
- Μόνο παράλληλες διαιρέσεις άξονα: Τα διαγώνια όρια χρειάζονται πολλές τομές σε σχήμα σκάλας.
Η λύση για τις δύο πρώτες αδυναμίες είναι ο μέσος όρος πολλών δέντρων, κάτι που είναι και το τυχαίο δάσος κάνει.
Πώς να εκπαιδεύσετε και να οπτικοποιήσετε ένα δέντρο αποφάσεων στην R
Για να δημιουργήσετε το πρώτο σας δέντρο αποφάσεων σε R, θα ακολουθήσετε επτά βήματα:
- Βήμα 1: Εισαγάγετε τα δεδομένα
- Βήμα 2: Καθαρίστε το σύνολο δεδομένων
- Βήμα 3: Δημιουργία συνόλου τρένου/δοκιμών
- Βήμα 4: Κατασκευάστε το μοντέλο
- Βήμα 5: Κάντε πρόβλεψη
- Βήμα 6: Μετρήστε την απόδοση
- Βήμα 7: Συντονίστε τις υπερπαραμέτρους
Βήμα 1) Εισαγάγετε τα δεδομένα
Αν είστε περίεργοι για την τύχη του Τιτανικού, μπορείτε να παρακολουθήσετε αυτό το βίντεο Youtube. Ο σκοπός αυτού του συνόλου δεδομένων είναι να προβλέψει ποιοι άνθρωποι είναι πιο πιθανό να επιβιώσουν μετά τη σύγκρουση με το παγόβουνο. Το σύνολο δεδομένων περιέχει 13 μεταβλητές και 1309 παρατηρήσεις. Το σύνολο δεδομένων ταξινομείται από τη μεταβλητή X.
set.seed(678) path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv' titanic <-read.csv(path) head(titanic)
Παραγωγή:
## X pclass survived name sex ## 1 1 1 1 Allen, Miss. Elisabeth Walton female ## 2 2 1 1 Allison, Master. Hudson Trevor male ## 3 3 1 0 Allison, Miss. Helen Loraine female ## 4 4 1 0 Allison, Mr. Hudson Joshua Creighton male ## 5 5 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female ## 6 6 1 1 Anderson, Mr. Harry male ## age sibsp parch ticket fare cabin embarked ## 1 29.0000 0 0 24160 211.3375 B5 S ## 2 0.9167 1 2 113781 151.5500 C22 C26 S ## 3 2.0000 1 2 113781 151.5500 C22 C26 S ## 4 30.0000 1 2 113781 151.5500 C22 C26 S ## 5 25.0000 1 2 113781 151.5500 C22 C26 S ## 6 48.0000 0 0 19952 26.5500 E12 S ## home.dest ## 1 St Louis, MO ## 2 Montreal, PQ / Chesterville, ON ## 3 Montreal, PQ / Chesterville, ON ## 4 Montreal, PQ / Chesterville, ON ## 5 Montreal, PQ / Chesterville, ON ## 6 New York, NY
tail(titanic)
Παραγωγή:
## X pclass survived name sex age sibsp ## 1304 1304 3 0 Yousseff, Mr. Gerious male NA 0 ## 1305 1305 3 0 Zabour, Miss. Hileni female 14.5 1 ## 1306 1306 3 0 Zabour, Miss. Thamine female NA 1 ## 1307 1307 3 0 Zakarian, Mr. Mapriededer male 26.5 0 ## 1308 1308 3 0 Zakarian, Mr. Ortin male 27.0 0 ## 1309 1309 3 0 Zimmerman, Mr. Leo male 29.0 0 ## parch ticket fare cabin embarked home.dest ## 1304 0 2627 14.4583 C ## 1305 0 2665 14.4542 C ## 1306 0 2665 14.4542 C ## 1307 0 2656 7.2250 C ## 1308 0 2670 7.2250 C ## 1309 0 315082 7.8750 S
Από την έξοδο της κεφαλής και της ουράς, μπορείτε να παρατηρήσετε ότι τα δεδομένα δεν ανακατεύονται. Αυτό είναι μεγάλο θέμα! Όταν θα χωρίσετε τα δεδομένα σας μεταξύ ενός σετ τρένου και ενός σετ δοκιμής, θα επιλέξετε αποκλειστικά ο επιβάτης από την κατηγορία 1 και 2 (Κανένας επιβάτης από την κατηγορία 3 δεν βρίσκεται στο κορυφαίο 80 τοις εκατό των παρατηρήσεων), που σημαίνει ότι ο αλγόριθμος δεν θα δει ποτέ τα χαρακτηριστικά του επιβάτη της κατηγορίας 3. Αυτό το λάθος θα οδηγήσει σε κακή πρόβλεψη.
Για να ξεπεράσετε αυτό το ζήτημα, μπορείτε να χρησιμοποιήσετε τη συνάρτηση δείγμα ().
shuffle_index <- sample(1:nrow(titanic)) head(shuffle_index)
Δέντρο αποφάσεων Κωδικός R Επεξήγηση
- sample(1:nrow(titanic)): Δημιουργήστε μια τυχαία λίστα ευρετηρίου από το 1 έως το 1309 (δηλ. τον μέγιστο αριθμό σειρών).
Παραγωγή:
## [1] 288 874 1078 633 887 992
Θα χρησιμοποιήσετε αυτό το ευρετήριο για να ανακατέψετε το τιτανικό σύνολο δεδομένων.
titanic <- titanic[shuffle_index, ]
head(titanic)
Παραγωγή:
## X pclass survived ## 288 288 1 0 ## 874 874 3 0 ## 1078 1078 3 1 ## 633 633 3 0 ## 887 887 3 1 ## 992 992 3 1 ## name sex age ## 288 Sutton, Mr. Frederick male 61 ## 874 Humblen, Mr. Adolf Mathias Nicolai Olsen male 42 ## 1078 O'Driscoll, Miss. Bridget female NA ## 633 Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren) female 39 ## 887 Jermyn, Miss. Annie female NA ## 992 Mamee, Mr. Hanna male NA ## sibsp parch ticket fare cabin embarked home.dest## 288 0 0 36963 32.3208 D50 S Haddenfield, NJ ## 874 0 0 348121 7.6500 F G63 S ## 1078 0 0 14311 7.7500 Q ## 633 1 5 347082 31.2750 S Sweden Winnipeg, MN ## 887 0 0 14313 7.7500 Q ## 992 0 0 2677 7.2292 C
Βήμα 2) Καθαρίστε το σύνολο δεδομένων
Αρκετές μεταβλητές περιέχουν τιμές NA. Ο καθαρισμός εκτελείται σε τρία μέρη:
- Αφήστε τις μεταβλητές home.dest, cabin, name, X και ticket
- Δημιουργία μεταβλητών παραγόντων για pclass και surved
- Ρίξτε το ΝΑ
library(dplyr) # Drop variables clean_titanic <- titanic %>% select(-c(home.dest, cabin, name, X, ticket)) %>% #Convert to factor level mutate(pclass = factor(pclass, levels = c(1, 2, 3), labels = c('Upper', 'Middle', 'Lower')), survived = factor(survived, levels = c(0, 1), labels = c('No', 'Yes'))) %>% na.omit() glimpse(clean_titanic)
Code εξήγηση
- Select(-c(home.dest, καμπίνα, όνομα, X, εισιτήριο)): Απόθεση περιττών μεταβλητών
- pclass = factor(pclass, levels = c(1,2,3), labels= c('Upper', 'Middle', 'Lower')): Προσθήκη ετικέτας στη μεταβλητή pclass. Το 1 γίνεται Upper, το 2 γίνεται Middle και το 3 γίνεται Lower
- factor(survived, levels = c(0,1), labels = c('Όχι', 'Ναι')): Προσθέστε ετικέτες στη μεταβλητή που επέζησε. Το 0 γίνεται Όχι και το 1 γίνεται Ναι
- na.omit(): Αφαιρέστε τις παρατηρήσεις NA
Παραγωγή:
## Observations: 1,045 ## Variables: 8 ## $ pclass <fctr> Upper, Lower, Lower, Upper, Middle, Upper, Middle, U... ## $ survived <fctr> No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y... ## $ sex <fctr> male, male, female, female, male, male, female, male... ## $ age <dbl> 61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0, ... ## $ sibsp <int> 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,... ## $ parch <int> 0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,... ## $ fare <dbl> 32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542, ... ## $ embarked <fctr> S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C...
Βήμα 3) Δημιουργήστε σετ τρένου/δοκιμών
Πριν εκπαιδεύσετε το μοντέλο σας, πρέπει να εκτελέσετε δύο βήματα:
- Δημιουργία συνόλου αμαξοστοιχίας και δοκιμής: Εκπαιδεύετε το μοντέλο στο σετ αμαξοστοιχίας και δοκιμάζετε την πρόβλεψη στο σετ δοκιμής (δηλαδή μη ορατά δεδομένα)
- Εγκαταστήστε το rpart.plot από την κονσόλα
Η κοινή πρακτική είναι ο διαχωρισμός των δεδομένων 80/20, το 80 τοις εκατό των δεδομένων χρησιμεύει για την εκπαίδευση του μοντέλου και το 20 τοις εκατό για την πραγματοποίηση προβλέψεων. Πρέπει να δημιουργήσετε δύο ξεχωριστά πλαίσια δεδομένων. Δεν θέλετε να αγγίξετε το σετ δοκιμής μέχρι να ολοκληρώσετε την κατασκευή του μοντέλου σας. Μπορείτε να δημιουργήσετε ένα όνομα συνάρτησης create_train_test() που παίρνει τρία ορίσματα.
create_train_test(df, size = 0.8, train = TRUE) arguments: -df: Dataset used to train the model. -size: Size of the split. By default, 0.8. Numerical value -train: If set to `TRUE`, the function creates the train set, otherwise the test set. Default value sets to `TRUE`. Boolean value.You need to add a Boolean parameter because R does not allow to return two data frames simultaneously.
create_train_test <- function(data, size = 0.8, train = TRUE) { n_row = nrow(data) total_row = size * n_row train_sample <- 1: total_row if (train == TRUE) { return (data[train_sample, ]) } else { return (data[-train_sample, ]) } }
Code εξήγηση
- function(data, size=0.8, train = TRUE): Προσθέστε τα ορίσματα στη συνάρτηση
- n_row = nrow(data): Μετρήστε τον αριθμό των σειρών στο σύνολο δεδομένων
- total_row = size*n_row: Επιστρέψτε την nη σειρά για να δημιουργήσετε το σύνολο τρένου
- train_sample <- 1:total_row: Επιλέξτε την πρώτη σειρά στις ντες σειρές
- if (train ==TRUE){ } else { }: Εάν η συνθήκη οριστεί σε true, επιστρέψτε το σύνολο αμαξοστοιχίας, διαφορετικά το σύνολο δοκιμής.
Μπορείτε να δοκιμάσετε τη λειτουργία σας και να ελέγξετε τη διάσταση.
data_train <- create_train_test(clean_titanic, 0.8, train = TRUE) data_test <- create_train_test(clean_titanic, 0.8, train = FALSE) dim(data_train)
Παραγωγή:
## [1] 836 8
dim(data_test)
Παραγωγή:
## [1] 209 8
Το σύνολο δεδομένων τρένου έχει 836 γραμμές και 8 στήλες, ενώ το σύνολο δεδομένων δοκιμής έχει 209 γραμμές και τις ίδιες 8 στήλες.
Χρησιμοποιείτε τη συνάρτηση prop.table() σε συνδυασμό με την table() για να επαληθεύσετε εάν η διαδικασία τυχαιοποίησης είναι σωστή.
prop.table(table(data_train$survived))
Παραγωγή:
## ## No Yes ## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Παραγωγή:
## ## No Yes ## 0.5789474 0.4210526
Και στα δύο δεδομένα, ο αριθμός των επιζώντων είναι ο ίδιος, περίπου 40 τοις εκατό.
Εγκαταστήστε το rpart.plot
Το rpart.plot δεν είναι διαθέσιμο από τις βιβλιοθήκες conda. Μπορείτε να το εγκαταστήσετε από την κονσόλα:
install.packages("rpart.plot")
Βήμα 4) Κατασκευάστε το μοντέλο
Είστε έτοιμοι να κατασκευάσετε το μοντέλο. Η σύνταξη για τη συνάρτηση δέντρου αποφάσεων rpart() είναι:
rpart(formula, data=, method='') arguments: - formula: The function to predict - data: Specifies the data frame - method: - "class" for a classification tree - "anova" for a regression tree
Χρησιμοποιείτε τη μέθοδο κλάσης επειδή προβλέπετε μια τάξη.
library(rpart) library(rpart.plot) fit <- rpart(survived~., data = data_train, method = 'class') rpart.plot(fit, extra = 106)
Code εξήγηση
- rpart(): Λειτουργία που ταιριάζει στο μοντέλο. Τα επιχειρήματα είναι:
- επέζησε ~.: Formula of the Decision Trees
- data = data_train: Σύνολο δεδομένων
- μέθοδος = 'class': Προσαρμόστε ένα δυαδικό μοντέλο
- rpart.plot(fit, extra= 106): Σχεδιάστε το δέντρο. Το όρισμα extra έχει οριστεί σε 106, το οποίο εμφανίζει την πιθανότητα της δεύτερης κλάσης συν το ποσοστό των παρατηρήσεων σε κάθε κόμβο. Μπορείτε να ανατρέξετε στο βινιέτα για περισσότερες πληροφορίες σχετικά με τις άλλες επιλογές.
Παραγωγή:
Ξεκινάτε από τον κόμβο ρίζας, στην κορυφή του γραφήματος και σε βάθος 0 από 3:
- Στην κορυφή, είναι η συνολική πιθανότητα επιβίωσης. Δείχνει το ποσοστό των επιβατών που επέζησαν από τη συντριβή. Το 41 τοις εκατό των επιβατών επέζησε.
- Αυτός ο κόμβος ρωτάει αν το φύλο του επιβάτη είναι άνδρας. Εάν ναι, τότε κατεβαίνετε στο αριστερό παιδί της ρίζας (βάθος 1). Το 63% είναι άνδρες με πιθανότητα επιβίωσης 21%.
- Στον δεύτερο κόμβο, ρωτάτε αν ο άνδρας επιβάτης είναι άνω των 3.5 ετών. Εάν ναι, τότε η πιθανότητα επιβίωσης είναι 19 τοις εκατό.
- Συνεχίζετε έτσι για να καταλάβετε ποια χαρακτηριστικά επηρεάζουν την πιθανότητα επιβίωσης.
Σημειώστε ότι, μία από τις πολλές ιδιότητες των Decision Trees είναι ότι απαιτούν πολύ λίγη προετοιμασία δεδομένων. Συγκεκριμένα, δεν απαιτούν κλιμάκωση ή κεντράρισμα χαρακτηριστικών.
Από προεπιλογή, η συνάρτηση rpart() χρησιμοποιεί το Gini μέτρο προσμίξεων για την επιλογή κάθε διαχωρισμού. Όσο υψηλότερη είναι η τιμή Gini, τόσο πιο αναμεμειγμένες είναι οι κλάσεις μέσα σε αυτόν τον κόμβο, επομένως ο αλγόριθμος επιλέγει πάντα τη διαχωριστική γραμμή που τη μειώνει περισσότερο.
Βήμα 5) Κάντε μια πρόβλεψη
Μπορείτε να προβλέψετε το σύνολο δεδομένων δοκιμής σας. Για να κάνετε μια πρόβλεψη, μπορείτε να χρησιμοποιήσετε τη συνάρτηση predict(). Η βασική σύνταξη της πρόβλεψης για το δέντρο απόφασης R είναι:
predict(fitted_model, df, type = 'class') arguments: - fitted_model: This is the object stored after model estimation. - df: Data frame used to make the prediction - type: Type of prediction - 'class': for classification - 'prob': to compute the probability of each class - 'vector': Predict the mean response at the node level
Τώρα προβλέπετε, για καθέναν από τους 209 επιβάτες στο σετ δοκιμών, εάν το μοντέλο αναμένει ότι θα επιβιώσουν από τη σύγκρουση.
predict_unseen <-predict(fit, data_test, type = 'class')
Code εξήγηση
- predict(fit, data_test, type = 'class'): Προβλέψτε την κλάση (0/1) του συνόλου δοκιμής
Τώρα συγκρίνετε τις προβλεπόμενες τάξεις με τα πραγματικά αποτελέσματα.
table_mat <- table(data_test$survived, predict_unseen)
table_mat
Code εξήγηση
- table(data_test$survived, predict_unseen): Δημιουργήστε έναν πίνακα συνάφειας των προβλεπόμενων κλάσεων σε σχέση με το πραγματικό αποτέλεσμα
Παραγωγή:
## predict_unseen ## No Yes ## No 106 15 ## Yes 30 58
Οι γραμμές είναι πραγματικές τιμές, οι στήλες είναι προβλέψεις. Το μοντέλο αναγνώρισε σωστά 106 μη επιζώντες και 58 επιζώντες, αλλά χαρακτήρισε 15 μη επιζώντες ως επιζώντες και 30 επιζώντες ως νεκρούς.
Βήμα 6) Μετρήστε την απόδοση
Μπορείτε να υπολογίσετε ένα μέτρο ακρίβειας για την εργασία ταξινόμησης με το μήτρα σύγχυσης:
The μήτρα σύγχυσης είναι μια καλύτερη επιλογή για την αξιολόγηση της απόδοσης της ταξινόμησης. Η γενική ιδέα είναι να μετράμε πόσες φορές τα True instances ταξινομούνται ως False.
Κάθε γραμμή σε έναν πίνακα σύγχυσης αντιπροσωπεύει έναν πραγματικό στόχο, ενώ κάθε στήλη αντιπροσωπεύει έναν προβλεπόμενο στόχο. Η πρώτη γραμμή αυτού του πίνακα λαμβάνει υπόψη τους επιβάτες που πέθαναν (την αρνητική κατηγορία): 106 ταξινομήθηκαν σωστά ως νεκροί (Αληθινό αρνητικό), ενώ 15 ταξινομήθηκαν λανθασμένα ως επιζώντες (Λάθος θετική). Η δεύτερη σειρά περιλαμβάνει τους επιζώντες: 58 ταυτοποιήθηκαν σωστά (Αληθινό θετικό), ενώ 30 χάθηκαν (Εσφαλμένο αρνητικό).
Μπορείτε να υπολογίσετε το τεστ ακρίβειας από τον πίνακα σύγχυσης:
Είναι η αναλογία του αληθινού θετικού και του αληθινού αρνητικού επί του αθροίσματος του πίνακα. Με το R, μπορείτε να κωδικοποιήσετε ως εξής:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Code εξήγηση
- sum(diag(table_mat)): Άθροισμα της διαγωνίου
- sum(table_mat): Άθροισμα του πίνακα.
Μπορείτε να εκτυπώσετε την ακρίβεια του σετ δοκιμής:
print(paste('Accuracy for test', accuracy_Test))
Παραγωγή:
## [1] "Accuracy for test 0.784688995215311"
Η ακρίβεια στο σύνολο δοκιμών είναι 0.7847, δηλαδή 78.47 τοις εκατό. Επαναλάβετε την άσκηση στο σύνολο εκπαίδευσης για να δείτε πόσο υπερπροσαρμόζεται το μοντέλο.
Βήμα 7) Συντονίστε τις υπερ-παραμέτρους
Το δέντρο απόφασης στο R έχει διάφορες παραμέτρους που ελέγχουν πτυχές της προσαρμογής. Στη βιβλιοθήκη δένδρων αποφάσεων rpart, μπορείτε να ελέγξετε τις παραμέτρους χρησιμοποιώντας τη συνάρτηση rpart.control(). Στον παρακάτω κώδικα εισάγετε τις παραμέτρους που θα συντονίσετε. Μπορείτε να ανατρέξετε στο βινιέτα για άλλες παραμέτρους.
rpart.control(minsplit = 20, minbucket = round(minsplit/3), maxdepth = 30) Arguments: -minsplit: Set the minimum number of observations in the node before the algorithm perform a split -minbucket: Set the minimum number of observations in a terminal node, i.e. the leaf -maxdepth: Set the maximum depth of any node of the final tree. The root node is treated as depth 0
Θα προχωρήσουμε ως εξής:
- Κατασκευάστε συνάρτηση για απόδοση ακρίβειας
- Συντονίστε το μέγιστο βάθος
- Συντονίστε τον ελάχιστο αριθμό δειγμάτων που πρέπει να έχει ένας κόμβος για να μπορέσει να διαχωριστεί
- Συντονίστε τον ελάχιστο αριθμό δείγματος που πρέπει να έχει ένας κόμβος φύλλου
Μπορείτε να γράψετε μια συνάρτηση για την εμφάνιση της ακρίβειας. Απλώς αναδιπλώνετε τον κώδικα που χρησιμοποιούσατε πριν:
- predict: predict_unseen <- predict(fit, data_test, type = 'class')
- Παραγωγή πίνακα: table_mat <- table(data_test$survived, predict_unseen)
- Υπολογισμός ακρίβειας: accuracy_Test <- sum(diag(table_mat))/sum(table_mat)
accuracy_tune <- function(fit) { predict_unseen <- predict(fit, data_test, type = 'class') table_mat <- table(data_test$survived, predict_unseen) accuracy_Test <- sum(diag(table_mat)) / sum(table_mat) accuracy_Test }
Τώρα ρυθμίστε τις παραμέτρους και δείτε αν μπορείτε να βελτιώσετε το προεπιλεγμένο μοντέλο. Υπενθυμίζεται ότι πρέπει να ξεπεράσετε την ακρίβεια του 0.7847.
control <- rpart.control(minsplit = 4,
minbucket = round(5 / 3),
maxdepth = 3,
cp = 0)
tune_fit <- rpart(survived~., data = data_train, method = 'class', control = control)
accuracy_tune(tune_fit)
Παραγωγή:
## [1] 0.7990431
Με την ακόλουθη παράμετρο:
minsplit = 4
minbucket = round(5/3)
maxdepth = 3
cp = 0
Η ακρίβεια αυξάνεται από 0.7847 σε 0.7990, επομένως το συντονισμένο δέντρο ξεπερνά την προεπιλεγμένη διαμόρφωση κατά περίπου 1.4 ποσοστιαίες μονάδες.
Δέντρα Αποφάσεων στην R: Γρήγορη Αναφορά Συναρτήσεων
Ο παρακάτω πίνακας παραθέτει κάθε συνάρτηση που χρησιμοποιείται στα επτά παραπάνω βήματα, μαζί με το πακέτο που την παρέχει και τις παραμέτρους που αναμένει. R.
| Βιβλιοθήκη | Σκοπός | Λειτουργία | Τάξη | Παράμετροι | Λεπτομέρειες |
|---|---|---|---|---|---|
| το μέρος | Δέντρο ταξινόμησης τρένων στο R | rpart() | τάξη | τύπος, df, μέθοδος | |
| το μέρος | Δέντρο παλινδρόμησης τρένου | rpart() | anova | τύπος, df, μέθοδος | |
| το μέρος | Οικόπεδο τα δέντρα | rpart.plot() | προσαρμοσμένο μοντέλο | ||
| βάση | προβλέψει | προλέγω() | τάξη | τοποθετημένο μοντέλο, τύπος | |
| βάση | προβλέψει | προλέγω() | prob | τοποθετημένο μοντέλο, τύπος | |
| βάση | προβλέψει | προλέγω() | διάνυσμα | τοποθετημένο μοντέλο, τύπος | |
| το μέρος | Παράμετροι ελέγχου | rpart.control() | minsplit | Ορίστε τον ελάχιστο αριθμό παρατηρήσεων στον κόμβο πριν ο αλγόριθμος εκτελέσει μια διαίρεση | |
| Minbucket | Ορίστε τον ελάχιστο αριθμό παρατηρήσεων σε έναν τερματικό κόμβο, δηλαδή το φύλλο | ||||
| μέγιστο βάθος | Ορίστε το μέγιστο βάθος οποιουδήποτε κόμβου του τελικού δέντρου. Ο κόμβος ρίζας αντιμετωπίζεται ως βάθος 0. | ||||
| το μέρος | Μοντέλο αμαξοστοιχίας με παράμετρο ελέγχου | rpart() | τύπος, df, μέθοδος, έλεγχος |
Σημείωση : Εκπαιδεύστε το μοντέλο σε δεδομένα εκπαίδευσης και δοκιμάστε την απόδοση σε ένα μη εμφανές σύνολο δεδομένων, δηλαδή σετ δοκιμής.



