Πώς να επιλέξετε τον αριθμό των εκτιμητών για Gradient Boosting

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

Χρησιμοποιώντας το Scikit-Learn, θα βρείτε τον αλγόριθμο Random Forest, που είναι το είδος του μοντέλου συνόλου. Από την άλλη, θα βρείτε και μοντέλα Boosting, που εκπαιδεύουν τους εκτιμητές στη σειρά, όπου το αποτέλεσμα του ενός μοντέλου περνά στο επόμενο, που θα προσπαθήσουν να βελτιώσουν τις προβλέψεις, μέχρι να φτάσουν στο βέλτιστο αποτέλεσμα.

Κατά τη δημιουργία ενός εκτιμητή Gradient Boosting, θα βρείτε αυτήν την υπερπαράμετρο n_estimator=100 με προεπιλεγμένη τιμή 100 δέντρα που θα δημιουργηθούν για να φτάσετε σε ένα αποτέλεσμα. Πολλές φορές, το ρυθμίζουμε απλώς στην προεπιλογή ή ίσως το αυξάνουμε ανάλογα με τις ανάγκες, ακόμη και χρησιμοποιώντας τεχνικές Grid Search.

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

Το Gradient Boosting μπορεί να φορτωθεί από το Scikit-Learn χρησιμοποιώντας αυτήν την κλάση from sklearn.ensemble import GradientBoostingRegressor. Ο αλγόριθμος Gradient Boosting μπορεί να χρησιμοποιηθεί είτε για ταξινόμηση είτε για μοντέλα παλινδρόμησης. Είναι ένας εκτιμητής που βασίζεται σε δέντρα — που σημαίνει ότι αποτελείται από πολλά δέντρα απόφασης.

Το αποτέλεσμα του Δέντρο 1 θα δημιουργήσει σφάλματα. Αυτά τα σφάλματα θα χρησιμοποιηθούν και η είσοδος για το Δέντρο 2. Για άλλη μια φορά, θα χρησιμοποιηθούν τα σφάλματα του τελευταίου μοντέλου και η είσοδος του επόμενου, μέχρι να φτάσει στο n_estimators αξία.

Κάθε μοντέλο θα ταιριάζει με τα λάθη του προηγούμενου. Εικόνα από τον συγγραφέα.

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

Ας δούμε πώς να το κάνουμε τώρα.

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

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

# Σύνολο δεδομένων
df = sns.load_dataset('car_crashes')

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

Στοιχεία δεδομένων Car Crashes, από τη θάλασσα. Εικόνα από τον συγγραφέα.

Βλέποντας γρήγορα τους συσχετισμούς.

# Συσχετισμοί
df.corr().style.background_gradient(cmap='coolwarm')
Συσχετίσεις στο σύνολο δεδομένων. Εικόνα από τον συγγραφέα.

Εντάξει, καμία σημαντική πολυσυγγραμμικότητα. Μπορούμε να το δούμε αυτό ins_premium και ins_losses δεν συσχετίζονται πολύ καλά με το total , οπότε δεν θα τα εξετάσουμε στο μοντέλο.

Αν ελέγξουμε τα στοιχεία που λείπουν, δεν υπάρχουν

# Λείπει
df.isnull (). άθροισμα ()
0

Ωραία, οπότε ας χωρίσουμε τα δεδομένα τώρα.

# X και y
X = df.drop(['ins_premium', 'ins_losses', 'abbrrev', 'total'], axis=1)
y = df['σύνολο']
# Δοκιμή τρένου
X_train, X_test, y_train, y_test = train_test_split (X, y, test_size = 0.3, random_state = 22)

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

Χρησιμοποιώ 500 εκτιμητές με α learning_rate της 0.3.

Ο ρυθμός εκμάθησης είναι το μέγεθος του βήματος που κάνουμε για να φτάσουμε στο ελάχιστο σφάλμα. Εάν χρησιμοποιήσουμε μια τιμή που είναι πολύ υψηλή, μπορεί να περάσουμε το ελάχιστο. Εάν χρησιμοποιήσουμε έναν αριθμό που είναι πολύ μικρός, μπορεί να μην τον πλησιάσουμε καν. Έτσι, ένας εμπειρικός κανόνας που μπορείτε να λάβετε υπόψη είναι: εάν έχετε μεγάλο αριθμό εκτιμητών, μπορείτε να χρησιμοποιήσετε χαμηλότερες τιμές του ρυθμού εκμάθησης. Εάν έχετε μόνο λίγους εκτιμητές, προτιμήστε να χρησιμοποιείτε υψηλότερες τιμές ρυθμού εκμάθησης.

