Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn

Εισαγωγή

Ο αλγόριθμος Random Forest είναι ένας από τους πιο ευέλικτους, ισχυρούς και ευρέως χρησιμοποιούμενους αλγόριθμους για ταξινόμηση και παλινδρόμηση, κατασκευασμένο ως ένα σύνολο Δέντρων Απόφασης.

Εάν δεν είστε εξοικειωμένοι με αυτά – μην ανησυχείτε, θα καλύψουμε όλες αυτές τις έννοιες.

Σε αυτόν τον εμπεριστατωμένο πρακτικό οδηγό, θα δημιουργήσουμε ένα διαίσθηση για το πώς λειτουργούν τα δέντρα απόφασης, πώς το ensembling ενισχύει τους μεμονωμένους ταξινομητές και τους παλινδρομητές, τι είναι τα τυχαία δάση και δημιουργήστε έναν τυχαίο ταξινομητή δασών και έναν παλινδρομητή χρησιμοποιώντας Python και Scikit-Learn, μέσω ενός μίνι-έργου από άκρο σε άκρο και απαντήστε σε μια ερευνητική ερώτηση.

Σκεφτείτε ότι αυτή τη στιγμή ανήκετε σε μια ερευνητική ομάδα που αναλύει δεδομένα για γυναίκες. Η ομάδα έχει συλλέξει 100 αρχεία δεδομένων και θέλει να είναι σε θέση να οργανώσει αυτά τα αρχικά αρχεία χωρίζοντας τις γυναίκες σε κατηγορίες: είναι ή όχι έγκυες και ζουν σε αγροτικές ή αστικές περιοχές. Οι ερευνητές θέλουν να καταλάβουν πόσες γυναίκες θα ήταν σε κάθε κατηγορία.

Υπάρχει μια υπολογιστική δομή που κάνει ακριβώς αυτό, είναι το δέντρο δομή. Χρησιμοποιώντας μια δομή δέντρου, θα μπορείτε να αναπαραστήσετε τις διαφορετικές υποδιαιρέσεις για κάθε κατηγορία.

Αποφάσεις δέντρων

Πώς συμπληρώνετε τους κόμβους ενός δέντρου; Εδώ είναι που δέντρα αποφάσεων έρθουν στο επίκεντρο.

Πρώτον, μπορούμε να διαιρέσουμε τα αρχεία ανά εγκυμοσύνη, μετά από αυτό, μπορούμε να τα χωρίσουμε ζώντας σε αστικές ή αγροτικές περιοχές. Παρατηρήστε ότι θα μπορούσαμε να το κάνουμε αυτό με διαφορετική σειρά, διαιρώντας αρχικά με την περιοχή που ζουν οι γυναίκες και μετά με την κατάσταση εγκυμοσύνης τους. Από αυτό, μπορούμε να δούμε ότι το δέντρο έχει μια εγγενή ιεραρχία. Εκτός από την οργάνωση των πληροφοριών, ένα δέντρο οργανώνει τις πληροφορίες με ιεραρχικό τρόπο – η σειρά εμφάνισης των πληροφοριών έχει σημασία και ως αποτέλεσμα οδηγεί σε διαφορετικά δέντρα.

Παρακάτω, είναι ένα παράδειγμα του δέντρου που έχει περιγραφεί:

Στην εικόνα δέντρου, υπάρχουν 7 τετράγωνα, το ένα στην κορυφή που αντιστοιχεί στο σύνολο των 100 γυναικών, αυτό το πάνω τετράγωνο συνδέεται με δύο τετράγωνα παρακάτω, που χωρίζουν τις γυναίκες με βάση τον αριθμό τους 78 μη έγκυες και 22 έγκυες, και και από τα δύο προηγούμενα τετράγωνα υπάρχουν τέσσερα τετράγωνα. Δύο συνδέονται σε κάθε τετράγωνο παραπάνω που χωρίζουν τις γυναίκες με βάση την περιοχή τους, για τις μη έγκυες, 45 ζουν σε αστική περιοχή, 33 σε αγροτική περιοχή και για τις έγκυες, 14 ζουν σε αγροτική περιοχή και 8 σε αστική περιοχή. Απλώς κοιτάζοντας ένα δέντρο, είναι εύκολο να κατανοήσουμε αυτές τις διαιρέσεις και να δούμε πώς κάθε «στρώμα» προέρχεται από τα προηγούμενα, αυτά τα στρώματα είναι το δέντρο επίπεδα, τα επίπεδα περιγράφουν το βάθος του δέντρου:

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Παρατηρήστε στην παραπάνω εικόνα ότι το πρώτο επίπεδο δέντρου είναι επίπεδο 0 όπου υπάρχει μόνο ένα τετράγωνο, ακολουθούμενο από επίπεδο 1 όπου υπάρχουν δύο τετράγωνα, και επίπεδο 2 όπου υπάρχουν τέσσερα τετράγωνα. Αυτό είναι ένα βάθος 2 δέντρο.

Στο επίπεδο 0 είναι το τετράγωνο από το οποίο προέρχεται το δέντρο, το πρώτο που ονομάζεται ριζικός κόμβος, αυτή η ρίζα έχει δύο θυγατρικοί κόμβοι στο επίπεδο 1, δηλαδή γονικοί κόμβοι στους τέσσερις κόμβους στο επίπεδο 2. Δείτε ότι τα «τετράγωνα» που αναφέραμε μέχρι τώρα, ονομάζονται στην πραγματικότητα κόμβων; και ότι κάθε προηγούμενος κόμβος είναι γονέας των παρακάτω κόμβων, που είναι τα παιδιά του. Καλούνται οι θυγατρικοί κόμβοι κάθε επιπέδου που έχουν τον ίδιο γονέα αδέλφια, όπως φαίνεται στην επόμενη εικόνα:

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Στην προηγούμενη εικόνα, εμφανίζουμε επίσης το επίπεδο 1 ως το εσωτερικούς κόμβους, αφού βρίσκονται μεταξύ της ρίζας και των τελευταίων κόμβων, που είναι οι κόμβοι φύλλων. Οι κόμβοι των φύλλων είναι το τελευταίο μέρος ενός δέντρου, αν λέγαμε από τις 100 αρχικές γυναίκες, πόσες είναι έγκυες και ζουν σε αγροτικές περιοχές, θα μπορούσαμε να το κάνουμε αυτό κοιτάζοντας τα φύλλα. Έτσι ο αριθμός στα φύλλα θα απαντούσε στο πρώτο ερευνητικό ερώτημα.

Εάν υπήρχαν νέα αρχεία γυναικών και το δέντρο που χρησιμοποιήθηκε προηγουμένως για την κατηγοριοποίησή τους, χρησιμοποιήθηκε τώρα για να αποφασίσει εάν μια γυναίκα θα μπορούσε ή δεν θα μπορούσε να είναι μέρος της έρευνας, θα λειτουργούσε ακόμα; Το δέντρο θα χρησιμοποιούσε τα ίδια κριτήρια και μια γυναίκα θα μπορούσε να συμμετάσχει εάν είναι έγκυος και ζούσε σε αγροτική περιοχή.

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Βλέποντας την παραπάνω εικόνα, μπορούμε να δούμε ότι οι απαντήσεις στις ερωτήσεις κάθε κόμβου δέντρου – «είναι συμμετέχων;», «είναι έγκυος;», «κατοικεί σε αγροτική περιοχή;»- είναι ναι, ναι, και ναι, έτσι φαίνεται ότι το δέντρο μπορεί να οδηγήσει σε μια απόφαση, σε αυτήν την περίπτωση, ότι η γυναίκα θα μπορούσε να λάβει μέρος στην έρευνα.

Αυτή είναι η ουσιαστικό των δέντρων απόφασης, γίνεται με χειροκίνητο τρόπο. Χρησιμοποιώντας τη Μηχανική Μάθηση, μπορούμε να κατασκευάσουμε ένα μοντέλο που κατασκευάζει αυτό το δέντρο αυτόματα για εμάς, με τέτοιο τρόπο ώστε να μεγιστοποιείται η ακρίβεια των τελικών αποφάσεων.

Σημείωση: υπάρχουν διάφοροι τύποι δέντρων στην Επιστήμη των Υπολογιστών, όπως δυαδικά δέντρα, γενικά δέντρα, δέντρα AVL, δέντρα ερυθράς, κόκκινα μαύρα δέντρα, β-δέντρα, κ.λπ. Εδώ, εστιάζουμε στο να δώσουμε μια γενική ιδέα για το τι είναι δέντρο αποφάσεων . Αν εξαρτάται από την απάντηση του α Ναί or Όχι. ερώτηση για κάθε κόμβο και επομένως κάθε κόμβος έχει το πολύ δύο παιδιά, όταν ταξινομούνται έτσι ώστε οι «μικρότεροι» κόμβοι να βρίσκονται στα αριστερά, αυτό ταξινομεί τα δέντρα αποφάσεων ως δυαδικά δέντρα.

