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

Λάβετε σημαντικές δυνατότητες για τυχαία δάση με Python και Scikit-Learn

Εισαγωγή

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

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

Ένα σημαντικό πράγμα που πρέπει να θυμάστε όταν χρησιμοποιείτε Τυχαία Δάση είναι ότι ο αριθμός των δέντρων είναι μια υπερπαράμετρος και θα οριστεί πριν από την εκτέλεση του μοντέλου.

Όταν εργάζεστε στην επιστήμη δεδομένων, ένας από τους λόγους για τους οποίους επιλέχθηκε ένα μοντέλο Τυχαίας Δάσους για ένα συγκεκριμένο έργο μπορεί να έχει να κάνει με την ικανότητα να εξετάζετε τα δέντρα και να κατανοείτε WHY έγινε ταξινόμηση, ή WHY δόθηκε μια τιμή - αυτό ονομάζεται εξηγησιμότητα.

Λαμβάνοντας υπόψη αλγόριθμους που βασίζονται σε δέντρα, η προσπάθεια εξήγησης ενός μοντέλου μπορεί να γίνει με διάφορους τρόπους, με την εμφάνιση και την εξέταση κάθε δέντρου (μπορεί να είναι δύσκολο αν το μοντέλο έχει 200 ​​δέντρα ή περισσότερα), χρησιμοποιώντας Τιμές Shapley (ή SHAP)., εξετάζοντας τα χαρακτηριστικά που ελήφθησαν περισσότερο υπόψη από το μοντέλο, χρησιμοποιώντας ΑΣΒΕΣΤΟΣ για τη διερεύνηση των σχέσεων μεταξύ εισόδου και εξόδου μοντέλου, κ.λπ. Συνήθως, χρησιμοποιείται ένας συνδυασμός όλων των μεθόδων.

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

Για να γίνει αυτό, ας εισαγάγουμε τις απαραίτητες βιβλιοθήκες, ας φορτώσουμε το σύνολο δεδομένων Palmer Penguins, διαχωρίζουμε τα δεδομένα, δημιουργούμε το μοντέλο, λαμβάνουμε τη σημασία των χαρακτηριστικών και χρησιμοποιούμε το Seaborn για να τα σχεδιάσουμε! Δεν θα εμβαθύνουμε πολύ στα δεδομένα, στο EDA ή στο ίδιο το μοντέλο – αυτά είναι το θέμα του ειδικού οδηγού.

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

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

Ας ξεκινήσουμε εισάγοντας μερικές βιβλιοθήκες που θα χρησιμοποιήσουμε:


import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier


raw_data_url = "https://gist.githubusercontent.com/cassiasamp/197b4e070f5f4da890ca4d226d088d1f/raw/38c9d4906ed121481b4dc201fa2004f2b3d0065f/penguins.csv"
df = pd.read_csv(raw_data_url)

Διαχωρισμός των δεδομένων

Ας χωρίσουμε τα δεδομένα για εκπαίδευση και δοκιμή:


df = df.dropna().drop("rowid", axis=1)


y = df["species"]
X = df[["bill_length_mm", "bill_depth_mm", "flipper_length_mm"]]


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

Λήψη σημαντικών χαρακτηριστικών

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


rf = RandomForestClassifier()


rf.fit(X_train, y_train)


rf.feature_importances_

Αυτό βγάζει:

array([0.41267633, 0.30107056, 0.28625311])

Αυτές είναι οι τιμές των χαρακτηριστικών, για να δείτε ονόματα χαρακτηριστικών, εκτελέστε:


rf.feature_names_in_

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

array(['bill_length_mm', 'bill_depth_mm', 'flipper_length_mm'],
      dtype=object)

Αυτό σημαίνει ότι το πιο σημαντικό χαρακτηριστικό για τον καθορισμό των κατηγοριών peguin για το συγκεκριμένο μοντέλο ήταν το bill_length_mm!

