web-dev-qa-db-fra.com

Validation croisée dans LightGBM

Après avoir lu la documentation de LightGBM sur la validation croisée, j'espère que cette communauté pourra faire la lumière sur la validation croisée des résultats et sur l'amélioration de nos prédictions à l'aide de LightGBM. Comment sommes-nous censés utiliser la sortie du dictionnaire de lightgbm.cv pour améliorer nos prévisions?

Voici un exemple - nous formons notre modèle de cv en utilisant le code ci-dessous:

cv_mod = lgb.cv(params, 
                d_train, 
                500, 
                nfold = 10, 
                early_stopping_rounds = 25,
                stratified = True)

Comment pouvons-nous utiliser les paramètres trouvés à partir de la meilleure itération du code ci-dessus pour prédire une sortie? Dans ce cas, cv_mod n'a pas de méthode "prédire" comme lightgbm.train et le dictionnaire généré à partir de lightgbm.cv génère une erreur lorsqu'il est utilisé dans lightgbm.train.predict(..., pred_parameters = cv_mod)

Me manque-t-il d'une étape de transformation importante? 

8
Nlind

En général, l'objectif de CV dans NOT est d'optimiser l'hyperparamètre. Le but est d'évaluer les performances d'une procédure de création de modèle}. 

Sur le plan conceptuel, une division train/test de base est identique à un CV 1 fois (avec une taille personnalisée de la division contrairement à la taille du train 1/K dans le CV à plis k). L’avantage de scinder davantage (k> 1 CV) est d’obtenir plus d’informations sur l’estimation de l’erreur de généralisation. Il y a plus d'informations dans le sens d'obtenir l'erreur d'incertitude + statistique. Il y a une excellente discussion sur CrossValidated (commencez par les liens ajoutés à la question, qui couvrent la même question, mais formulés différemment). Il couvre la validation croisée imbriquée et n’est absolument pas simple. Mais si vous comprenez le concept en général, cela vous aidera dans diverses situations non triviales. L'idée à retenir est la suivante: L'objectif de CV est d'évaluer les performances de la procédure de création de modèle}. 

Gardant cette idée à l'esprit, comment peut-on aborder l'estimation de l'hyperparamètre en général (et pas seulement en LightGBM)? 

  • Vous souhaitez former un modèle avec un ensemble de paramètres sur certaines données et évaluer chaque variation du modèle sur un ensemble indépendant (validation). Ensuite, vous avez l’intention de choisir les meilleurs paramètres en choisissant la variante qui donne la meilleure mesure d’évaluation de votre choix. 
  • Cette peut être réalisée avec un simple train/test fractionné. Toutefois, les performances évaluées, et donc le choix des paramètres de modèle optimaux, peuvent n'être qu'une fluctuation d'un fractionnement particulier. 
  • Ainsi, vous pouvez évaluer chacun de ces modèles avec une évaluation de la moyenne plus robuste statistiquement sur plusieurs divisions train/test, c.-à-d. Un k-fold CV

Ensuite, vous pouvez faire un pas de plus et dire que vous avez un ensemble de rétention supplémentaire, qui a été séparé avant le démarrage de l'optimisation de l'hyperparamètre. De cette façon, vous pouvez évaluer le meilleur modèle choisi sur cet ensemble pour mesurer l'erreur de généralisation finale. Cependant, vous pouvez aller encore plus loin et au lieu d'avoir un seul échantillon de test, vous pouvez avoir une boucle CV externe, ce qui nous amène à une validation croisée imbriquée.

Techniquement, lightbgm.cv() vous permet uniquement d’évaluer les performances sur une division par k-fold avec des paramètres de modèle fixes. Pour le réglage hyper-paramètre, vous devrez l'exécuter dans une boucle fournissant différents paramètres et des performances moyennes d'enregistrement afin de choisir le meilleur jeu de paramètres. après la boucle est terminée. Cette interface est différente de sklearn, qui vous fournit une fonctionnalité complète permettant d'optimiser l'hyperparamètre dans une boucle CV. Personnellement, je recommanderais d'utiliser l'API sklearn de lightgbm. C'est juste une enveloppe autour de la fonctionnalité native lightgbm.train(), donc ce n'est pas plus lent. Mais cela vous permet d’utiliser toute la pile de la boîte à outils sklearn, qui vous facilite BEAUCOUP la vie.

9
Mykhailo Lisovyi

Si les résultats de votre CV vous conviennent, utilisez simplement ces paramètres pour appeler la méthode 'lightgbm.train'. Comme @pho a dit, CV est généralement juste pour le param paramétrage. Vous n'utilisez pas l'objet CV réel pour les prédictions.

1
bbennett36

Vous devez utiliser CV pour l'optimisation des paramètres.

Si votre modèle fonctionne bien sur tous les plis, utilisez ces paramètres pour vous entraîner sur l'ensemble de l'entraînement ..__ puis évaluez-le sur l'ensemble de tests externe.

0
pho