Στα προηγούμενα παραδείγματα, παρατηρήστε πώς θα μπορούσε το δέντρο ταξινόμηση νέα δεδομένα ως συμμετέχοντες ή μη, ή οι ερωτήσεις θα μπορούσαν επίσης να αλλάξουν σε – «πόσοι είναι οι συμμετέχοντες;», «πόσες είναι έγκυες;», «πόσοι ζουν σε μια αγροτική περιοχή;» – οδηγώντας μας να βρούμε το ποσότητα εγκύων που ζουν σε αγροτική περιοχή.

Όταν τα δεδομένα ταξινομούνται, αυτό σημαίνει ότι το δέντρο εκτελεί a ταξινόμηση εργασία, και όταν βρεθεί η ποσότητα των δεδομένων, το δέντρο εκτελεί a οπισθοδρόμηση έργο. Αυτό σημαίνει ότι το δέντρο αποφάσεων μπορεί να χρησιμοποιηθεί και για τις δύο εργασίες – ταξινόμηση και παλινδρόμηση.

Τώρα που καταλαβαίνουμε τι είναι ένα δέντρο αποφάσεων, πώς μπορεί να χρησιμοποιηθεί και ποια ονοματολογία χρησιμοποιείται για να το περιγράψει, μπορούμε να αναρωτηθούμε για τους περιορισμούς του.

Κατανόηση των τυχαίων δασών

Τι συμβαίνει με την απόφαση εάν κάποιος συμμετέχων ζει στη διαίρεση μεταξύ αστικών και αγροτικών περιοχών; Το δέντρο θα προσθέσει αυτόν τον δίσκο σε αγροτικό ή αστικό; Φαίνεται δύσκολο να χωρέσουμε αυτά τα δεδομένα στη δομή που έχουμε αυτή τη στιγμή, καθώς είναι αρκετά σαφής.

Επίσης, τι γίνεται αν μια γυναίκα που ζει σε ένα σκάφος συμμετέχει στην έρευνα, θα θεωρηθεί αγροτική ή αστική; Με τον ίδιο τρόπο όπως και στην προηγούμενη περίπτωση, είναι ένα δύσκολο σημείο δεδομένων η ταξινόμηση λαμβάνοντας υπόψη τις διαθέσιμες επιλογές στο δέντρο.

Σκεφτόμενοι λίγο περισσότερο για το παράδειγμα δέντρου αποφάσεων, μπορούμε να δούμε ότι μπορεί να ταξινομήσει σωστά νέα δεδομένα θεωρώντας ότι ακολουθεί ήδη ένα μοτίβο που έχει ήδη το δέντρο – αλλά όταν υπάρχουν εγγραφές που διαφέρουν από τα αρχικά δεδομένα που καθόρισαν το δέντρο, Η δομή του δέντρου είναι πολύ άκαμπτη, με αποτέλεσμα οι εγγραφές να μην μπορούν να ταξινομηθούν.

Αυτό σημαίνει ότι το δέντρο αποφάσεων μπορεί να είναι αυστηρό και περιορισμένο στις δυνατότητές του. Ένα ιδανικό δέντρο αποφάσεων θα ήταν πιο ευέλικτο και ικανό να φιλοξενήσει πιο αποχρώσεις αόρατα δεδομένα.

Λύση: Ακριβώς όπως «δύο ζευγάρια μάτια βλέπουν καλύτερα από ένα», δύο μοντέλα συνήθως δίνουν μια πιο ακριβή απάντηση από ένα. Λαμβάνοντας υπόψη την ποικιλομορφία στις αναπαραστάσεις της γνώσης (που κωδικοποιούνται στη δομή του δέντρου), η ακαμψία των ελάχιστα διαφορετικών δομών μεταξύ πολλαπλών παρόμοιων δέντρων δεν είναι πλέον τόσο περιοριστική, αφού οι ελλείψεις ενός δέντρου μπορούν να «αναπληρωθούν» από ένα άλλο. Συνδυάζοντας πολλά δέντρα μαζί, παίρνουμε ένα δάσος.

Όσον αφορά την απάντηση στην αρχική ερώτηση, γνωρίζουμε ήδη ότι θα κωδικοποιηθεί στα φύλλα των δέντρων – αλλά τι αλλάζει όταν έχουμε πολλά δέντρα αντί για ένα;

Εάν τα δέντρα συνδυαστούν για μια ταξινόμηση, το αποτέλεσμα θα καθοριστεί από την πλειοψηφία των απαντήσεων, αυτό ονομάζεται πλειοψηφία; και σε περίπτωση παλινδρόμησης, ο αριθμός που δίνεται από κάθε δέντρο στο δάσος θα είναι κατά μέσο όρο.

Ensemble Learning και Model Ensembles

Αυτή η μέθοδος είναι γνωστή ως μάθηση του συνόλου. Όταν χρησιμοποιείτε την εκμάθηση συνόλου, μπορείτε να αναμίξετε οποιονδήποτε αλγόριθμο μεταξύ τους, αρκεί να διασφαλίσετε ότι η έξοδος μπορεί να αναλυθεί και να συνδυαστεί με άλλες εξόδους (είτε χειροκίνητα είτε χρησιμοποιώντας υπάρχουσες βιβλιοθήκες). Συνήθως, συνδυάζετε πολλά μοντέλα του ίδιου τύπου μαζί, όπως πολλαπλά δέντρα αποφάσεων, αλλά δεν περιορίζεστε να ενώνετε απλώς σύνολα τύπου ίδιου μοντέλου.

Το Ensembling είναι ένας πρακτικά εγγυημένος τρόπος για να γενικεύσετε καλύτερα ένα πρόβλημα και να αποσπάσετε μια ελαφρά ενίσχυση της απόδοσης. Σε ορισμένες περιπτώσεις, τα μοντέλα συνόλου παράγουν α σημαντικός αύξηση της προγνωστικής ισχύος, και μερικές φορές, ελαφρά. Αυτό εξαρτάται από το σύνολο δεδομένων στο οποίο εκπαιδεύεστε και αξιολογείτε, καθώς και από τα ίδια τα μοντέλα.

Η ένωση δέντρων απόφασης αποδίδει σημαντικός αυξάνει την απόδοση σε σύγκριση με μεμονωμένα δέντρα. Αυτή η προσέγγιση διαδόθηκε στις κοινότητες έρευνας και εφαρμοσμένης μηχανικής μάθησης και ήταν τόσο διαδεδομένη που το σύνολο των δέντρων απόφασης ονομάστηκε στην καθομιλουμένη δάσος, και ο κοινός τύπος δάσους που δημιουργήθηκε (ένα δάσος από δέντρα απόφασης σε ένα τυχαίο υποσύνολο χαρακτηριστικών) έκανε δημοφιλή το όνομα τυχαία δάση.

Δεδομένης της χρήσης ευρείας κλίμακας, βιβλιοθήκες όπως η Scikit-Learn έχουν εφαρμόσει περιτυλίγματα για RandomForestRegressors και RandomForestClassifiers, χτισμένα πάνω από τις δικές τους υλοποιήσεις δέντρων αποφάσεων, για να επιτρέπουν στους ερευνητές να αποφύγουν τη δημιουργία των δικών τους συνόλων.

Ας βουτήξουμε σε τυχαία δάση!

Πώς λειτουργεί ο αλγόριθμος Random Forest;

Τα παρακάτω είναι τα βασικά βήματα που απαιτούνται κατά την εκτέλεση του αλγόριθμου τυχαίου δάσους:

  1. Επιλέξτε έναν αριθμό τυχαίων εγγραφών, μπορεί να είναι οποιοσδήποτε αριθμός, όπως 4, 20, 76, 150 ή ακόμα και 2.000 από το σύνολο δεδομένων (που ονομάζεται N αρχεία). Ο αριθμός θα εξαρτηθεί από το πλάτος του συνόλου δεδομένων, όσο ευρύτερο, τόσο μεγαλύτερο N μπορεί να είναι. Εδώ είναι που το τυχαίος το όνομα του αλγορίθμου προέρχεται από!
  2. Δημιουργήστε ένα δέντρο αποφάσεων με βάση αυτά N τυχαίες εγγραφές.
  3. Ανάλογα με τον αριθμό των δέντρων που ορίζονται για τον αλγόριθμο ή τον αριθμό των δέντρων στο δάσος, επαναλάβετε τα βήματα 1 και 2. Αυτό δημιουργεί περισσότερα δέντρα από σύνολα τυχαίων εγγραφών δεδομένων.
  4. Μετά το βήμα 3, ακολουθεί το τελικό βήμα, το οποίο είναι η πρόβλεψη των αποτελεσμάτων:
    • Σε περίπτωση ταξινόμησης: κάθε δέντρο στο δάσος θα προβλέπει την κατηγορία στην οποία ανήκει το νέο ρεκόρ. Μετά από αυτό, το νέο ρεκόρ αποδίδεται στην κατηγορία που κερδίζει την πλειοψηφία.
    • Σε περίπτωση παλινδρόμησης: κάθε δέντρο στο δάσος προβλέπει μια τιμή για τη νέα εγγραφή και η τελική τιμή πρόβλεψης θα υπολογιστεί λαμβάνοντας έναν μέσο όρο όλων των τιμών που προβλέπονται από όλα τα δέντρα στο δάσος.

