Τυχαίο Δάσος σε R Tutorial: Αλγόριθμος με Παράδειγμα
⚡ Έξυπνη Σύνοψη
Το Random Forest σε R δημιουργεί εκατοντάδες δέντρα αποφάσεων σε δείγματα με bootstrap και υπολογίζει τον μέσο όρο των ψήφων τους σε μία ισχυρή πρόβλεψη. Αυτή η αναλυτική παρουσίαση συντονίζει το mtry, τους maxnodes και το ntree με το caret και αξιολογεί το τελικό μοντέλο με βάση τα δεδομένα επιβίωσης του Τιτανικού.

Τι είναι το Random Forest στο R;
Τα τυχαία δάση βασίζονται σε μια απλή ιδέα: «τη σοφία του πλήθους». Το άθροισμα των αποτελεσμάτων πολλαπλών προβλέψεων δίνει καλύτερη πρόβλεψη από τον καλύτερο μεμονωμένο προγνωστικό παράγοντα. Μια ομάδα προβλέψεων ονομάζεται an μαζί. Έτσι, αυτή η τεχνική ονομάζεται Εκμάθηση συνόλου.
Σε ένα προηγούμενο σεμινάριο, μάθατε πώς να χρησιμοποιείτε δέντρα αποφάσεων για να κάνετε μια δυαδική πρόβλεψη. Για να βελτιώσουμε την τεχνική μας, μπορούμε να εκπαιδεύσουμε μια ομάδα Ταξινομητές δένδρων αποφάσεων, το καθένα σε ένα διαφορετικό τυχαίο υποσύνολο του συνόλου τρένων. Για να κάνετε μια πρόβλεψη, συλλέγετε τις προβλέψεις όλων των μεμονωμένων δέντρων και επιστρέφετε την κλάση που λαμβάνει τις περισσότερες ψήφους. Αυτή η τεχνική ονομάζεται Τυχαίο Δάσος.
Πριν γράψετε οποιονδήποτε κώδικα, είναι χρήσιμο να δείτε ακριβώς πώς συναρμολογείται το σύμπλεγμα από αυτά τα μεμονωμένα δέντρα.
Πώς λειτουργεί το Random Forest στην R;
Η κατανόηση των μηχανισμών καθιστά ευκολότερη τη συλλογιστική για κάθε παράμετρο ρύθμισης. Ένα τυχαίο δάσος κατασκευάζεται σε τέσσερα στάδια.
- Bootstrap δειγματοληψίας. Ο αλγόριθμος σχεδιάζει ένα τυχαίο δείγμα γραμμών με αντικατάσταση από το σύνολο εκπαίδευσης για κάθε δέντρο. Περίπου το ένα τρίτο των γραμμών αφήνεται εκτός κάθε δείγματος. αυτές είναι οι παρατηρήσεις εκτός τσάντας (OOB).
- Τυχαία επιλογή χαρακτηριστικών. Σε κάθε διαίρεση, λαμβάνεται υπόψη μόνο ένα τυχαίο υποσύνολο προγνωστικών. Το μέγεθος αυτού του υποσυνόλου είναι το μέτρο παράμετρος. Ο περιορισμός της επιλογής είναι αυτό που εμποδίζει όλα τα δέντρα να μοιάζουν.
- Ακλάδευτη ανάπτυξη δέντρων. Κάθε δέντρο μεγαλώνει μέχρι να σταματήσειping κανόνας όπως maxnodes or μέγεθος κόμβουΕπιτρέπεται σκόπιμα σε μεμονωμένα δέντρα να υπερπροσαρμοστούν, επειδή τα σφάλματά τους δεν συσχετίζονται.
- Συσσωμάτωση. Για την ταξινόμηση, το δάσος επιστρέφει την κλάση με τις περισσότερες ψήφους. Για την παλινδρόμηση επιστρέφει τη μέση πρόβλεψη. Αυτό το βήμα υπολογισμού μέσου όρου είναι αυτό που χρησιμοποιείται ως όρος. σακκόπανο (συγκεντρωτική μέθοδος bootstrap) περιγράφει.
Η δειγματοληψία γραμμών συν δειγματοληψία στηλών είναι όλο το κόλπο. Ένα μόνο βαθύ δέντρο έχει χαμηλή μεροληψία και πολύ υψηλή διακύμανση. Ο μέσος όρος εκατοντάδων από αυτά διατηρεί τη χαμηλή μεροληψία ενώ μειώνει τη διακύμανση.
Σφάλμα "εκτός αποσκευής". Επειδή κάθε παρατήρηση εξαιρείται από περίπου το ένα τρίτο των δέντρων, η R μπορεί να βαθμολογήσει κάθε γραμμή χρησιμοποιώντας μόνο τα δέντρα που δεν την είδαν ποτέ. Το σφάλμα OOB που προκύπτει είναι μια ελεύθερη, ενσωματωμένη εκτίμηση επικύρωσης που εκτυπώνεται από την randomForest():
rf_oob <- randomForest(survived~., data = data_train, ntree = 800, mtry = 4) print(rf_oob) # reports the OOB estimate of error rate
Το σφάλμα OOB είναι ένας βολικός γρήγορος έλεγχος, αλλά αυτό το σεμινάριο χρησιμοποιεί δεκαπλάσια διασταυρούμενη επικύρωση μέσω του κέρσορα, έτσι ώστε κάθε πλέγμα συντονισμού να συγκρίνεται σε πανομοιότυπες πτυχές.
Τυχαίο Δάσος vs Δέντρο Αποφάσεων σε R
Ένα τυχαίο δάσος είναι ένα σύνολο του ίδιου δέντρα αποφάσεων καλύφθηκαν στο προηγούμενο σεμινάριο, επομένως αξίζει να αναφερθούν ξεκάθαρα οι διαφορές πριν επιλέξετε μεταξύ τους.
| Κριτήρια | Δέντρο απόφασης | Τυχαίο Δάσος |
|---|---|---|
| Structure | Ένα δέντρο | Εκατοντάδες δέντρα μαζί με ψηφοφορία |
| Διαφορά | Υψηλό, πολύ ευαίσθητο στο δείγμα εκπαίδευσης | Χαμηλή, η μέση τιμή ακυρώνει μεμονωμένα σφάλματα |
| Κίνδυνος υπερπροσαρμογής | Υψηλό εκτός αν κλαδευτεί | Χαμηλό ακόμη και με ακλάδευτα δέντρα |
| Ερμηνευσιμότητα | Πλήρως αναγνώσιμο ως διάγραμμα ροής | Μόνο η μεταβλητή σημασία είναι ευανάγνωστη |
| Κόστος εκπαίδευσης | Πολύ γρήγορα | Ανάλογο με το ntree |
| Ενσωματωμένη επικύρωση | Ν/Α | Εκτίμηση σφάλματος εκτός αποσκευής |
| Συνάρτηση R | rpart() | randomForest() |
Επιλέξτε ένα μόνο δέντρο όταν πρέπει να εξηγήσετε τη διαδρομή λήψης απόφασης σε ένα μη τεχνικό κοινό. Επιλέξτε ένα σύμπλεγμα δομών όταν η προγνωστική ακρίβεια έχει μεγαλύτερη σημασία από ένα ευανάγνωστο διάγραμμα.
Πλεονεκτήματα και μειονεκτήματα του Random Forest
Γνωρίζοντας πού είναι ισχυρός και πού αδύναμος ο αλγόριθμος, καταλαβαίνετε πότε αξίζει να καταβάλετε την επόμενη προσπάθεια συντονισμού.
Πλεονεκτήματα
- Ακρίβεια χωρίς κλάδεμα: Η μέτρηση του μέσου όρου πολλών μη συσχετισμένων δέντρων προσφέρει ισχυρά αποτελέσματα με πολύ μικρή χειροκίνητη ρύθμιση.
- Ανθεκτικό στην υπερφόρτωση: Η προσθήκη περισσότερων δέντρων δεν αυξάνει ποτέ το σφάλμα γενίκευσης, επομένως το ntree μπορεί να δημιουργηθεί με ασφάλεια.
- Χειρίζεται μικτά δεδομένα: Οι αριθμητικοί και οι παράγοντες πρόβλεψης λειτουργούν παράλληλα και η κλιμάκωση δεν είναι απαραίτητη.
- Δωρεάν επικύρωση και κατάταξη: Το σφάλμα OOB και η varImp() δεν έχουν επιπλέον υπολογιστικό κόστος.
Μειονεκτήματα
- Αδιαφανείς προβλέψεις: δεν μπορείς tracμια ενιαία διαδρομή λήψης αποφάσεων, η οποία έχει σημασία σε ρυθμιζόμενα περιβάλλοντα.
- Αργή κίνηση σε μεγάλα δάση: Η χρονική κλίμακα εκπαίδευσης και πρόβλεψης είναι γραμμική με τον αριθμό των δέντρων.
- Βαθμολογίες μεροληπτικής σπουδαιότητας: Οι κατηγορικές μεταβλητές με πολλά επίπεδα μπορεί να φαίνονται πιο σημαντικές από ό,τι είναι στην πραγματικότητα.
- Αδύναμη παρέκταση: Για την παλινδρόμηση, το δάσος δεν μπορεί ποτέ να προβλέψει εκτός του εύρους που παρατηρείται στην εκπαίδευση.
Αφού διευθετηθούν η θεωρία και οι συμβιβασμοί, τα επόμενα έξι βήματα αφορούν την κατασκευή, τη ρύθμιση και την αξιολόγηση ενός τυχαίου δάσους από άκρη σε άκρη στο σύνολο δεδομένων επιβίωσης του Τιτανικού.
Βήμα 1) Εισαγάγετε τα δεδομένα
Για να βεβαιωθείτε ότι έχετε το ίδιο σύνολο δεδομένων όπως στον οδηγό για δέντρα αποφάσεων, το σετ τρένων και το σετ δοκιμών φιλοξενούνται στο διαδίκτυο. Μπορείτε να τα εισαγάγετε χωρίς να κάνετε καμία αλλαγή.
library(dplyr) data_train <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/train.csv") glimpse(data_train) data_test <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv") glimpse(data_test)
Βήμα 2) Εκπαιδεύστε το μοντέλο
Ένας τρόπος για να αξιολογήσετε την απόδοση ενός μοντέλου είναι να το εκπαιδεύσετε σε έναν αριθμό διαφορετικών μικρότερων συνόλων δεδομένων και να τα αξιολογήσετε σε σχέση με το άλλο μικρότερο σύνολο δοκιμών. Αυτό ονομάζεται διασταυρούμενη επικύρωση k-fold. R έχει μια συνάρτηση που χωρίζει τυχαία τα δεδομένα σε k υποσύνολα σχεδόν του ίδιου μεγέθους. Για παράδειγμα, εάν k = 10, το μοντέλο εκπαιδεύεται σε εννέα πτυχώσεις και αξιολογείται στην υπόλοιπη πτυχή. Αυτή η διαδικασία επαναλαμβάνεται μέχρι να αξιολογηθούν όλα τα υποσύνολα. Αυτή η τεχνική χρησιμοποιείται ευρέως για την επιλογή μοντέλου, ειδικά όταν το μοντέλο έχει παραμέτρους προς ρύθμιση.
Τώρα που έχουμε έναν τρόπο να αξιολογήσουμε το μοντέλο μας, πρέπει να αποφασίσουμε ποιες παράμετροι γενικεύονται καλύτερα σε μη ορατά δεδομένα.
Το Random Forest επιλέγει ένα τυχαίο υποσύνολο χαρακτηριστικών και δημιουργεί πολλά Δέντρα Απόφασης. Το μοντέλο υπολογίζει τον μέσο όρο όλων των προβλέψεων των δέντρων αποφάσεων.
Το τυχαίο δάσος έχει ορισμένες παραμέτρους που μπορούν να αλλάξουν για να βελτιωθεί η γενίκευση της πρόβλεψης. Θα χρησιμοποιήσετε τη συνάρτηση randomForest() για να εκπαιδεύσετε το μοντέλο.
Η σύνταξη για την randomForest() είναι:
randomForest(formula, ntree=n, mtry=FALSE, maxnodes = NULL) Arguments: - Formula: Formula of the fitted model - ntree: number of trees in the forest - mtry: Number of candidate variables drawn at each split. By default, it is the square root of the number of predictors for classification. - maxnodes: Set the maximum number of terminal nodes each tree can have - importance=TRUE: Whether independent variables importance in the random forest be assessed
Σημείωση: Το τυχαίο δάσος μπορεί να εκπαιδευτεί σε περισσότερες παραμέτρους. Μπορείτε να ανατρέξετε στο βινιέτα για να δείτε τις διάφορες παραμέτρους.
Η ρύθμιση ενός μοντέλου είναι κουραστική δουλειά. Υπάρχουν πολλοί πιθανοί συνδυασμοί παραμέτρων. Δεν έχετε απαραίτητα τον χρόνο να τους δοκιμάσετε όλους. Μια καλή εναλλακτική λύση είναι να αφήσετε το μηχάνημα να βρει τον καλύτερο συνδυασμό για εσάς. Υπάρχουν δύο διαθέσιμες μέθοδοι:
- Τυχαία αναζήτηση
- Αναζήτηση δικτύου
Και οι δύο μέθοδοι ορίζονται παρακάτω, αλλά αυτό το σεμινάριο εκπαιδεύει το μοντέλο χρησιμοποιώντας αναζήτηση πλέγματος.
Ορισμός αναζήτησης πλέγματος
Η μέθοδος αναζήτησης πλέγματος είναι απλή, το μοντέλο θα αξιολογηθεί σε όλο τον συνδυασμό που περνάτε στη συνάρτηση, χρησιμοποιώντας διασταυρούμενη επικύρωση.
Για παράδειγμα, θέλετε να δοκιμάσετε το μοντέλο με 10, 20, 30 αριθμούς δέντρων και κάθε δέντρο θα δοκιμαστεί σε έναν αριθμό mtry ίσο με 1, 2, 3, 4, 5. Στη συνέχεια, το μηχάνημα θα δοκιμάσει 15 διαφορετικά μοντέλα:
.mtry ntrees 1 1 10 2 2 10 3 3 10 4 4 10 5 5 10 6 1 20 7 2 20 8 3 20 9 4 20 10 5 20 11 1 30 12 2 30 13 3 30 14 4 30 15 5 30
Ο αλγόριθμος θα αξιολογήσει:
randomForest(formula, ntree=10, mtry=1) randomForest(formula, ntree=10, mtry=2) randomForest(formula, ntree=10, mtry=3) randomForest(formula, ntree=20, mtry=2) ...
Κάθε συνδυασμός αξιολογείται με διασταυρούμενη επικύρωση. Το μειονέκτημα της αναζήτησης πλέγματος είναι ο αριθμός των πειραμάτων: αυξάνεται εκρηκτικά όταν ο αριθμός των συνδυασμών είναι υψηλός. Για να ξεπεράσετε αυτό το πρόβλημα, μπορείτε να χρησιμοποιήσετε τυχαία αναζήτηση.
Ορισμός τυχαίας αναζήτησης
Η μεγάλη διαφορά μεταξύ της τυχαίας αναζήτησης και της αναζήτησης σε πλέγμα είναι ότι η τυχαία αναζήτηση δεν θα αξιολογήσει όλους τους συνδυασμούς υπερπαραμέτρων στον χώρο αναζήτησης. Αντίθετα, θα επιλέξει τυχαία τον συνδυασμό σε κάθε επανάληψη. Το πλεονέκτημα είναι το πολύ χαμηλότερο υπολογιστικό κόστος.
Ρυθμίστε την παράμετρο ελέγχου
Θα προχωρήσετε ως εξής για την κατασκευή και αξιολόγηση του μοντέλου:
- Αξιολογήστε το μοντέλο με την προεπιλεγμένη ρύθμιση
- Βρείτε τον καλύτερο αριθμό mtry
- Βρείτε τον καλύτερο αριθμό maxnodes
- Βρείτε τον καλύτερο αριθμό δέντρων
- Αξιολογήστε το μοντέλο στο σύνολο δεδομένων δοκιμής
Πριν ξεκινήσετε με την εξερεύνηση παραμέτρων, πρέπει να εγκαταστήσετε δύο βιβλιοθήκες.
- caret: βιβλιοθήκη μηχανικής εκμάθησης R. Εάν έχετε εγκαταστήστε το R με r-ουσιώδη. Βρίσκεται ήδη στη βιβλιοθήκη
- ανακόνδας: conda install -cr r-caret
- e1071: Βιβλιοθήκη μηχανικής εκμάθησης R.
- ανακόνδας: conda install -cr r-e1071
Μπορείτε να τα εισαγάγετε μαζί με το randomForest:
library(randomForest) library(caret) library(e1071)
Προεπιλεγμένη ρύθμιση
Η διασταυρούμενη επικύρωση K-fold ελέγχεται από τη συνάρτηση trainControl().
trainControl(method = "cv", number = n, search ="grid") arguments - method = "cv": The method used to resample the dataset. - number = n: Number of folds to create - search = "grid": Use the grid search method. For the randomized method, use "random" Note: You can refer to the vignette to see the other arguments of the function.
Μπορείτε να δοκιμάσετε να εκτελέσετε το μοντέλο με τις προεπιλεγμένες παραμέτρους και να δείτε τη βαθμολογία ακρίβειας.
Σημείωση: Θα χρησιμοποιήσετε τα ίδια χειριστήρια σε όλο το σεμινάριο.
# Define the control trControl <- trainControl(method = "cv", number = 10, search = "grid")
Θα χρησιμοποιήσετε τη βιβλιοθήκη caret για να αξιολογήσετε το μοντέλο σας. Η βιβλιοθήκη έχει μια λειτουργία που ονομάζεται train() για την αξιολόγηση σχεδόν όλων μάθηση μηχανής αλγόριθμος. Πείτε διαφορετικά, μπορείτε να χρησιμοποιήσετε αυτήν τη συνάρτηση για να εκπαιδεύσετε άλλους αλγόριθμους.
Η βασική σύνταξη είναι:
train(formula, df, method = "rf", metric= "Accuracy", trControl = trainControl(), tuneGrid = NULL) argument - `formula`: Define the formula of the algorithm - `method`: Define which model to train. Note, at the end of the tutorial, there is a list of all the models that can be trained - `metric` = "Accuracy": Define how to select the optimal model - `trControl = trainControl()`: Define the control parameters - `tuneGrid = NULL`: Return a data frame with all the possible combination
Ας κατασκευάσουμε το μοντέλο με τις προεπιλεγμένες τιμές.
set.seed(1234) # Run the model rf_default <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", trControl = trControl) # Print the results print(rf_default)
Code εξήγηση
- trainControl(method=”cv”, number=10, search=”grid”): Αξιολόγηση του μοντέλου με αναζήτηση πλέγματος σε 10 φορές
- τρένο (…): Εκπαιδεύστε ένα τυχαίο μοντέλο δάσους. Καλυτερα μοντέλο επιλέγεται με το μέτρο ακρίβειας.
Παραγωγή:
## Random Forest ## ## 836 samples ## 7 predictor ## 2 classes: 'No', 'Yes' ## ## No pre-processing ## Resampling: Cross-Validated (10 fold) ## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... ## Resampling results across tuning parameters: ## ## mtry Accuracy Kappa ## 2 0.7919248 0.5536486 ## 6 0.7811245 0.5391611 ## 10 0.7572002 0.4939620 ## ## Accuracy was used to select the optimal model using the largest value. ## The final value used for the model was mtry = 2.
Ο αλγόριθμος χρησιμοποιεί 500 δέντρα και δοκίμασε τρεις διαφορετικές τιμές του mtry: 2, 6, 10.
Η τελική τιμή που χρησιμοποιήθηκε για το μοντέλο ήταν mtry = 2, με ακρίβεια διασταυρούμενης επικύρωσης 0.792. Ας προσπαθήσουμε να λάβουμε υψηλότερη βαθμολογία.
Αναζητήστε το καλύτερο μέτρο
Μπορείτε να δοκιμάσετε το μοντέλο με τιμές mtry από 1 έως 10
set.seed(1234) tuneGrid <- expand.grid(.mtry = c(1: 10)) rf_mtry <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, ntree = 300) print(rf_mtry)
Code εξήγηση
- tuneGrid <- expand.grid(.mtry = c(1:10)): Κατασκευάστε ένα διάνυσμα με τιμές από 1 έως 10
Παραγωγή:
## Random Forest ## ## 836 samples ## 7 predictor ## 2 classes: 'No', 'Yes' ## ## No pre-processing ## Resampling: Cross-Validated (10 fold) ## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... ## Resampling results across tuning parameters: ## ## mtry Accuracy Kappa ## 1 0.7572576 0.4647368 ## 2 0.7979346 0.5662364 ## 3 0.8075158 0.5884815 ## 4 0.8110729 0.5970664 ## 5 0.8074727 0.5900030 ## 6 0.8099111 0.5949342 ## 7 0.8050918 0.5866415 ## 8 0.8050918 0.5855399 ## 9 0.8050631 0.5855035 ## 10 0.7978916 0.5707336 ## ## Accuracy was used to select the optimal model using the largest value. ## The final value used for the model was mtry = 4.
Η καλύτερη τιμή του mtry είναι 4. Αποθηκεύεται σε:
rf_mtry$bestTune$mtry
Μπορείτε να το αποθηκεύσετε και να το χρησιμοποιήσετε όταν χρειάζεται να συντονίσετε τις υπόλοιπες παραμέτρους.
max(rf_mtry$results$Accuracy)
Παραγωγή:
## [1] 0.8110729
best_mtry <- rf_mtry$bestTune$mtry best_mtry
Παραγωγή:
## [1] 4
Βήμα 3) Αναζήτηση των καλύτερων maxnodes
Πρέπει να δημιουργήσετε έναν βρόχο για να αξιολογήσετε τις διαφορετικές τιμές των maxnodes. Στον παρακάτω κώδικα, θα:
- Δημιουργήστε μια λίστα
- Δημιουργήστε μια μεταβλητή με την καλύτερη τιμή της παραμέτρου mtry; Υποχρεωτικός
- Δημιουργήστε τον βρόχο
- Αποθηκεύστε την τρέχουσα τιμή του maxnode
- Συνοψίστε τα αποτελέσματα
store_maxnode <- list() tuneGrid <- expand.grid(.mtry = best_mtry) for (maxnodes in c(5: 15)) { set.seed(1234) rf_maxnode <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, maxnodes = maxnodes, ntree = 300) current_iteration <- toString(maxnodes) store_maxnode[[current_iteration]] <- rf_maxnode } results_mtry <- resamples(store_maxnode) summary(results_mtry)
Code εξήγηση:
- store_maxnode <- list(): Τα αποτελέσματα του μοντέλου θα αποθηκευτούν σε αυτή τη λίστα
- expand.grid(.mtry=best_mtry): Χρησιμοποιήστε την καλύτερη τιμή του mtry
- for (maxnodes in c(5:15)) { … }: Υπολογίστε το μοντέλο με τιμές maxnodes από 5 έως 15.
- maxnodes = maxnodes: Για κάθε επανάληψη, το maxnodes ισούται με την τρέχουσα τιμή βρόχου, δηλαδή 5, 6, 7, …
- current_iteration <- toString(maxnodes): Αποθηκεύει την τιμή των maxnodes ως συμβολοσειρά.
- store_maxnode[[current_iteration]] <- rf_maxnode: Αποθηκεύει το αποτέλεσμα του μοντέλου στη λίστα.
- resamples(store_maxnode): Τακτοποιήστε τα αποτελέσματα του μοντέλου
- summary(results_mtry): Εκτυπώστε τη σύνοψη όλου του συνδυασμού.
Παραγωγή:
## ## Call: ## summary.resamples(object = results_mtry) ## ## Models: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 ## Number of resamples: 10 ## ## Accuracy ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 5 0.6785714 0.7529762 0.7903758 0.7799771 0.8168388 0.8433735 0 ## 6 0.6904762 0.7648810 0.7784710 0.7811962 0.8125000 0.8313253 0 ## 7 0.6904762 0.7619048 0.7738095 0.7788009 0.8102410 0.8333333 0 ## 8 0.6904762 0.7627295 0.7844234 0.7847820 0.8184524 0.8433735 0 ## 9 0.7261905 0.7747418 0.8083764 0.7955250 0.8258749 0.8333333 0 ## 10 0.6904762 0.7837780 0.7904475 0.7895869 0.8214286 0.8433735 0 ## 11 0.7023810 0.7791523 0.8024240 0.7943775 0.8184524 0.8433735 0 ## 12 0.7380952 0.7910929 0.8144005 0.8051205 0.8288511 0.8452381 0 ## 13 0.7142857 0.8005952 0.8192771 0.8075158 0.8403614 0.8452381 0 ## 14 0.7380952 0.7941050 0.8203528 0.8098967 0.8403614 0.8452381 0 ## 15 0.7142857 0.8000215 0.8203528 0.8075301 0.8378873 0.8554217 0 ## ## Kappa ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 5 0.3297872 0.4640436 0.5459706 0.5270773 0.6068751 0.6717371 0 ## 6 0.3576471 0.4981484 0.5248805 0.5366310 0.6031287 0.6480921 0 ## 7 0.3576471 0.4927448 0.5192771 0.5297159 0.5996437 0.6508314 0 ## 8 0.3576471 0.4848320 0.5408159 0.5427127 0.6200253 0.6717371 0 ## 9 0.4236277 0.5074421 0.5859472 0.5601687 0.6228626 0.6480921 0 ## 10 0.3576471 0.5255698 0.5527057 0.5497490 0.6204819 0.6717371 0 ## 11 0.3794326 0.5235007 0.5783191 0.5600467 0.6126720 0.6717371 0 ## 12 0.4460432 0.5480930 0.5999072 0.5808134 0.6296780 0.6717371 0 ## 13 0.4014252 0.5725752 0.6087279 0.5875305 0.6576219 0.6678832 0 ## 14 0.4460432 0.5585005 0.6117973 0.5911995 0.6590982 0.6717371 0 ## 15 0.4014252 0.5689401 0.6117973 0.5867010 0.6507194 0.6955990 0
Η υψηλότερη μέση ακρίβεια σε αυτό το εύρος (0.8099) ανήκει σε maxnodes = 14, στην κορυφή του δοκιμασμένου διαστήματος. Επειδή η καλύτερη τιμή βρίσκεται στην άκρη του πλέγματος, θα πρέπει να επεκτείνετε την αναζήτηση προς τα πάνω.
store_maxnode <- list() tuneGrid <- expand.grid(.mtry = best_mtry) for (maxnodes in c(20: 30)) { set.seed(1234) rf_maxnode <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, maxnodes = maxnodes, ntree = 300) key <- toString(maxnodes) store_maxnode[[key]] <- rf_maxnode } results_node <- resamples(store_maxnode) summary(results_node)
Παραγωγή:
## ## Call: ## summary.resamples(object = results_node) ## ## Models: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 ## Number of resamples: 10 ## ## Accuracy ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 20 0.7142857 0.7821644 0.8144005 0.8075301 0.8447719 0.8571429 0 ## 21 0.7142857 0.8000215 0.8144005 0.8075014 0.8403614 0.8571429 0 ## 22 0.7023810 0.7941050 0.8263769 0.8099254 0.8328313 0.8690476 0 ## 23 0.7023810 0.7941050 0.8263769 0.8111302 0.8447719 0.8571429 0 ## 24 0.7142857 0.7946429 0.8313253 0.8135112 0.8417599 0.8690476 0 ## 25 0.7142857 0.7916667 0.8313253 0.8099398 0.8408635 0.8690476 0 ## 26 0.7142857 0.7941050 0.8203528 0.8123207 0.8528758 0.8571429 0 ## 27 0.7023810 0.8060456 0.8313253 0.8135112 0.8333333 0.8690476 0 ## 28 0.7261905 0.7941050 0.8203528 0.8111015 0.8328313 0.8690476 0 ## 29 0.7142857 0.7910929 0.8313253 0.8087063 0.8333333 0.8571429 0 ## 30 0.6785714 0.7910929 0.8263769 0.8063253 0.8403614 0.8690476 0 ## ## Kappa ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 20 0.3956835 0.5316120 0.5961830 0.5854366 0.6661120 0.6955990 0 ## 21 0.3956835 0.5699332 0.5960343 0.5853247 0.6590982 0.6919315 0 ## 22 0.3735084 0.5560661 0.6221836 0.5914492 0.6422128 0.7189781 0 ## 23 0.3735084 0.5594228 0.6228827 0.5939786 0.6657372 0.6955990 0 ## 24 0.3956835 0.5600352 0.6337821 0.5992188 0.6604703 0.7189781 0 ## 25 0.3956835 0.5530760 0.6354875 0.5912239 0.6554912 0.7189781 0 ## 26 0.3956835 0.5589331 0.6136074 0.5969142 0.6822128 0.6955990 0 ## 27 0.3735084 0.5852459 0.6368425 0.5998148 0.6426088 0.7189781 0 ## 28 0.4290780 0.5589331 0.6154905 0.5946859 0.6356141 0.7189781 0 ## 29 0.4070588 0.5534173 0.6337821 0.5901173 0.6423101 0.6919315 0 ## 30 0.3297872 0.5534173 0.6202632 0.5843432 0.6590982 0.7189781 0
Η υψηλότερη μέση ακρίβεια, 0.8135, επιτυγχάνεται με maxnodes = 24 (το maxnodes = 27 ισούται με τον μέσο όρο αλλά έχει χαμηλότερο τρίτο τεταρτημόριο). Επομένως, θα χρησιμοποιήσετε maxnodes = 24 για τα υπόλοιπα βήματα.
Βήμα 4) Αναζητήστε τα καλύτερα δέντρα
Τώρα που έχετε την καλύτερη τιμή των mtry και maxnode, μπορείτε να συντονίσετε τον αριθμό των δέντρων. Η μέθοδος είναι ακριβώς η ίδια με το maxnode.
store_maxtrees <- list() for (ntree in c(250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000)) { set.seed(5678) rf_maxtrees <- train(survived~., data = data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, maxnodes = 24, ntree = ntree) key <- toString(ntree) store_maxtrees[[key]] <- rf_maxtrees } results_tree <- resamples(store_maxtrees) summary(results_tree)
Παραγωγή:
## ## Call: ## summary.resamples(object = results_tree) ## ## Models: 250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000 ## Number of resamples: 10 ## ## Accuracy ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 250 0.7380952 0.7976190 0.8083764 0.8087010 0.8292683 0.8674699 0 ## 300 0.7500000 0.7886905 0.8024240 0.8027199 0.8203397 0.8452381 0 ## 350 0.7500000 0.7886905 0.8024240 0.8027056 0.8277623 0.8452381 0 ## 400 0.7500000 0.7886905 0.8083764 0.8051009 0.8292683 0.8452381 0 ## 450 0.7500000 0.7886905 0.8024240 0.8039104 0.8292683 0.8452381 0 ## 500 0.7619048 0.7886905 0.8024240 0.8062914 0.8292683 0.8571429 0 ## 550 0.7619048 0.7886905 0.8083764 0.8099062 0.8323171 0.8571429 0 ## 600 0.7619048 0.7886905 0.8083764 0.8099205 0.8323171 0.8674699 0 ## 800 0.7619048 0.7976190 0.8083764 0.8110820 0.8292683 0.8674699 0 ## 1000 0.7619048 0.7976190 0.8121510 0.8086723 0.8303571 0.8452381 0 ## 2000 0.7619048 0.7886905 0.8121510 0.8086723 0.8333333 0.8452381 0 ## ## Kappa ## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's ## 250 0.4061697 0.5667400 0.5836013 0.5856103 0.6335363 0.7196807 0 ## 300 0.4302326 0.5449376 0.5780349 0.5723307 0.6130767 0.6710843 0 ## 350 0.4302326 0.5449376 0.5780349 0.5723185 0.6291592 0.6710843 0 ## 400 0.4302326 0.5482030 0.5836013 0.5774782 0.6335363 0.6710843 0 ## 450 0.4302326 0.5449376 0.5780349 0.5750587 0.6335363 0.6710843 0 ## 500 0.4601542 0.5449376 0.5780349 0.5804340 0.6335363 0.6949153 0 ## 550 0.4601542 0.5482030 0.5857118 0.5884507 0.6396872 0.6949153 0 ## 600 0.4601542 0.5482030 0.5857118 0.5884374 0.6396872 0.7196807 0 ## 800 0.4601542 0.5667400 0.5836013 0.5910088 0.6335363 0.7196807 0 ## 1000 0.4601542 0.5667400 0.5961590 0.5857446 0.6343666 0.6678832 0 ## 2000 0.4601542 0.5482030 0.5961590 0.5862151 0.6440678 0.6656337 0
Έχετε το τελικό σας μοντέλο. Μπορείτε να εκπαιδεύσετε το τυχαίο δάσος με τις ακόλουθες παραμέτρους:
- ntree = 800: Θα εκπαιδευτούν 800 δέντρα
- mtry = 4: 4 υποψήφια χαρακτηριστικά σχεδιάζονται σε κάθε διαχωρισμό
- maxnodes = 24: Κάθε δέντρο περιορίζεται σε 24 τερματικούς κόμβους (φύλλα)
fit_rf <- train(survived~., data_train, method = "rf", metric = "Accuracy", tuneGrid = tuneGrid, trControl = trControl, importance = TRUE, nodesize = 14, ntree = 800, maxnodes = 24)
Βήμα 5) Αξιολογήστε το μοντέλο
Το κουτί βιβλιοθήκης έχει μια λειτουργία να κάνει πρόβλεψη.
predict(model, newdata= df)
argument
- `model`: Define the model evaluated before.
- `newdata`: Define the dataset to make prediction
prediction <-predict(fit_rf, data_test)
Μπορείτε να χρησιμοποιήσετε την πρόβλεψη για να υπολογίσετε τον πίνακα σύγχυσης και να δείτε τη βαθμολογία ακρίβειας
confusionMatrix(prediction, data_test$survived)
Παραγωγή:
## Confusion Matrix and Statistics ## ## Reference ## Prediction No Yes ## No 110 32 ## Yes 11 56 ## ## Accuracy : 0.7943 ## 95% CI : (0.733, 0.8469) ## No Information Rate : 0.5789 ## P-Value [Acc > NIR] : 3.959e-11 ## ## Kappa : 0.5638 ## Mcnemar's Test P-Value : 0.002289 ## ## Sensitivity : 0.9091 ## Specificity : 0.6364 ## Pos Pred Value : 0.7746 ## Neg Pred Value : 0.8358 ## Prevalence : 0.5789 ## Detection Rate : 0.5263 ## Detection Prevalence : 0.6794 ## Balanced Accuracy : 0.7727 ## ## 'Positive' Class : No ##
Το μοντέλο φτάνει σε ακρίβεια 0.7943, δηλαδή 79.43 τοις εκατό στο αόρατο σύνολο δοκιμών, η οποία είναι υψηλότερη από την προεπιλεγμένη διαμόρφωση. Η ευαισθησία είναι 0.9091 και η ειδικότητα είναι 0.6364, επομένως το μοντέλο αναγνωρίζει τους μη επιζώντες πολύ πιο αξιόπιστα από τους επιζώντες.
Βήμα 6) Οπτικοποιήστε το αποτέλεσμα
Τέλος, μπορείτε να εξετάσετε τη σημασία των χαρακτηριστικών με τη συνάρτηση varImp(). Τα πιο σημαντικά χαρακτηριστικά είναι το φύλο και η ηλικία. Αυτό δεν αποτελεί έκπληξη, επειδή τα σημαντικά χαρακτηριστικά είναι πιθανό να εμφανίζονται πιο κοντά στη ρίζα του δέντρου, ενώ τα λιγότερο σημαντικά χαρακτηριστικά συνήθως εμφανίζονται πιο κοντά στα φύλλα.
varImp(fit_rf)
Παραγωγή:
## rf variable importance ## ## Importance ## sexmale 100.000 ## age 28.014 ## pclassMiddle 27.016 ## fare 21.557 ## pclassUpper 16.324 ## sibsp 11.246 ## parch 5.522 ## embarkedC 4.908 ## embarkedQ 1.420 ## embarkedS 0.000
Τυχαίο Δάσος σε R: Γρήγορη Αναφορά Συναρτήσεων
Ο παρακάτω πίνακας παραθέτει κάθε συνάρτηση που χρησιμοποιείται στα έξι βήματα, το πακέτο που την παρέχει και τις παραμέτρους που αναμένει.
| Βιβλιοθήκη | Σκοπός | Λειτουργία | Παράμετρος |
|---|---|---|---|
| randomForest | Δημιουργήστε ένα τυχαίο δάσος | randomForest() | τύπος, ntree=n, mtry=FALSE, maxnodes = NULL |
| αγκύλη | Δημιουργία διασταυρούμενης επικύρωσης k-fold | trainControl() | μέθοδος = "cv", αριθμός = n, αναζήτηση = "πλέγμα" |
| αγκύλη | Εκπαιδεύστε ένα Τυχαίο Δάσος | τρένο() | τύπος, df, μέθοδος = "rf", μετρική = "Ακρίβεια", trControl = trainControl(), tuneGrid = NULL |
| αγκύλη | Πρόβλεψη εκτός δείγματος | προβλέψει | μοντέλο, newdata= df |
| αγκύλη | Μήτρα σύγχυσης και στατιστικές | confusionMatrix() | μοντέλο, y δοκιμή |
| αγκύλη | Μεταβλητή σημασία | varImp() | μοντέλο |
Παράρτημα: Μοντέλα διαθέσιμα σε καρέ
Η συνάρτηση train() μπορεί να χωρέσει πολύ περισσότερα από τυχαία δάση. Εκτελέστε την παρακάτω εντολή για να εκτυπώσετε κάθε αναγνωριστικό μοντέλου που υποστηρίζει το caret και, στη συνέχεια, μεταβιβάστε οποιοδήποτε από αυτά στο όρισμα method.
names(getModelInfo())
Παραγωγή:
## [1] "ada" "AdaBag" "AdaBoost.M1" ## [4] "adaboost" "amdai" "ANFIS" ## [7] "avNNet" "awnb" "awtan" ## [10] "bag" "bagEarth" "bagEarthGCV" ## [13] "bagFDA" "bagFDAGCV" "bam" ## [16] "bartMachine" "bayesglm" "binda" ## [19] "blackboost" "blasso" "blassoAveraged" ## [22] "bridge" "brnn" "BstLm" ## [25] "bstSm" "bstTree" "C5.0" ## [28] "C5.0Cost" "C5.0Rules" "C5.0Tree" ## [31] "cforest" "chaid" "CSimca" ## [34] "ctree" "ctree2" "cubist" ## [37] "dda" "deepboost" "DENFIS" ## [40] "dnn" "dwdLinear" "dwdPoly" ## [43] "dwdRadial" "earth" "elm" ## [46] "enet" "evtree" "extraTrees" ## [49] "fda" "FH.GBML" "FIR.DM" ## [52] "foba" "FRBCS.CHI" "FRBCS.W" ## [55] "FS.HGD" "gam" "gamboost" ## [58] "gamLoess" "gamSpline" "gaussprLinear" ## [61] "gaussprPoly" "gaussprRadial" "gbm_h3o" ## [64] "gbm" "gcvEarth" "GFS.FR.MOGUL" ## [67] "GFS.GCCL" "GFS.LT.RS" "GFS.THRIFT" ## [70] "glm.nb" "glm" "glmboost" ## [73] "glmnet_h3o" "glmnet" "glmStepAIC" ## [76] "gpls" "hda" "hdda" ## [79] "hdrda" "HYFIS" "icr" ## [82] "J48" "JRip" "kernelpls" ## [85] "kknn" "knn" "krlsPoly" ## [88] "krlsRadial" "lars" "lars2" ## [91] "lasso" "lda" "lda2" ## [94] "leapBackward" "leapForward" "leapSeq" ## [97] "Linda" "lm" "lmStepAIC" ## [100] "LMT" "loclda" "logicBag" ## [103] "LogitBoost" "logreg" "lssvmLinear" ## [106] "lssvmPoly" "lssvmRadial" "lvq" ## [109] "M5" "M5Rules" "manb" ## [112] "mda" "Mlda" "mlp" ## [115] "mlpKerasDecay" "mlpKerasDecayCost" "mlpKerasDropout" ## [118] "mlpKerasDropoutCost" "mlpML" "mlpSGD" ## [121] "mlpWeightDecay" "mlpWeightDecayML" "monmlp" ## [124] "msaenet" "multinom" "mxnet" ## [127] "mxnetAdam" "naive_bayes" "nb" ## [130] "nbDiscrete" "nbSearch" "neuralnet" ## [133] "nnet" "nnls" "nodeHarvest" ## [136] "null" "OneR" "ordinalNet" ## [139] "ORFlog" "ORFpls" "ORFridge" ## [142] "ORFsvm" "ownn" "pam" ## [145] "parRF" "PART" "partDSA" ## [148] "pcaNNet" "pcr" "pda" ## [151] "pda2" "penalized" "PenalizedLDA" ## [154] "plr" "pls" "plsRglm" ## [157] "polr" "ppr" "PRIM" ## [160] "protoclass" "pythonKnnReg" "qda" ## [163] "QdaCov" "qrf" "qrnn" ## [166] "randomGLM" "ranger" "rbf" ## [169] "rbfDDA" "Rborist" "rda" ## [172] "regLogistic" "relaxo" "rf" ## [175] "rFerns" "RFlda" "rfRules" ## [178] "ridge" "rlda" "rlm" ## [181] "rmda" "rocc" "rotationForest" ## [184] "rotationForestCp" "rpart" "rpart1SE" ## [187] "rpart2" "rpartCost" "rpartScore" ## [190] "rqlasso" "rqnc" "RRF" ## [193] "RRFglobal" "rrlda" "RSimca" ## [196] "rvmLinear" "rvmPoly" "rvmRadial" ## [199] "SBC" "sda" "sdwd" ## [202] "simpls" "SLAVE" "slda" ## [205] "smda" "snn" "sparseLDA" ## [208] "spikeslab" "spls" "stepLDA" ## [211] "stepQDA" "superpc" "svmBoundrangeString"## [214] "svmExpoString" "svmLinear" "svmLinear2" ## [217] "svmLinear3" "svmLinearWeights" "svmLinearWeights2" ## [220] "svmPoly" "svmRadial" "svmRadialCost" ## [223] "svmRadialSigma" "svmRadialWeights" "svmSpectrumString" ## [226] "tan" "tanSearch" "treebag" ## [229] "vbmpRadial" "vglmAdjCat" "vglmContRatio" ## [232] "vglmCumulative" "widekernelpls" "WM" ## [235] "wsrf" "xgbLinear" "xgbTree" ## [238] "xyf"
