[PYTHON] Je veux afficher le nombre de num_boost_round lorsque early_stopping est appliqué à l'aide du rappel XGBoost (non atteint)

supposition

Je suis une personne transcendantale, alors je vais le laisser comme un mémorandum. Si vous faites une erreur, veuillez le signaler car c'est un tofu mental Un mémorandum qui rend le code du site de référence facile à comprendre L'environnement est azureml et je me tourne vers optuna pour rechercher des para

Connaissances préalables

--num_boost_round est le nombre d'itérations de renforcement de gradient --Early_stopping termine le tour lorsque la précision de la prédiction n'améliore pas le nombre de fois spécifié pour la validation. --callophone est une fonction de type débogage incluse dans XGBoost (ambiguë) --Référence https://xgboost.readthedocs.io/en/latest/python/python_api.html#callback-api

la mise en oeuvre

Implémentation minimale

def return_callback():
    def print_num_boost_round(env):
        iteration = env.iteration
        msg = '\t'.join([str(x) for x in env.evaluation_result_list])
        print(iteration, msg)

Par conséquent

0  ('validation_0-mae', 2657.650391)
1  ('validation_0-mae', 2657.609375)
0  ('validation_0-mae', 2624.649658)
2  ('validation_0-mae', 2657.425049)
1  ('validation_0-mae', 2624.609131)

Vous obtenez quelque chose comme Puis changez le code en

def return_callback():
    def print_num_boost_round(env):
        print(env)
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7fa972703208>, cvfolds=None, iteration=0, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2657.623047)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7fa972703208>, cvfolds=None, iteration=1, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2657.463379)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7f7a8224c208>, cvfolds=None, iteration=0, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2624.622314)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7fa972703208>, cvfolds=None, iteration=2, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2657.411377)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7f7a8224c208>, cvfolds=None, iteration=1, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2624.467285)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7fa972703208>, cvfolds=None, iteration=3, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2657.355957)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7f0ced02c208>, cvfolds=None, iteration=0, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2639.834229)])
XGBoostCallbackEnv(model=<xgboost.core.Booster object at 0x7f7a8224c208>, cvfolds=None, iteration=2, begin_iteration=0, end_iteration=100, rank=0, evaluation_result_list=[('validation_0-mae', 2624.416016)])

Il s'avère que la valeur de l'itération est obtenue par env.iteration