Κάθε δέντρο που ταιριάζει σε ένα τυχαίο υποσύνολο χαρακτηριστικών δεν θα έχει απαραίτητα γνώση ορισμένων άλλων χαρακτηριστικών, κάτι που διορθώνεται με την ενοποίηση, ενώ διατηρείται το υπολογιστικό κόστος χαμηλότερο.

Συμβουλή: Δεδομένου ότι το Random Forest χρησιμοποιεί τα Δέντρα Αποφάσεων ως βάση, είναι πολύ χρήσιμο να κατανοήσετε πώς λειτουργούν τα Δέντρα Αποφάσεων και να εξασκηθείτε μαζί τους ξεχωριστά για να δημιουργήσετε μια διαίσθηση στη δομή τους. Όταν συνθέτετε τυχαία δάση, θα ορίσετε τιμές όπως το μέγιστο βάθος ενός δέντρου, τον ελάχιστο αριθμό δειγμάτων που απαιτείται να βρίσκονται σε έναν κόμβο φύλλων, τα κριτήρια για τον καθορισμό εσωτερικών διαχωρισμών κ.λπ. για να βοηθήσετε το σύνολο να ταιριάζει καλύτερα σε ένα σύνολο δεδομένων και γενικεύστε σε νέα σημεία. Στην πράξη, τυπικά θα χρησιμοποιείτε Random Forest, Gradient Boosting ή Extreme Gradient Boosting ή άλλες μεθοδολογίες που βασίζονται σε δέντρα, επομένως η καλή κατανόηση των υπερπαραμέτρων ενός μεμονωμένου δέντρου αποφάσεων θα σας βοηθήσει να δημιουργήσετε μια ισχυρή διαίσθηση για τον συντονισμό των συνόλων.

Με μια διαίσθηση για το πώς λειτουργούν τα δέντρα και την κατανόηση των Τυχαίων Δασών – το μόνο που απομένει είναι να εξασκηθείτε στη δημιουργία, την εκπαίδευση και τον συντονισμό τους σε δεδομένα!

Κατασκευή και εκπαίδευση μοντέλων τυχαίων δασών με το Scikit-Learn

Υπήρχε λόγος για τα παραδείγματα που χρησιμοποιήθηκαν μέχρι στιγμής να αφορούν την εγκυμοσύνη, τον χώρο διαβίωσης και τις γυναίκες.

Το 2020, ερευνητές από το Μπαγκλαντές παρατήρησαν ότι η θνησιμότητα μεταξύ των εγκύων ήταν ακόμα πολύ υψηλή, ειδικά αν ληφθούν υπόψη εκείνες που ζουν σε αγροτικές περιοχές. Εξαιτίας αυτού, χρησιμοποίησαν ένα σύστημα παρακολούθησης IOT για να αναλύσει τον κίνδυνο για την υγεία της μητέρας. Το σύστημα IOT συνέλεξε δεδομένα από διαφορετικά νοσοκομεία, κοινοτικές κλινικές και υπηρεσίες υγείας των μητέρων από τις αγροτικές περιοχές του Μπαγκλαντές.

Στη συνέχεια, τα δεδομένα που συλλέχθηκαν οργανώθηκαν σε ένα αρχείο με τιμή διαχωρισμένη με κόμματα (csv) και μεταφορτώθηκαν σε Αποθετήριο μηχανικής μάθησης της UCI.

Αυτά είναι τα δεδομένα που θα χρησιμοποιήσουμε για να εξασκηθούμε και να προσπαθήσουμε να καταλάβουμε εάν μια έγκυος έχει α χαμηλός, medium or ψηλά κίνδυνος θνησιμότητας.

Note: μπορείτε να κατεβάσετε το σύνολο δεδομένων εδώ.

Χρήση τυχαίου δάσους για ταξινόμηση

Αφού θέλουμε να μάθουμε αν η γυναίκα έχει α χαμηλός, medium or ψηλά κίνδυνος θνησιμότητας, αυτό σημαίνει ότι θα πραγματοποιήσουμε μια ταξινόμηση με τρεις κατηγορίες. Όταν ένα πρόβλημα έχει περισσότερες από δύο κλάσεις, ονομάζεται α πολυκλάση πρόβλημα, σε αντίθεση με το α δυαδικό πρόβλημα (όπου επιλέγετε μεταξύ δύο κλάσεων, συνήθως 0 και 1).

Σε αυτό το πρώτο παράδειγμα, θα εφαρμόσουμε ένα μοντέλο ταξινόμησης πολλαπλών κλάσεων με έναν ταξινομητή Random Forest και το Scikit-Learn της Python.

Θα ακολουθήσουμε τα συνήθη βήματα μηχανικής εκμάθησης για να λύσουμε αυτό το πρόβλημα, τα οποία είναι η φόρτωση βιβλιοθηκών, η ανάγνωση των δεδομένων, η εξέταση συνοπτικών στατιστικών και η δημιουργία οπτικοποιήσεων δεδομένων για την καλύτερη κατανόηση του. Στη συνέχεια, η προεπεξεργασία και ο διαχωρισμός των δεδομένων που ακολουθείται από τη δημιουργία, την εκπαίδευση και την αξιολόγηση ενός μοντέλου.

Εισαγωγή βιβλιοθηκών

Θα χρησιμοποιήσουμε Pandas για να διαβάσουμε τα δεδομένα, Seaborn και Matplotlib για να τα οπτικοποιήσουμε και NumPy για τις εξαιρετικές μεθόδους χρησιμότητας:

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
Εισαγωγή του συνόλου δεδομένων

Ο παρακάτω κώδικας εισάγει το σύνολο δεδομένων και το φορτώνει σε μια python DataFrame:

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")

Για να δούμε τις πρώτες πέντε γραμμές των δεδομένων, εκτελούμε το head() εντολή:

dataset.head()

Αυτό βγάζει:

    Age SystolicBP  DiastolicBP BS      BodyTemp    HeartRate   RiskLevel
0   25  130         80          15.0    98.0        86          high risk
1   35  140         90          13.0    98.0        70          high risk
2   29  90          70          8.0     100.0       80          high risk
3   30  140         85          7.0     98.0        70          high risk
4   35  120         60          6.1     98.0        76          low risk

Εδώ μπορούμε να δούμε όλα τα χαρακτηριστικά που συλλέχθηκαν κατά τη διάρκεια της έρευνας.

  • Ηλικία: ηλικίες σε χρόνια.
  • Συστολική ΑΠ: ανώτερη τιμή της αρτηριακής πίεσης σε mmHg, ένα σημαντικό χαρακτηριστικό κατά τη διάρκεια της εγκυμοσύνης.
  • Διαστολική ΑΠ: χαμηλότερη τιμή της αρτηριακής πίεσης σε mmHg, ένα άλλο σημαντικό χαρακτηριστικό κατά τη διάρκεια της εγκυμοσύνης.
  • BS: επίπεδα γλυκόζης αίματος ως προς τη μοριακή συγκέντρωση, mmol/L.
  • Καρδιακός ρυθμός: καρδιακός ρυθμός ηρεμίας σε παλμούς ανά λεπτό.
  • Επίπεδο κινδύνου: επίπεδο κινδύνου κατά τη διάρκεια της εγκυμοσύνης.
  • BodyTemp: η θερμοκρασία του σώματος.

Τώρα που καταλαβαίνουμε περισσότερα για το τι μετράται, μπορούμε να δούμε τους τύπους δεδομένων με info():

dataset.info()

Αυτο εχει ως αποτελεσμα:


