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.
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,
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 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
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.
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