Η σημασία είναι σχετική με το μέτρο του πόσο καλά διαχωρίζονται τα δεδομένα σε κάθε διαχωρισμό κόμβου – σε αυτή την περίπτωση, το μέτρο δίνεται από το Δείκτης Gini – η τιμή gini στη συνέχεια σταθμίζεται με το πόσες σειρές έχουν χωριστεί κατά τη χρήση του bill_length_mm χαρακτηριστικό και κατά μέσο όρο πάνω από 100 δέντρα του συνόλου. Το αποτέλεσμα αυτών των βημάτων υπολογίζεται 0.41267633, ή περισσότερο από 40% σε αυτήν την περίπτωση.

Οπτικοποίηση της σημασίας χαρακτηριστικών

Ένας συνηθισμένος τρόπος αναπαράστασης τιμών σημασίας είναι η χρήση συνομιλιών με μπαρ. Ας δημιουργήσουμε πρώτα ένα πλαίσιο δεδομένων με τα ονόματα των χαρακτηριστικών και την αντίστοιχη σημασία τους και, στη συνέχεια, ας τα οπτικοποιήσουμε χρησιμοποιώντας το Seaborn's barplot():


importances_df = pd.DataFrame({"feature_names" : rf.feature_names_in_, 
                               "importances" : rf.feature_importances_})
                             

g = sns.barplot(x=importances_df["feature_names"], 
                y=importances_df["importances"])
g.set_title("Feature importances", fontsize=14);                          

Συμβουλές: Μια καλή πρακτική κατά την παρουσίαση πληροφοριών είναι να ταξινομούνται οι τιμές είτε σε αύξουσα είτε με φθίνουσα σειρά. Σε αυτή την περίπτωση, τα δεδομένα έχουν ήδη παραγγελθεί, με την πρώτη τιμή να είναι η πρώτη που θέλουμε να μάθουμε. Όταν αυτό δεν συμβαίνει, μπορείτε να παραγγείλετε το πλαίσιο δεδομένων με sort_values. Αυτό μπορεί να γίνει σε οποιαδήποτε στήλη με αύξουσα ή φθίνουσα σειρά: importances_df.sort_values(by="importances", ascending=False).

Όταν εξετάζετε αυτήν την πρώτη γραφική παράσταση, είναι πιο δύσκολο να ερμηνεύσετε την αξία της σημασίας κάθε χαρακτηριστικού. Είναι προφανές ότι το μήκος του λογαριασμού είναι μεγαλύτερο από τις άλλες δύο ράβδους, αλλά όχι ακριβώς αυτό bill_depth_mm είναι ισοδύναμο με 0.30107056, και ότι το flipper_length_mm είναι 0.28625311. Έτσι, αυτό το πρώτο γράφημα μπορεί να βελτιωθεί εμφανίζοντας την τιμή κάθε ράβδου. Αυτό μπορεί να γίνει με πρόσβαση στο Seaborn's containers αντικείμενο. Αποθηκεύει πληροφορίες για κάθε γραμμή και μεταβιβάζει τις τιμές ως ετικέτες ράβδων:

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
                

sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)


g.set(xticks=[])
g.set_title("Feature importances", fontsize=14)
for value in g.containers:
    g.bar_label(value)

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

Παρατηρήστε πώς μετά την αφαίρεση των κροτώνων, οι ετικέτες Y και X είναι λίγο δύσκολο να διαβαστούν. Η ετικέτα Y, feature_names, είναι κατακόρυφο και στον άξονα Χ, υπάρχουν μόνο importances. Δεδομένου ότι ο τίτλος δηλώνει ήδη ότι το γράφημα είναι του Σημασία χαρακτηριστικών, μπορούμε επίσης να αφαιρέσουμε τις ετικέτες των αξόνων:

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])


g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value)

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

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names",
                
                
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("Feature importances", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, 
                padding=2) 

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

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

g = sns.barplot(data=importances_df, 
                x="importances", 
                y="feature_names", 
                palette="mako")
sns.despine(bottom=True, left=True)
g.set_title("The penguin's bill length was the most important feature for species classification (RF base model)", fontsize=14)
g.set(xticks=[])
g.set(xlabel=None)
g.set(ylabel=None)
for value in g.containers:
    g.bar_label(value, padding=2)

Αυτό είναι το τελικό αποτέλεσμα του γραφήματος σημαντικών χαρακτηριστικών:

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

Συμπέρασμα

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

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

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