RangeIndex: 1014 entries, 0 to 1013
Data columns (total 7 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   Age          1014 non-null   int64  
 1   SystolicBP   1014 non-null   int64  
 2   DiastolicBP  1014 non-null   int64  
 3   BS           1014 non-null   float64
 4   BodyTemp     1014 non-null   float64
 5   HeartRate    1014 non-null   int64  
 6   RiskLevel    1014 non-null   object 
dtypes: float64(2), int64(4), object(1)
memory usage: 55.6+ KB

Από την εξέταση του RangeIndex γραμμή, μπορούμε να δούμε ότι υπάρχουν 1014 εγγραφές και η στήλη Non-Null Count ενημερώνει ότι τα δεδομένα δεν έχουν τιμές που λείπουν. Αυτό σημαίνει ότι δεν θα χρειαστεί να κάνουμε καμία θεραπεία για δεδομένα που λείπουν!

Στο Dtype στήλη, μπορούμε να δούμε τον τύπο κάθε μεταβλητής. Επί του παρόντος, float64 στήλες τέτοια BS και BodyTemp έχουν αριθμητικές τιμές που μπορεί να διαφέρουν σε οποιοδήποτε εύρος, όπως 15.0, 15.51, 15.76, 17.28, καθιστώντας τις αριθμητικά συνεχής (μπορείτε πάντα να προσθέσετε ένα 0 σε έναν αριθμό κινητής υποδιαστολής, ad άπειρο). Από την άλλη, μεταβλητές όπως π.χ Age, SystolicBP, DiastolicBP, να HeartRate είναι του τύπου int64, αυτό σημαίνει ότι οι αριθμοί αλλάζουν μόνο κατά μονάδα, όπως 11, 12, 13, 14 – δεν θα έχουμε καρδιακό ρυθμό 77.78, είναι είτε 77 είτε 78 – αυτά είναι αριθμητικά διακριτή αξίες. Και έχουμε επίσης RiskLevel με object τύπου, αυτό συνήθως δείχνει ότι η μεταβλητή είναι κείμενο και πιθανότατα θα χρειαστεί να τη μετατρέψουμε σε αριθμό. Δεδομένου ότι το επίπεδο κινδύνου αυξάνεται από χαμηλό σε υψηλό, υπάρχει μια σιωπηρή σειρά στις κατηγορίες, αυτό δείχνει ότι είναι κατηγορηματικά τακτική μεταβλητός.

Note: είναι σημαντικό να εξετάσετε τον τύπο κάθε δεδομένων και να δείτε αν έχει νόημα ανάλογα με το περιεχόμενό του. Για παράδειγμα, δεν έχει νόημα να έχουμε τη μισή μονάδα καρδιακού ρυθμού, επομένως αυτό σημαίνει ότι ο τύπος ενδιάμεσης τιμής είναι επαρκής για μια διακριτή τιμή. Όταν αυτό δεν συμβαίνει, μπορείτε να αλλάξετε τον τύπο των δεδομένων με το Pandas' astype() περιουσία - df['column_name'].astype('type').

Αφού εξετάσουμε τους τύπους δεδομένων, μπορούμε να χρησιμοποιήσουμε describe() για να κορυφωθεί σε ορισμένα περιγραφικά στατιστικά στοιχεία, όπως οι μέσες τιμές κάθε στήλης, η τυπική απόκλιση, τα ποσοστά, οι ελάχιστες και μέγιστες τιμές δεδομένων:

dataset.describe().T 

Ο παραπάνω κωδικός εμφανίζει:

            count   mean        std         min     25%     50%     75%     max
Age         1014.0  29.871795   13.474386   10.0    19.0    26.0    39.0    70.0
SystolicBP  1014.0  113.198225  18.403913   70.0    100.0   120.0   120.0   160.0
DiastolicBP 1014.0  76.460552   13.885796   49.0    65.0    80.0    90.0    100.0
BS          1014.0  8.725986    3.293532    6.0     6.9     7.5     8.0     19.0
BodyTemp    1014.0  98.665089   1.371384    98.0    98.0    98.0    98.0    103.0
HeartRate   1014.0  74.301775   8.088702    7.0     70.0    76.0    80.0    90.0
RiskLevel   1014.0  0.867850    0.807353    0.0     0.0     1.0     2.0     2.0

Παρατηρήστε ότι για τις περισσότερες στήλες, το εννοώ οι αξίες απέχουν πολύ από το τυπική απόκλιση (STD) – αυτό δείχνει ότι τα δεδομένα δεν ακολουθούν απαραίτητα μια καλά συμπεριφερόμενη στατιστική κατανομή. Εάν το έκανε, θα βοηθούσε το μοντέλο κατά την πρόβλεψη του κινδύνου. Αυτό που μπορεί να γίνει εδώ είναι η προεπεξεργασία των δεδομένων για να γίνουν πιο αντιπροσωπευτικά σαν να ήταν δεδομένα από ολόκληρο τον παγκόσμιο πληθυσμό ή περισσότερα κανονικοποιήθηκε. Αλλά, ένα πλεονέκτημα όταν χρησιμοποιείτε μοντέλα Random Forest για ταξινόμηση, είναι ότι η εγγενής δομή δέντρου μπορεί να αντιμετωπίσει καλά δεδομένα που δεν έχουν κανονικοποιηθεί, αφού τα διαιρέσει με την τιμή σε κάθε επίπεδο δέντρου για κάθε μεταβλητή.

Επίσης, επειδή χρησιμοποιούμε δέντρα και ότι η κλάση που προκύπτει θα ληφθεί με ψηφοφορία, δεν συγκρίνουμε εγγενώς μεταξύ διαφορετικών τιμών, μόνο μεταξύ ίδιων τύπων τιμών, επομένως η προσαρμογή των χαρακτηριστικών στην ίδια κλίμακα δεν είναι απαραίτητη σε αυτήν την περίπτωση . Αυτό σημαίνει ότι το μοντέλο ταξινόμησης Random Forest είναι αμετάβλητη κλίμακα, και δεν χρειάζεται να κάνετε κλιμάκωση χαρακτηριστικών.

Σε αυτή την περίπτωση, το βήμα στην προεπεξεργασία δεδομένων που μπορούμε να κάνουμε είναι να μετατρέψουμε το κατηγορικό RiskLevel στήλη σε αριθμητική.

Οπτικοποίηση των Δεδομένων

Πριν μεταμορφωθεί RiskLevel, ας οπτικοποιήσουμε επίσης γρήγορα τα δεδομένα κοιτάζοντας τους συνδυασμούς σημείων για κάθε ζεύγος χαρακτηριστικών με ένα Scatterplot και πώς κατανέμονται τα σημεία οπτικοποιώντας την καμπύλη ιστογράμματος. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε το Seaborn's pairplot() που συνδυάζει και τα δύο οικόπεδα. Δημιουργεί και τα δύο γραφήματα για κάθε συνδυασμό χαρακτηριστικών και εμφανίζει τα σημεία με χρωματική κωδικοποίηση σύμφωνα με το επίπεδο κινδύνου τους με το hue ιδιοκτησία:

g = sns.pairplot(dataset, hue='RiskLevel')
g.fig.suptitle("Scatterplot and histogram of pairs of variables color coded by risk level", 
               fontsize = 14, 
               y=1.05); 

Ο παραπάνω κώδικας δημιουργεί:

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Κατά την εξέταση της πλοκής, η ιδανική κατάσταση θα ήταν να υπάρχει σαφής διαχωρισμός μεταξύ καμπυλών και κουκκίδων. Όπως μπορούμε να δούμε, οι τρεις τύποι κατηγοριών κινδύνου είναι ως επί το πλείστον μπερδεμένοι, καθώς τα δέντρα σχεδιάζουν εσωτερικά γραμμές όταν οριοθετούν τα κενά μεταξύ των σημείων, μπορούμε να υποθέσουμε ότι περισσότερα δέντρα στο δάσος μπορεί να είναι σε θέση να περιορίσουν περισσότερους χώρους και να ταξινομήσουν καλύτερα τα σημεία.

Με τη βασική διερευνητική ανάλυση δεδομένων που έχει γίνει, μπορούμε να προεπεξεργαζόμαστε το RiskLevel στήλη.

Προεπεξεργασία δεδομένων για ταξινόμηση

Για να είμαστε σίγουροι ότι υπάρχουν μόνο τρεις κατηγορίες RiskLevel στα δεδομένα μας, και ότι δεν έχουν προστεθεί άλλες τιμές εσφαλμένα, μπορούμε να χρησιμοποιήσουμε unique() για να εμφανίσετε τις μοναδικές τιμές της στήλης:

dataset['RiskLevel'].unique()

Αυτό βγάζει:

array(['high risk', 'low risk', 'mid risk'], dtype=object)

Οι κλάσεις ελέγχονται, τώρα το επόμενο βήμα είναι να μετατρέψετε κάθε τιμή σε αριθμό. Δεδομένου ότι υπάρχει μια σειρά μεταξύ των ταξινομήσεων, μπορούμε να χρησιμοποιήσουμε τις τιμές 0, 1 και 2 για να δηλώσουμε χαμηλός, medium και ψηλά κινδύνους. Υπάρχουν πολλοί τρόποι για να αλλάξετε τις τιμές των στηλών, ακολουθώντας αυτές της Python το απλό είναι καλύτερο από το σύνθετο σύνθημα, θα χρησιμοποιήσουμε το .replace() μέθοδο και απλώς αντικαταστήστε τις με τις ακέραιες αναπαραστάσεις τους:

dataset['RiskLevel'] = dataset['RiskLevel'].replace('low risk', 0).replace('mid risk', 1).replace('high risk', 2)

Αφού αντικαταστήσουμε τις τιμές, μπορούμε να χωρίσουμε τα δεδομένα σε αυτά που θα χρησιμοποιηθούν για την εκπαίδευση του μοντέλου, το χαρακτηριστικά or X, και αυτό που θέλουμε να προβλέψουμε, το ετικέτες or y:

y = dataset['RiskLevel']
X = dataset.drop(['RiskLevel'], axis=1)

Μόλις η X και y τα σετ είναι έτοιμα, μπορούμε να χρησιμοποιήσουμε το Scikit-Learn's train_test_split() μέθοδος περαιτέρω διαίρεσης τους σε σετ αμαξοστοιχίας και δοκιμών:

from sklearn.model_selection import train_test_split

SEED = 42
X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)