βήματα = [('κλίμακα', StandardScaler()),
('GBR', GradientBoostingRegressor(n_estimators=500, learning_rate=0.03)) ]
# Παράδειγμα αγωγού και τοποθέτηση
σωλήνας = Pipeline(steps).fit(X_train, y_train)
# Πρόβλεψε
preds = pipe.predict(X_test)

Τώρα, αξιολογώντας.

# RMSE των προβλέψεων
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds)),1 )}')
[ΕΞΟΔΟΣ]: RMSE: 1.1# Μέσος όρος των πραγματικών τιμών Y
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]: Δεδομένα y σημαίνει: 15.8

Καλός. Το RMSE μας είναι περίπου 6.9% του μέσου όρου. Οπότε, κατά μέσο όρο είμαστε πολύ μακριά.

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

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

#Μοντέλο
gbr = GradientBoostingRegressor(n_estimators=500, learning_rate=0.3).fit(X_train, y_train)

Τώρα είναι το καλό. Υπάρχει μια μέθοδος στο Gradient Boosting που μας επιτρέπει να επαναλαμβάνουμε τις προβλέψεις κάθε εκπαιδευμένου εκτιμητή, από το 1 έως το 500. Έτσι, θα δημιουργήσουμε έναν βρόχο που θα διέρχεται από τους 500 εκτιμητές στο gbr μοντέλο, προβλέπει αποτελέσματα χρησιμοποιώντας τη μέθοδο staged_predict(), υπολογίζει το μέσο τετράγωνο σφάλμα και αποθηκεύει το αποτέλεσμα στη λίστα errors.

# Κάντε βρόχο για τον καλύτερο αριθμό
errors = [ mean_squared_error(y_test, preds) for preds στο gbr.staged_predict(X_test)]
# Βέλτιστος αριθμός εκτιμητών
optimal_num_estimators = np.argmin(σφάλματα) + 1

Στη συνέχεια, μπορούμε να σχεδιάσουμε το αποτέλεσμα.

#Οικόπεδο
g=sns.lineplot(x=range(500), y=errors)
g.set_title(f'Καλύτερος αριθμός εκτιμητών στο {best_n_estimators}', size=15);
Καλύτερος αριθμός εκτιμητών. Εικόνα από τον συγγραφέα.

Βλέπουμε ότι το χαμηλότερο ποσοστό σφάλματος είναι με 34 εκτιμητές. Λοιπόν, ας επανεκπαιδεύσουμε το μοντέλο μας με 34 εκτιμητές και ας συγκρίνουμε με το αποτέλεσμα από το μοντέλο που εκπαιδεύτηκε με τον αγωγό.

# Επανεκπαίδευση
gbr = GradientBoostingRegressor(n_estimators=34, learning_rate=0.3).fit(X_train, y_train)
# Προβλέψεις
preds2 = gbr.predict(X_test)

Αξιολόγηση…

# RMSE των προβλέψεων
print(f'RMSE: { round(np.sqrt(mean_squared_error(y_test, preds2)),1 )}')
[ΕΞΟΔΟΣ]: RMSE: 1.0
# Δεδομένα Y σημαίνει
print(f'Data y mean: {round( y.mean(),1 )}')
[OUT]: Δεδομένα y σημαίνει: 15.8

Περάσαμε από το 6.9% στο 6.3% τώρα. Περίπου 9% καλύτερα. Ας δούμε μερικές προβλέψεις.

Προβλέψεις και από τα δύο μοντέλα. Εικόνα από τον συγγραφέα.

Ενδιαφέροντα αποτελέσματα. Μερικές από τις προβλέψεις του δεύτερου μοντέλου είναι καλύτερες από το πρώτο.

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

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

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

Εδώ είναι το πλήρης κώδικας στο GitHub.

Αν σας άρεσε αυτό το περιεχόμενο, ακολουθήστε το blog μου.

Βρείτε με LinkedIn.

Αυτή η άσκηση βασίστηκε στο εξαιρετικό βιβλίο του Aurélien Géron, στην αναφορά.

Πώς να επιλέξετε τον αριθμό των εκτιμητών για την ενίσχυση κλίσης που αναδημοσιεύονται από την Πηγή https://towardsdatascience.com/how-to-choose-the-number-of-estimators-for-gradient-boosting-8d06920ab891?source=rss—-7f60cf5620c9— 4 μέσω https://towardsdatascience.com/feed

Si al principi no tens èxit, aleshores el paracaigudisme no és per a tu.

->

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

Περισσότερα από Σύμβουλοι Blockchain