[PYTHON] Réglage des paramètres avec luigi (2)

J'ai senti que la réaction était excellente pour moi, qui n'écrivais que des choses de niche, alors j'ai essayé un peu plus. C'est une histoire.

Créons une tâche à usage général

Cliquez ici pour ce code. Ce que je fais est le même que la dernière fois. https://github.com/keisuke-yanagisawa/study/blob/20151205/luigi/param_tuning.py

Le thème cette fois est ** Je veux créer une tâche à usage général **. Je fais diverses tâches, mais je suis heureux de faire des tâches générales partout. Donc,

--Agréger les résultats du réglage des paramètres --Seuls les paramètres avec les meilleures valeurs sont affichés ensemble au format csv.

J'ai fait une tâche qui fait cela à des fins générales.

class param_tuning(luigi.Task):
    tasks        = luigi.Parameter()              # luigi.Tableau unidimensionnel de tâches
    text_format  = luigi.Parameter()              #Passer l'expression régulière «avec la description du nom de la variable» python
    reduce_pivot = luigi.Parameter()              #Quelle variable utiliser pour l'agrégation
    reduce_rule  = luigi.Parameter(default="min") #Spécifiez la fonction à agréger, min or max
    out_file     = luigi.Parameter()              #Nom du fichier de sortie

    def requires(self):
        return self.tasks;
    def output(self):
        return luigi.LocalTarget(self.out_file)

    def run(self):

        # making pandas dataframe
        results = []
        for task in self.requires():
            with task.output().open() as taskfile:
                string = taskfile.read()
                groupdict = re.search(self.text_format, string).groupdict()
                results.append(groupdict)
        df = pd.DataFrame.from_dict(results);
        df[self.reduce_pivot] = convert2num(df[self.reduce_pivot])
        values = df[self.reduce_pivot]

        # Aggregation of parameter tuning results
        if self.reduce_rule == "min":
            best_val = min(values)
        elif self.reduce_rule == "max":
            best_val = max(values)
        else:
            print("reduce_rule must be min or max. your input is %s" % self.reduce_rule)
            exit(1);

        # Rearrangement of column order
        column_order = filter(lambda key: key != self.reduce_pivot, df.columns) + [self.reduce_pivot]
        df = df[column_order]

        # Outputting results as csv formatted data
        df[df[self.reduce_pivot] == best_val].to_csv(self.output().fn, index=False);

Le codage était gênant pour diverses relations d'agrégation, alors je l'ai laissé aux pandas. C'est très simple à faire,

  1. Exécutez le calcul avec chaque paramètre avec `` requires () ''
  2. Regroupez tous les résultats dans un cadre de données pandas
  3. Trouvez la meilleure valeur dans la partie agrégée
  4. (Modifiez pour que la valeur utilisée dans l'agrégation soit à la fin de csv)
  5. Produisez uniquement celui avec la meilleure valeur (dans certains cas, multiple)

C'est un mécanisme.

l'entrée est un peu déroutante. Je pense que vous pouvez essentiellement comprendre les tâches, réduire et générer des résultats, mais à des fins générales, il est devenu difficile de créer une interface qui insère des expressions régulières.

Comment utiliser

Comment utiliser le code lui-même publié sur github

python param_tuning.py main_task --local-scheduler

J'ai l'impression que cela fonctionnera si vous faites quelque chose comme ça.

En ce qui concerne l'utilisation de cette tâche à usage général, nous préparerons une «tâche de calcul avec paramètres» et une «tâche pour la fonction principale» distinctes.

L'expression régulière décrite dans la tâche principale est probablement la plus grande difficulté (je n'ai pas trop utilisé l'expression régulière), et je l'ai expliqué. La tâche d'exécution du calcul task_param_eval '' cette fois est conçue pour générer un fichier au format csv d'une ligne appelé coût, gamma, erreur '', spécifiez-le comme suit.

s = "[-+]?\d*\.\d+|\d+" ## float or int expression
text_format  = "(?P<cost>"+s+"),(?P<gamma>"+s+"),(?P<error>"+s+")"

Vous pouvez spécifier le nom en utilisant ``? P ''. Ceci est utilisé comme nom de l'en-tête et du pivot du csv de sortie, veuillez donc le spécifier correctement.

À la fin

Je suis une personne qui est désespérément mauvaise en modularisation pour le codage, mais je pense que c'est très bien de pouvoir le couper "inévitablement" quand une telle force est appliquée. Cette fois, j'ai essayé de créer un article à usage général, qui est l'un des avantages obtenus par la modularisation. ... J'apprécierais vos conseils et vos encouragements sur le fait que le codage n'est pas bon en premier lieu.

Matériel de référence

Empruntez le débordement de pile ci-dessous pour savoir comment trouver des nombres dans les expressions régulières. http://stackoverflow.com/questions/4703390/how-to-extract-a-floating-number-from-a-string-in-python

Recommended Posts

Réglage des paramètres avec luigi (2)
Réglage des paramètres avec luigi
Réglage des paramètres Light GBM
Réglage des paramètres avec GridSearchCV / RandomizedSearchCV lors de l'utilisation de VotingClassifier
Hyper réglage des paramètres avec LightGBM Tuner
Réglage des paramètres Keras avec Keras Tuner
Estimation des paramètres avec le filtre de Kalman
Divers réglages fins avec Mobilenet v2
Contrôle des relances de test avec Luigi + pytest
Construction de pipeline de données avec Python et Luigi
Automatisation de l'optimisation des paramètres avec Keras avec GridSearch CV
Réglage des hyper paramètres avec Grid Search à l'aide de pipeline avec keras
Traitement des pipelines plus fluide avec Luigi! Présentation de gokart
J'ai essayé le réglage fin de CNN avec Resnet