Συμβουλές: θυμηθείτε να χρησιμοποιήσετε έναν σπόρο τυχαίας κατάστασης εάν θέλετε να κάνετε το αποτέλεσμα αναπαραγώγιμο. Χρησιμοποιήσαμε έναν σπόρο τυχαίας κατάστασης, ώστε να μπορείτε να αναπαράγετε τα ίδια αποτελέσματα όπως από τον οδηγό.

Εδώ, χρησιμοποιούμε το 20% των δεδομένων για δοκιμές και το 80% για την εκπαίδευση.

Εκπαίδευση ενός RandomForestClassifier

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!

Scikit-Learn υλοποιήθηκαν σύνολα κάτω από το sklearn.ensemble μονάδα μέτρησης. Ένα σύνολο δέντρων αποφάσεων που χρησιμοποιούνται για ταξινόμηση, στο οποίο λαμβάνεται πλειοψηφία εφαρμόζεται ως το RandomForestClassifier.

Έχοντας το τρένο και τα σετ δοκιμών, μπορούμε να εισαγάγουμε το RandomForestClassifier τάξη και δημιουργήστε το μοντέλο. Για να ξεκινήσουμε, ας δημιουργήσουμε ένα δάσος με τρία δέντρα, με ρύθμιση n_estimators παράμετρος ως 3, και με κάθε δέντρο να έχει τρία επίπεδα, με ρύθμιση max_depthστο 2:

from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier(n_estimators=3, 
                             max_depth=2,
                             random_state=SEED)

Σημείωση: Η προεπιλεγμένη τιμή για n_estimators is 100. Αυτό ενισχύει την προγνωστική ισχύ και τη γενίκευση του συνόλου, αλλά δημιουργούμε ένα μικρότερο για να διευκολύνουμε την οπτικοποίηση και την επιθεώρησή του. Με μόλις 3 δέντρα – μπορούμε να τα οπτικοποιήσουμε και να τα επιθεωρήσουμε χειροκίνητα να οικοδομήσουμε περαιτέρω τη διαίσθησή μας τόσο για τα μεμονωμένα δέντρα όσο και για τη συνεξάρτησή τους. Το ίδιο ισχύει και για max_depth, Η οποία είναι None, που σημαίνει ότι τα δέντρα μπορούν να γίνονται όλο και πιο βαθιά για να χωρέσουν τα δεδομένα όπως απαιτείται.

Για να ταιριάζει το μοντέλο γύρω από τα δεδομένα – ονομάζουμε το fit() μέθοδος, μεταβίβαση στα χαρακτηριστικά και τις ετικέτες εκπαίδευσης:


rfc.fit(X_train, y_train)

y_pred = rfc.predict(X_test)

Μπορούμε τώρα να συγκρίνουμε τις προβλεπόμενες ετικέτες με τις πραγματικές ετικέτες για να αξιολογήσουμε πόσο καλά τα πήγε το μοντέλο! Πριν αξιολογήσουμε το μοντέλο, ας ρίξουμε μια ματιά στο σύνολο.

Για να εξετάσουμε λίγο βαθύτερα το μοντέλο, μπορούμε να απεικονίσουμε καθένα από τα δέντρα και πώς διαιρούν τα δεδομένα. Αυτό μπορεί να γίνει χρησιμοποιώντας το tree ενότητα ενσωματωμένη στο Scikit-Learn και, στη συνέχεια, κυκλοφόρηση μέσω καθενός από τους εκτιμητές του συνόλου:


from sklearn import tree

features = X.columns.values 
classes = ['0', '1', '2'] 



for estimator in rfc.estimators_:
    print(estimator)
    plt.figure(figsize=(12,6))
    tree.plot_tree(estimator,
                   feature_names=features,
                   class_names=classes,
                   fontsize=8, 
                   filled=True, 
                   rounded=True)
    plt.show()

Ο παραπάνω κώδικας εμφανίζει τα δενδροειδή:

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.
Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Παρατηρήστε πώς διαφέρουν τα τρία δέντρα. Το πρώτο ξεκινά με το BS χαρακτηριστικό, το δεύτερο με DiastolicBP, και το τρίτο με BS πάλι. Αν και το τρίτο εξετάζει διαφορετικό αριθμό δειγμάτων. Στο δεξί κλαδί, τα δύο πρώτα δέντρα αποφασίζουν επίσης να χρησιμοποιήσουν Age στο επίπεδο των φύλλων, ενώ το τρίτο δέντρο τελειώνει με BS χαρακτηριστικό. Με τρεις μόνο εκτιμητές, είναι σαφές πώς η κλιμάκωση παρέχει μια πλούσια, ποικιλόμορφη αναπαράσταση της γνώσης που μπορεί να ενσωματωθεί με επιτυχία σε ένα μοντέλο υψηλής ακρίβειας.

Όσο περισσότερα δέντρα στο δάσος, τόσο πιο διαφορετικό μπορεί να είναι το μοντέλο. Υπάρχει ένα σημείο μείωσης των αποδόσεων, ωστόσο, καθώς πολλά δέντρα ταιριάζουν σε ένα τυχαίο υποσύνολο χαρακτηριστικών, θα υπάρχουν αρκετά παρόμοια δέντρα που δεν προσφέρουν μεγάλη ποικιλία στο σύνολο και τα οποία θα αρχίσουν να έχουν υπερβολική δύναμη ψήφου και στρέψτε το σύνολο ώστε να είναι υπερβολικά προσαρμοσμένο στο σύνολο δεδομένων εκπαίδευσης, βλάπτοντας τη γενίκευση στο σύνολο επικύρωσης.

Υπήρχε μια υπόθεση νωρίτερα σχετικά με την ύπαρξη περισσότερων δέντρων και πώς θα μπορούσε να βελτιώσει τα αποτελέσματα του μοντέλου. Ας ρίξουμε μια ματιά στα αποτελέσματα, ας δημιουργήσουμε ένα νέο μοντέλο και ας δούμε αν ισχύει η υπόθεση!

Αξιολόγηση του RandomForestClassifier

Το Scikit-Learn διευκολύνει τη δημιουργία βασικών γραμμών παρέχοντας α DummyClassifier, το οποίο εξάγει προβλέψεις χωρίς τη χρήση των δυνατοτήτων εισαγωγής (εντελώς τυχαίες έξοδοι). Εάν το μοντέλο σας είναι καλύτερο από το DummyClassifier, μερικοί η μάθηση γίνεται! Για να μεγιστοποιήσετε τη μάθηση – μπορείτε να δοκιμάσετε αυτόματα διάφορες υπερπαραμέτρους χρησιμοποιώντας α RandomizedSearchCV or GridSearchCV. Εκτός από τη βασική γραμμή, μπορείτε να αξιολογήσετε την απόδοση του μοντέλου σας από το φακό πολλών μετρήσεων.

Ορισμένες παραδοσιακές μετρήσεις ταξινόμησης που μπορούν να χρησιμοποιηθούν για την αξιολόγηση του αλγόριθμου είναι η ακρίβεια, η ανάκληση, η βαθμολογία f1, η ακρίβεια και ο πίνακας σύγχυσης. Ακολουθεί μια σύντομη εξήγηση για καθένα από αυτά:

  1. Ακρίβεια: όταν ο στόχος μας είναι να κατανοήσουμε ποιες σωστές τιμές πρόβλεψης θεωρήθηκαν σωστές από τον ταξινομητή μας. Η ακρίβεια θα διαιρέσει αυτές τις αληθινές θετικές τιμές με τα δείγματα που είχαν προβλεφθεί ως θετικά.

$$
precision = frac{text{true positives}}{text{true positives} + text{false positives}}
$$

  1. Ανάκληση: συνήθως υπολογίζεται μαζί με ακρίβεια για να κατανοήσουμε πόσα από τα αληθινά θετικά εντοπίστηκαν από τον ταξινομητή μας. Η ανάκληση υπολογίζεται διαιρώντας τα αληθινά θετικά με οτιδήποτε θα έπρεπε να είχε προβλεφθεί ως θετικό.

$$
ανάκληση = frac{text{true positives}}{text{true positives} + text{false negatives}}
$$

  1. Βαθμολογία F1: είναι η ισορροπημένη ή αρμονική μέση της ακρίβειας και της ανάκλησης. Η χαμηλότερη τιμή είναι 0 και η υψηλότερη είναι 1. Όταν f1-score ισούται με 1, σημαίνει ότι όλες οι κατηγορίες είχαν προβλεφθεί σωστά – αυτό είναι πολύ δύσκολο να επιτευχθεί με πραγματικά δεδομένα (εξαιρέσεις υπάρχουν σχεδόν πάντα).