Référence (https://kunsen.net/2020/05/02/post-3199/)

Essayez de tourner num_boost_round dans Optuna pour juger

param_list['num_boost_round'] = trial.suggest_int("num_boost_round", 100, 500)

Tout d'abord, essayez de tourner num_boost_round avec la valeur initiale de 100 à 500.

Paramètres spécifiés

Liste des paramètres spécifiés par Optuna

Si vous le tournez tel quel


{
 'max_depth': 20,
 'eta': 0.22613771945050443,
 'num_leaves': 2560,
 'lambda': 6.0425529841148486e-05,
 'alpha': 6.69043393720362e-07,
 'num_boost_round': 236,
 'colsample_bytree': 0.9727432424922707,
 'min_child_weight': 239.6173703091301
}

num_boost_round vaut 236 (pas le même à chaque fois car c'est le caprice d'Optuna) Alors qu'est-ce que 236 ... Cela se passe-t-il environ 236 fois en premier lieu (au fait, c'était 253 quand je l'ai exécuté à nouveau) En conséquence, sortie

0 ('validation_0-mae', 2657.650391)
1  ('validation_0-mae', 2657.609375)
0  ('validation_0-mae', 2624.649658)
2  ('validation_0-mae', 2657.425049)
1  ('validation_0-mae', 2624.609131)

Est en sortie, mais l'itération atteint seulement 100 comme le montre end_iteration. Ensuite, j'ai recherché la valeur minimale (manuelle) Puisque 135,56956 était la valeur minimale, j'ai compté le nombre de lignes où cette valeur est apparue. Le résultat est 482

Conclusion

Si vous regardez de près, ce n'est pas parce que les itérations sont les mêmes que les valeurs sont les mêmes. Cela aurait peut-être été plus facile à comprendre si je lisais l'article XGBoost et l'avais comme connaissance préalable ... N'y a-t-il pas d'autre choix que de le pousser maintenant ... ??

Recommended Posts

Je veux afficher le nombre de num_boost_round lorsque early_stopping est appliqué à l'aide du rappel XGBoost (non atteint)
Lors de la génération d'un grand nombre de graphiques avec matplotlib, je ne souhaite pas afficher le graphique à l'écran (environnement jupyter)
Je souhaite générer une sortie lors de la conversion de la valeur du type (par exemple, datetime) qui n'est pas pris en charge lors de la sortie de json avec python
Je veux afficher la barre de progression
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
Je veux obtenir le chemin du répertoire où le fichier en cours d'exécution est stocké.
Je souhaite personnaliser l'apparence de zabbix
Je veux afficher la progression en Python!
Je souhaite prendre une capture d'écran du site sur Docker en utilisant n'importe quelle police
Je souhaite être informé de l'environnement de connexion lorsque RaspberryPi se connecte au réseau
Je veux grep le résultat de l'exécution de strace
Je veux réfuter "Ce n'est pas cool en Ruby"
Je veux bien comprendre les bases de Bokeh
Je veux automatiser ssh en utilisant la commande expect!
Je souhaite augmenter la sécurité de la connexion SSH
[Pour les débutants] Je souhaite expliquer le nombre d’apprentissage d’une manière facile à comprendre.
Je veux automatiser ssh en utilisant la commande expect! partie 2
Je souhaite utiliser uniquement le traitement de normalisation SudachiPy
Je veux obtenir des informations sur le fonctionnement de Yahoo Route
Je veux déterminer l'authenticité d'un élément du tableau numpy
Je veux connaître la nature de Python et pip
Je souhaite mapper le code EDINET et le numéro de valeur
Keras Je veux obtenir la sortie de n'importe quelle couche !!
Je veux connaître la légende du monde des technologies informatiques
L'histoire quand j'étais accro à Caused by SSLError ("Impossible de se connecter à l'URL HTTPS car le module SSL n'est pas disponible.")
Lorsque vous souhaitez utiliser plusieurs versions de la même bibliothèque Python (environnement virtuel utilisant venv)
Je veux obtenir le nom de la fonction / méthode en cours d'exécution
[Pytorch] Je souhaite attribuer manuellement les paramètres d'entraînement du modèle
J'ai un TypeError: l'objet 'int' n'est pas itérable lors de l'utilisation de keras
J'ai essayé d'obtenir l'index de la liste en utilisant la fonction énumérer
[Linux] Je souhaite connaître la date à laquelle l'utilisateur s'est connecté
Je veux sortir le début du mois prochain avec Python
Je voulais contester la classification du CIFAR-10 en utilisant l'entraîneur de Chainer
Je veux exécuter l'interface graphique Python au démarrage de Raspberry Pi
Lorsque j'essaye d'utiliser pip, le module SSL n'est pas disponible.
Je veux vérifier la position de mon visage avec OpenCV!
Je veux connaître la population de chaque pays du monde.
python> Je veux afficher le nombre 8 comme 008> imprimer "{0: 0> 3}". format (8) ou "{valeur: 0> 3}". format (valeur = 8) ou "% 03d"% 8 Ou format (8, "03d") ou str (8) .zfill (3) ou (Python 3.6 ou version ultérieure) f "{8: 0> 3}"
[Question] Dans la régression de forêt aléatoire de sk-learn, une erreur se produit lorsque le nombre de parallèles est défini sur -1.
Pour le moment en utilisant FastAPI, je veux montrer comment utiliser l'API comme ça dans swagger
J'ai essayé de transformer l'image du visage en utilisant sparse_image_warp de TensorFlow Addons
Je veux me mettre en colère contre ma mère quand la mémoire est serrée
J'ai essayé d'obtenir les résultats de Hachinai en utilisant le traitement d'image
Comment connaître le nombre de processeurs sans utiliser la commande sar
Lorsque vous souhaitez l'utiliser tel quel lorsque vous l'utilisez avec lambda memo
Remarque Python: lorsque vous souhaitez connaître les attributs d'un objet
Je souhaite afficher une image sur Jupyter Notebook à l'aide d'OpenCV (mac)
Je veux convertir par lots le résultat de "chaîne de caractères" .split () en Python
Je veux expliquer en détail la classe abstraite (ABCmeta) de Python
Lorsque vous souhaitez modifier l'en-tête HTTP du client de test de Flask
Je souhaite trier une liste dans l'ordre des autres listes
Je veux exprimer mes sentiments avec les paroles de Mr. Children
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé d'extraire et d'illustrer l'étape de l'histoire à l'aide de COTOHA
Je veux analyser les sentiments des gens qui veulent se rencontrer et trembler
Je veux prédire le succès des joueurs NBA utilisant le SDK Qore
Je souhaite laisser une commande arbitraire dans l'historique des commandes de Shell