Il existe de nombreux articles de blog, vidéos YouTube, etc. sur les idées d' ensachage ou de renforcement des arbres. Ma compréhension générale est que le pseudo-code pour chacun est:
Ensachage:
- Prélever N échantillons aléatoires de x% des échantillons et y% des fonctionnalités
- Ajustez votre modèle (par exemple, arbre de décision) sur chacun des N
- Prédire avec chaque N
- Moyenne des prédictions pour obtenir la prédiction finale
Boosting:
- Adapter votre modèle (par exemple, arbre de décision) à vos données
- Obtenez les résidus
- Ajustez votre modèle aux résidus
- Passez à 2 pour N rounds de boost
- La prédiction finale est une somme pondérée des prédicteurs séquentiels.
Je vais apporter des clarifications à ma compréhension ci-dessus, mais ma question est la suivante:
Les deux XGBoost et LightGBM ont des paramètres qui permettent l'ensachage. L'application n'est pas Bagging OR Boosting (ce dont parlent tous les articles de blog), mais Bagging AND Boosting. Quel est le pseudo-code pour savoir où et quand l'ensachage et le boosting combinés ont lieu?
Je m'attendais à ce qu'il s'agisse de "Boosted Boosted Trees", mais il semble que ce soit "Boosted Bagged Trees". La différence semble substantielle.
Arbres boostés en sac:
- Prélever N échantillons aléatoires de x% des échantillons et y% des fonctionnalités
- Ajuster les arbres boostés sur chacun des N échantillons
- Prédire avec chaque N
- Moyenne des prédictions pour obtenir la prédiction finale
Cela semble être la meilleure façon de procéder. Après tout, le risque de suralimentation est le sur-ajustement et le principal avantage de l'ensachage est de réduire le sur-ajustement; ensacher un tas de modèles boostés semble être une excellente idée.
Cependant, en parcourant, par exemple le scikit-learn
gradient_boosting.py (qui fait un échantillonnage d'ensachage, mais pas la sélection de fonctionnalités aléatoires), et en bricolant quelques petits pépites à travers les publications sur LightGBM et XGBoost, il semble que XGBoost et LightGBM fonctionnent comme suit:
Arbres en sac boostés:
- Adapter un arbre de décision à vos données
- Pour les tours de boost i in N:
- Obtenez les résidus
- si je modifie bag_frequency == 0 (c.-à-d., sac tous les 5 tours):
- Prélevez un seul échantillon aléatoire de x% des échantillons et y% des caractéristiques; utiliser cet échantillon aléatoire à l'avenir
- adapter l'arbre aux résidus
- La prédiction finale est une somme pondérée des prédicteurs séquentiels.
Veuillez corriger ma compréhension ici et remplir les détails. Boosted Bagged Tree (avec seulement 1 arbre aléatoire par bag_frequency) ne semble pas aussi puissant que Bagged Boosted Tree.
Réponses:
Les instances sont sous-échantillonnées à plusieurs reprises dans Bagging , mais pas dans les fonctionnalités. ( RandomForests , XGBoost et CatBoost font les deux):
Incluez une étape d'initialisation dans votre pseudo-code Boosting pour vous débarrasser de la redondance:
Bagged Boosted Trees (comme vous l'appelez) est certainement une approche raisonnable, mais différente de XGBoost ou CatBoost :
XGBoost et CatBoost sont tous deux basés sur Boosting et utilisent l'intégralité des données d'entraînement. Ils implémentent également l'ensachage par sous-échantillonnage une fois à chaque itération de boosting:
Si vous voulez vous en tenir à "ajuster le modèle aux résidus", cela équivaudrait à "ajuster le modèle aux résidus de données dans l' échantillon de bootstrap ".
Remarques supplémentaires :
Il n'y a pas de " meilleure façon de le faire " comme vous le suggérez (pas de théorème du déjeuner gratuit). "Bagged Boosted Trees" pourrait surpasser XGBoost sur certains ensembles de données.
Cette ligne prête à confusion. D'où tenez-vous cela?
Cela ne doit pas être mentionné dans votre pseudo-code. Surtout quand il reste d'autres paramètres plus importants (comme le taux d'apprentissage en boosting).
la source