$$
text{f1-score} = 2* frac{text{precision} * text{recal}}{text{precision} + text{recall}}
$$

  1. Πίνακας σύγχυσης: όταν πρέπει να γνωρίζουμε πόσα δείγματα πήραμε σωστά ή λάθος κάθε τάξη. Καλούνται οι τιμές που ήταν σωστές και σωστά προβλεπόμενες αληθινά θετικά, λέγονται αυτά που είχαν προβλεφθεί ως θετικά αλλά δεν ήταν θετικά ψευδώς θετικά. Η ίδια ονοματολογία του αληθινά αρνητικά και ψευδώς αρνητικά χρησιμοποιείται για αρνητικές τιμές.

  2. Ακρίβεια: περιγράφει πόσες προβλέψεις είχε σωστές ο ταξινομητής μας. Η χαμηλότερη τιμή ακρίβειας είναι 0 και η υψηλότερη είναι 1. Αυτή η τιμή συνήθως πολλαπλασιάζεται επί 100 για να ληφθεί ένα ποσοστό:

$$
ακρίβεια = frac{κείμενο{αριθμός σωστών προβλέψεων}}{text{συνολικός αριθμός προβλέψεων}}
$$

Σημείωση: Είναι πρακτικά αδύνατο να αποκτήσετε 100% ακρίβεια σε οποιαδήποτε πραγματικά δεδομένα θα θέλατε να εφαρμόσετε τη μηχανική εκμάθηση. Εάν δείτε έναν ταξινομητή ακρίβειας 100%, ή ακόμα και ένα αποτέλεσμα σχεδόν 100% - να είστε δύσπιστοι και να κάνετε αξιολόγηση. Μια κοινή αιτία για αυτά τα ζητήματα είναι η διαρροή δεδομένων (διαρροή μέρους του τεστ εκπαίδευσης σε ένα σύνολο δοκιμών, άμεσα ή έμμεσα). Δεν υπάρχει συναίνεση για το τι είναι «καλή ακρίβεια», κυρίως επειδή εξαρτάται από τα δεδομένα σας – μερικές φορές, η ακρίβεια 70% θα είναι υψηλή! Μερικές φορές, αυτή θα είναι πολύ χαμηλή ακρίβεια. Σε γενικές γραμμές, πάνω από το 70% είναι αρκετό για πολλά μοντέλα, αλλά αυτό εναπόκειται στον ερευνητή τομέα να το προσδιορίσει.

Μπορείτε να εκτελέσετε το ακόλουθο σενάριο για να εισαγάγετε τις απαραίτητες βιβλιοθήκες και να δείτε τα αποτελέσματα:

from sklearn.metrics import classification_report, confusion_matrix

cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk)')

print(classification_report(y_test,y_pred))

Η έξοδος θα μοιάζει κάπως έτσι:

                precision    recall  f1-score   support

           0       0.53      0.89      0.66        80
           1       0.57      0.17      0.26        76
           2       0.74      0.72      0.73        47

    accuracy                           0.58       203
   macro avg       0.61      0.59      0.55       203
weighted avg       0.59      0.58      0.53       203

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Στην αναφορά ταξινόμησης, παρατηρήστε ότι η ανάκληση είναι υψηλή, 0.89 για την κλάση 0, τόσο η ακρίβεια όσο και η ανάκληση είναι υψηλή για την κλάση 2, 0.74, 0.72 – και για την κατηγορία 1, είναι χαμηλή, ειδικά η ανάκληση 0.17 και ακρίβεια 0.57 . Η σχέση μεταξύ της ανάκλησης και της ακρίβειας και για τις τρεις κατηγορίες χωριστά αποτυπώνεται στο F1 σκορ, που είναι ο αρμονικός μέσος όρος μεταξύ ανάκλησης και ακρίβειας – το κάνει το μοντέλο καλά για την κλάση 0, αρκετά κακό για την κατηγορία 1 και αξιοπρεπές για την κατηγορία 2.

Το μοντέλο δυσκολεύεται πολύ κατά την αναγνώριση του περιπτώσεις μεσαίου κινδύνου.

Η ακρίβεια που επιτυγχάνεται από τον τυχαίο ταξινομητή δασών μας με μόνο 3 δέντρα είναι του 0.58 (58%) – αυτό σημαίνει ότι έχει λίγο περισσότερα από τα μισά αποτελέσματα σωστά. Αυτή είναι μια χαμηλή ακρίβεια και ίσως θα μπορούσε να βελτιωθεί με την προσθήκη περισσότερων δέντρων.

Εξετάζοντας τη μήτρα σύγχυσης, μπορούμε να δούμε ότι τα περισσότερα από τα λάθη είναι κατά την ταξινόμηση 52 εγγραφών μεσαίου κινδύνου ως χαμηλού κινδύνου, κάτι που δίνει περισσότερες πληροφορίες για τη χαμηλή ανάκληση της κατηγορίας 1. Είναι προκατειλημμένο προς την ταξινόμηση των ασθενών μεσαίου κινδύνου ως χαμηλού κινδύνου ασθενείς κινδύνου.

Ένα άλλο πράγμα που μπορεί να ελεγχθεί για να δημιουργήσει ακόμη περισσότερες πληροφορίες είναι ποια χαρακτηριστικά λαμβάνονται περισσότερο υπόψη από τον ταξινομητή κατά την πρόβλεψη. Αυτό είναι ένα σημαντικό βήμα που πρέπει να κάνετε εξηγήσιμα συστήματα μηχανικής μάθησης, και βοηθά στον εντοπισμό και τον μετριασμό της μεροληψίας στα μοντέλα.

Για να το δούμε αυτό, μπορούμε να έχουμε πρόσβαση στο feature_importances_ ιδιοκτησία του ταξινομητή. Αυτό θα μας δώσει μια λίστα με ποσοστά, ώστε να μπορούμε επίσης να έχουμε πρόσβαση στο feature_names_in_ ιδιότητα για να λάβετε το όνομα κάθε χαρακτηριστικού, να τα οργανώσετε σε ένα πλαίσιο δεδομένων, να τα ταξινομήσετε από το υψηλότερο στο χαμηλότερο και να σχεδιάσετε το αποτέλεσμα:


features_df = pd.DataFrame({'features': rfc.feature_names_in_, 'importances': rfc.feature_importances_ })


features_df_sorted = features_df.sort_values(by='importances', ascending=False)


g = sns.barplot(data=features_df_sorted, x='importances', y ='features', palette="rocket")
sns.despine(bottom = True, left = True)
g.set_title('Feature importances')
g.set(xlabel=None)
g.set(ylabel=None)
g.set(xticks=[])
for value in g.containers:
    g.bar_label(value, padding=2)

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Παρατηρήστε πώς ο ταξινομητής εξετάζει κυρίως το σακχάρου στο αίμα, μετά λίγη από τη διαστολική πίεση, τη θερμοκρασία του σώματος και λίγο την ηλικία για να λάβετε μια απόφαση, αυτό μπορεί επίσης να έχει να κάνει με τη χαμηλή ανάκληση στην κατηγορία 1, ίσως τα δεδομένα μεσαίου κινδύνου έχουν να κάνουν με χαρακτηριστικά που δεν λαμβάνεται πολύ υπόψη από το μοντέλο. Μπορείτε να προσπαθήσετε να παίξετε περισσότερο με τη σημασία των χαρακτηριστικών για να το διερευνήσετε και να δείτε εάν οι αλλαγές στο μοντέλο επηρεάζουν τις λειτουργίες που χρησιμοποιούνται, καθώς και εάν υπάρχει σημαντική σχέση μεταξύ ορισμένων από τα χαρακτηριστικά και των προβλεπόμενων κλάσεων.

Είναι επιτέλους καιρός να δημιουργήσουμε ένα νέο μοντέλο με περισσότερα δέντρα για να δούμε πώς επηρεάζει τα αποτελέσματα. Ας δημιουργήσουμε το rfc_ δάσος με 900 δέντρα, 8 επίπεδα και τον ίδιο σπόρο. Θα βελτιωθούν τα αποτελέσματα;

rfc_ = RandomForestClassifier(n_estimators=900, 
                             max_depth=7,
                             random_state=SEED)
rfc_.fit(X_train, y_train)
y_pred = rfc_.predict(X_test)

Υπολογισμός και εμφάνιση των μετρήσεων:

cm_ = confusion_matrix(y_test, y_pred)
sns.heatmap(cm_, annot=True, fmt='d').set_title('Maternal risks confusion matrix (0 = low risk, 1 = medium risk, 2 = high risk) for 900 trees with 8 levels')

print(classification_report(y_test,y_pred))

Αυτό βγάζει:

                precision    recall  f1-score   support

           0       0.68      0.86      0.76        80
           1       0.75      0.58      0.65        76
           2       0.90      0.81      0.85        47

    accuracy                           0.74       203
   macro avg       0.78      0.75      0.75       203
weighted avg       0.76      0.74      0.74       203

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Αυτό δείχνει πώς η προσθήκη περισσότερων δέντρων και πιο εξειδικευμένων δέντρων (υψηλότερα επίπεδα), έχει βελτιώσει τις μετρήσεις μας. Έχουμε ακόμα χαμηλή ανάκληση για την κατηγορία 1, αλλά η ακρίβεια είναι τώρα 74%. Η βαθμολογία F1 όταν ταξινομούνται περιπτώσεις υψηλού κινδύνου είναι 0.85, πράγμα που σημαίνει ότι οι περιπτώσεις υψηλού κινδύνου εντοπίζονται πλέον πιο εύκολα σε σύγκριση με 0.73 στο προηγούμενο μοντέλο!

Σε ένα καθημερινό έργο, μπορεί να είναι πιο σημαντικό να προσδιορίζονται περιπτώσεις υψηλού κινδύνου, για παράδειγμα με μια μέτρηση παρόμοια με την ακρίβεια, η οποία είναι επίσης γνωστή ως ευαισθησία στα στατιστικά στοιχεία. Δοκιμάστε να τροποποιήσετε ορισμένες από τις παραμέτρους του μοντέλου και παρατηρήστε τα αποτελέσματα.

Μέχρι τώρα, έχουμε αποκτήσει μια συνολική κατανόηση του τρόπου με τον οποίο το Random Forest μπορεί να χρησιμοποιηθεί για την ταξινόμηση δεδομένων - στην επόμενη ενότητα, μπορούμε να χρησιμοποιήσουμε το ίδιο σύνολο δεδομένων με διαφορετικό τρόπο για να δούμε πώς το ίδιο μοντέλο προβλέπει τιμές με παλινδρόμηση.

Χρήση τυχαίων δασών για παλινδρόμηση

Σε αυτή την ενότητα θα μελετήσουμε πώς ένας αλγόριθμος Random Forest μπορεί να χρησιμοποιηθεί για την επίλυση προβλημάτων παλινδρόμησης χρησιμοποιώντας το Scikit-Learn. Τα βήματα που ακολουθούνται για την εφαρμογή αυτού του αλγόριθμου είναι σχεδόν πανομοιότυπα με τα βήματα που εκτελούνται για την ταξινόμηση, εκτός από τον τύπο του μοντέλου και τον τύπο των προβλεπόμενων δεδομένων – που τώρα θα είναι συνεχείς τιμές – υπάρχει μόνο μία διαφορά στην προετοιμασία των δεδομένων.

Αφού η παλινδρόμηση γίνεται για αριθμητικές τιμές – ας διαλέξουμε μια αριθμητική τιμή από το σύνολο δεδομένων. Είδαμε ότι το σάκχαρο στο αίμα ήταν σημαντικό στην ταξινόμηση, επομένως θα πρέπει να είναι προβλέψιμο με βάση άλλα χαρακτηριστικά (αφού εάν συσχετίζεται με κάποιο χαρακτηριστικό, αυτό το χαρακτηριστικό συσχετίζεται επίσης με αυτό).

Ακολουθώντας όσα κάναμε για την ταξινόμηση, ας εισάγουμε πρώτα τις βιβλιοθήκες και το ίδιο σύνολο δεδομένων. Εάν το έχετε κάνει ήδη για το μοντέλο ταξινόμησης, μπορείτε να παραλείψετε αυτό το μέρος και να πάτε απευθείας στην προετοιμασία δεδομένων για εκπαίδευση.

Εισαγωγή Βιβλιοθηκών και Δεδομένων
import pandas as pd
import numpy as np
import maplotlib.pyplot as plt
import seaborn as sns

dataset = pd.read_csv("../../datasets/random-forest/maternal_health_risk.csv")
Προεπεξεργασία δεδομένων για παλινδρόμηση

Αυτή είναι μια εργασία παλινδρόμησης, επομένως αντί να προβλέπουμε κλάσεις, μπορούμε να προβλέψουμε μία από τις αριθμητικές στήλες του συνόλου δεδομένων. Σε αυτό το παράδειγμα, το BS στήλη θα προβλεφθεί. Αυτό σημαίνει το y δεδομένα θα περιέχουν δεδομένα σακχάρου στο αίμα, να X Τα δεδομένα θα περιέχουν όλα τα χαρακτηριστικά εκτός από το σάκχαρο του αίματος. Μετά τον διαχωρισμό των X και y δεδομένα, μπορούμε να χωρίσουμε το τρένο και τα σετ δοκιμών:

from sklearn.model_selection import train_test_split

SEED = 42

y = dataset['BS']
X = dataset.drop(['BS'], axis=1) 

X_train, X_test, y_train, y_test = train_test_split(X, y, 
                                                    test_size=0.2, 
                                                    random_state=SEED)
Εκπαίδευση ενός RandomForestRegressor

Τώρα που έχουμε κλιμακώσει το σύνολο δεδομένων μας, είναι καιρός να εκπαιδεύσουμε τον αλγόριθμό μας για να λύσουμε αυτό το πρόβλημα παλινδρόμησης, να το αλλάξουμε λίγο – θα δημιουργήσουμε ένα μοντέλο με 20 δέντρα στο δάσος και το καθένα με 4 επίπεδα. Για να το κάνετε, μπορείτε να εκτελέσετε τον ακόλουθο κώδικα:

from sklearn.ensemble import RandomForestRegressor

rfr = RandomForestRegressor(n_estimators=20, 
                            max_depth=3, 
                            random_state=SEED)

rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_test)

Μπορείτε να βρείτε λεπτομέρειες για όλες τις παραμέτρους του RandomForestRegressor στην επίσημη τεκμηρίωση.

Εφόσον η γραφική παράσταση και η εξέταση 20 δέντρων θα απαιτούσε λίγο χρόνο και αφοσίωση, μπορούμε να σχεδιάσουμε μόνο το πρώτο για να ρίξουμε μια ματιά στο πώς διαφέρει από το δέντρο ταξινόμησης:

from sklearn import tree

features = X.columns

first_tree = rfr.estimators_[0]

plt.figure(figsize=(15,6))
tree.plot_tree(first_tree,
               feature_names=features,
               fontsize=8, 
               filled=True, 
               rounded=True);

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Παρατηρήστε ότι το δέντρο παλινδρόμησης έχει ήδη μια τιμή που έχει εκχωρηθεί στα δεδομένα που εμπίπτουν σε κάθε κόμβο. Αυτές είναι οι τιμές που θα υπολογιστούν κατά μέσο όρο όταν συνδυάζονται τα 20 δέντρα. Ακολουθώντας αυτό που κάναμε με την ταξινόμηση, μπορείτε επίσης να σχεδιάσετε τη σημασία των χαρακτηριστικών για να δείτε ποιες μεταβλητές λαμβάνει περισσότερο υπόψη το μοντέλο παλινδρόμησης κατά τον υπολογισμό τιμών.

Είναι καιρός να προχωρήσετε στο τελευταίο και τελευταίο βήμα κατά την επίλυση ενός προβλήματος μηχανικής μάθησης και να αξιολογήσετε την απόδοση του αλγορίθμου!

Αξιολόγηση ενός RandomForestRegressor

Για προβλήματα παλινδρόμησης οι μετρήσεις που χρησιμοποιούνται για την αξιολόγηση ενός αλγορίθμου είναι το μέσο απόλυτο σφάλμα (MAE), το μέσο τετράγωνο σφάλμα (MSE) και το ριζικό μέσο τετράγωνο σφάλμα (RMSE).

  1. Μέσο απόλυτο σφάλμα (MAE): όταν αφαιρέσουμε τις προβλεπόμενες τιμές από τις πραγματικές τιμές, λαμβάνοντας τα σφάλματα, αθροίζουμε τις απόλυτες τιμές αυτών των σφαλμάτων και παίρνουμε τον μέσο όρο τους. Αυτή η μέτρηση δίνει μια έννοια του συνολικού σφάλματος για κάθε πρόβλεψη του μοντέλου, όσο μικρότερο (πιο κοντά στο 0) τόσο το καλύτερο.

$$
mae = (frac{1}{n})sum_{i=1}^{n}αριστερά | Πραγματικό – Προβλεπόμενο σωστό |
$$

Σημείωση: Μπορεί επίσης να συναντήσετε το y και ŷ σημειογραφία στις εξισώσεις. ο y αναφέρεται στις πραγματικές τιμές και το ŷ στις προβλεπόμενες τιμές.

  1. Μέσο τετράγωνο σφάλμα (MSE): είναι παρόμοια με τη μέτρηση MAE, αλλά τετραγωνίζει τις απόλυτες τιμές των σφαλμάτων. Επίσης, όπως και με το MAE, όσο μικρότερο ή πιο κοντά στο 0, τόσο το καλύτερο. Η τιμή του MSE τετραγωνίζεται έτσι ώστε τα μεγάλα σφάλματα να γίνονται ακόμη μεγαλύτερα. Ένα πράγμα που πρέπει να προσέξετε πολύ, είναι ότι είναι συνήθως μια μέτρηση που είναι δύσκολο να ερμηνευτεί λόγω του μεγέθους των τιμών της και του γεγονότος ότι δεν βρίσκονται στην ίδια κλίμακα των δεδομένων.

$$
mse = sum_{i=1}^{D}(Πραγματικό – Προβλεπόμενο)^2
$$

  1. Σφάλμα ρίζας μέσου τετραγώνου (RMSE): προσπαθεί να λύσει το πρόβλημα ερμηνείας που τέθηκε με το MSE παίρνοντας την τετραγωνική ρίζα της τελικής του τιμής, έτσι ώστε να το κλιμακώσει ξανά στις ίδιες μονάδες των δεδομένων. Είναι ευκολότερο στην ερμηνεία και καλό όταν χρειάζεται να εμφανίσουμε ή να δείξουμε την πραγματική τιμή των δεδομένων με το σφάλμα. Δείχνει πόσο μπορεί να διαφέρουν τα δεδομένα, επομένως, εάν έχουμε RMSE 4.35, το μοντέλο μας μπορεί να κάνει σφάλμα είτε επειδή πρόσθεσε 4.35 στην πραγματική τιμή είτε χρειάστηκε 4.35 για να φτάσει στην πραγματική τιμή. Όσο πιο κοντά στο 0, τόσο το καλύτερο.

$$
rmse = sqrt{ sum_{i=1}^{D}(Πραγματικό – Προβλεπόμενο)^2}
$$

Μπορούμε να χρησιμοποιήσουμε οποιαδήποτε από αυτές τις τρεις μετρήσεις για να συγκρίνουν μοντέλα (αν χρειαστεί να επιλέξουμε ένα). Μπορούμε επίσης να συγκρίνουμε το ίδιο μοντέλο παλινδρόμησης με διαφορετικές τιμές ορίσματος ή με διαφορετικά δεδομένα και στη συνέχεια να εξετάσουμε τις μετρήσεις αξιολόγησης. Αυτό είναι γνωστό ως συντονισμός υπερπαραμέτρων – συντονισμός των υπερπαραμέτρων που επηρεάζουν έναν αλγόριθμο μάθησης και παρατήρηση των αποτελεσμάτων.

Κατά την επιλογή μεταξύ των μοντέλων, αυτά με τα μικρότερα σφάλματα, συνήθως αποδίδουν καλύτερα. Κατά την παρακολούθηση μοντέλων, εάν οι μετρήσεις χειροτέρευαν, τότε μια προηγούμενη έκδοση του μοντέλου ήταν καλύτερη ή υπήρξε κάποια σημαντική αλλαγή στα δεδομένα ώστε το μοντέλο να έχει χειρότερη απόδοση από αυτή που είχε.

Μπορείτε να χρησιμοποιήσετε τον ακόλουθο κώδικα για να βρείτε αυτές τις τιμές:

from sklearn.metrics import mean_absolute_error, mean_squared_error

print('Mean Absolute Error:', mean_absolute_error(y_test, y_pred))
print('Mean Squared Error:', mean_squared_error(y_test, y_pred))
print('Root Mean Squared Error:', np.sqrt(mean_squared_error(y_test, y_pred)))

Η έξοδος θα πρέπει να είναι:

Mean Absolute Error: 1.127893702896059
Mean Squared Error: 3.0802988503933326
Root Mean Squared Error: 1.755078018320933

Με 20 δέντρα, το ριζικό μέσο τετράγωνο σφάλμα είναι 1.75, το οποίο είναι χαμηλό, αλλά ακόμα κι έτσι - αυξάνοντας τον αριθμό των δέντρων και πειραματίζοντας με τις άλλες παραμέτρους, αυτό το σφάλμα θα μπορούσε πιθανώς να γίνει ακόμη μικρότερο.

Πλεονεκτήματα της χρήσης Random Forest

Όπως με κάθε αλγόριθμο, υπάρχουν πλεονεκτήματα και μειονεκτήματα στη χρήση του. Στις επόμενες δύο ενότητες θα ρίξουμε μια ματιά στα πλεονεκτήματα και τα μειονεκτήματα της χρήσης τυχαίου δάσους για ταξινόμηση και παλινδρόμηση.

  1. Ο αλγόριθμος του τυχαίου δάσους δεν είναι προκατειλημμένος, καθώς υπάρχουν πολλά δέντρα και κάθε δέντρο εκπαιδεύεται σε ένα τυχαίο υποσύνολο δεδομένων. Βασικά, ο αλγόριθμος του τυχαίου δάσους βασίζεται στη δύναμη του «πλήθους». επομένως ο συνολικός βαθμός μεροληψίας του αλγορίθμου μειώνεται.
  2. Αυτός ο αλγόριθμος είναι πολύ σταθερός. Ακόμα κι αν ένα νέο σημείο δεδομένων εισαχθεί στο σύνολο δεδομένων, ο συνολικός αλγόριθμος δεν επηρεάζεται πολύ, καθώς τα νέα δεδομένα μπορεί να επηρεάσουν ένα δέντρο, αλλά είναι πολύ δύσκολο για αυτό να επηρεάσει όλα τα δέντρα.
  3. Ο αλγόριθμος τυχαίου δάσους λειτουργεί καλά όταν έχετε τόσο κατηγορικά όσο και αριθμητικά χαρακτηριστικά.
  4. Ο αλγόριθμος τυχαίου δάσους λειτουργεί επίσης καλά όταν λείπουν τιμές ή δεν έχουν κλιμακωθεί.

Μειονεκτήματα της χρήσης Random Forest

  1. Το κύριο μειονέκτημα των τυχαίων δασών έγκειται στην πολυπλοκότητά τους. Απαιτούν πολύ περισσότερους υπολογιστικούς πόρους, λόγω του μεγάλου αριθμού δέντρων αποφάσεων που ενώνονται μεταξύ τους, όταν εκπαιδεύονται μεγάλα σύνολα. Ωστόσο – με σύγχρονο υλικό, η εκπαίδευση ακόμη και σε ένα μεγάλο τυχαίο δάσος δεν απαιτεί πολύ χρόνο.

Going Further – Hand-held End-to-End Project

Η περιπετειώδης φύση σας σας κάνει να θέλετε να πάτε παραπέρα; Σας προτείνουμε να ελέγξετε το δικό μας Καθοδηγούμενο Έργο: «Πρόβλεψη τιμών σπιτιού – Μηχανική μάθηση στην Python».

Οριστικός οδηγός για τον αλγόριθμο Random Forest με Python και Scikit-Learn PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Σε αυτό το καθοδηγούμενο έργο – θα μάθετε πώς να δημιουργείτε ισχυρά παραδοσιακά μοντέλα μηχανικής μάθησης καθώς και μοντέλα βαθιάς μάθησης, να χρησιμοποιείτε το Ensemble Learning και να εκπαιδεύετε μετα-μαθητές για να προβλέψετε τις τιμές των σπιτιών από μια τσάντα μοντέλων Scikit-Learn και Keras.

Χρησιμοποιώντας το Keras, το API βαθιάς εκμάθησης που έχει δημιουργηθεί πάνω από το Tensorflow, θα πειραματιστούμε με αρχιτεκτονικές, θα δημιουργήσουμε ένα σύνολο από στοιβαγμένα μοντέλα και θα εκπαιδεύσουμε μετα-μαθητής νευρωνικό δίκτυο (μοντέλο επιπέδου 1) για να υπολογίσετε την τιμολόγηση ενός σπιτιού.

Η βαθιά μάθηση είναι εκπληκτική – αλλά προτού καταφύγετε σε αυτήν, συνιστάται επίσης να προσπαθήσετε να λύσετε το πρόβλημα με απλούστερες τεχνικές, όπως με ρηχή μάθηση αλγόριθμους. Η βασική μας απόδοση θα βασίζεται σε α Τυχαία παλινδρόμηση δασών αλγόριθμος. Επιπλέον – θα εξερευνήσουμε τη δημιουργία συνόλων μοντέλων μέσω του Scikit-Learn μέσω τεχνικών όπως π.χ. σακκόπανο και ψηφοφορία.

Αυτό είναι ένα έργο από άκρο σε άκρο και όπως όλα τα έργα Machine Learning, θα ξεκινήσουμε με – με Διερευνητική Ανάλυση Δεδομένων, Ακολουθούμενη από Προεπεξεργασία δεδομένων και τελικά Ρηχό κτίριο και Μοντέλα Deep Learning για να ταιριάζει με τα δεδομένα που έχουμε εξερευνήσει και καθαρίσει προηγουμένως.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse