[PYTHON] Parametereinstellung mit luigi (2)

Ich fand die Reaktion großartig für mich, der nur Nischensachen schrieb, also versuchte ich es ein bisschen mehr. Es ist eine Geschichte.

Lassen Sie uns eine allgemeine Aufgabe erstellen

Klicken Sie hier für diesen Code. Was ich mache, ist das gleiche wie beim letzten Mal. https://github.com/keisuke-yanagisawa/study/blob/20151205/luigi/param_tuning.py

Dieses Mal lautet das Thema ** Ich möchte eine allgemeine Aufgabe erstellen **. Ich mache verschiedene Aufgaben, aber ich mache gerne überall allgemeine Aufgaben. Deshalb,

Ich habe eine Aufgabe gemacht, die dies für allgemeine Zwecke erledigt.

class param_tuning(luigi.Task):
    tasks        = luigi.Parameter()              # luigi.Eindimensionales Array von Aufgaben
    text_format  = luigi.Parameter()              #Übergeben Sie Python "mit Variablenname Beschreibung" regulären Ausdruck
    reduce_pivot = luigi.Parameter()              #Welche Variable für die Aggregation verwendet werden soll
    reduce_rule  = luigi.Parameter(default="min") #Geben Sie die zu aggregierende Funktion an, min or max
    out_file     = luigi.Parameter()              #Name der Ausgabedatei

    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);

Das Codieren war für verschiedene Aggregationsbeziehungen problematisch, daher überließ ich es Pandas. Es ist sehr einfach,

  1. Führen Sie die Berechnung mit jedem Parameter mit require () aus
  2. Aggregieren Sie alle Ergebnisse in einem Pandas-Datenrahmen
  3. Finden Sie den besten Wert im Aggregatteil
  4. (Bearbeiten Sie so, dass der in der Aggregation verwendete Wert am Ende von csv steht.)
  5. Geben Sie nur den mit dem besten Wert aus (in einigen Fällen mehrere).

Es ist ein Mechanismus.

Eingabe ist etwas verwirrend. Ich denke, Sie können Aufgaben grundsätzlich verstehen, reduzieren und ausgeben, aber für allgemeine Zwecke wurde es schwierig, eine Schnittstelle zu erstellen, die reguläre Ausdrücke einfügt.

Wie benutzt man

Verwendung des auf github veröffentlichten Codes

python param_tuning.py main_task --local-scheduler

Ich denke, es wird funktionieren, wenn Sie so etwas tun.

In Bezug auf die Verwendung dieser Allzweckaufgabe bereiten wir eine separate "Aufgabe zum Berechnen mit Parametern" und "Aufgabe für die Hauptfunktion" vor.

Der in der Hauptaufgabe beschriebene reguläre Ausdruck ist wahrscheinlich die größte Schwierigkeit (ich habe den regulären Ausdruck nicht zu oft verwendet), und ich habe ihn erklärt. Die Berechnungsausführungsaufgabe "task_param_eval" dieses Mal dient zum Ausgeben einer einzeiligen CSV-Formatdatei mit dem Namen "cost, gamma, error". Geben Sie sie daher wie folgt an.

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

Sie können den Namen mit ? P <Name> angeben. Dies wird als Name des Headers und Drehpunkts der Ausgabe-CSV verwendet. Geben Sie ihn daher bitte richtig an.

Am Ende

Ich bin eine Person, die verzweifelt schlecht in der Modularisierung für das Codieren ist, aber ich denke, es ist sehr gut, es "unvermeidlich" schneiden zu können, wenn eine solche Kraft angewendet wird. Dieses Mal habe ich versucht, einen Allzweckartikel zu erstellen, der einer der Vorteile der Modularisierung ist. ... Ich würde mich über Ihre Anleitung und Ermutigung freuen, dass die Codierung überhaupt nicht gut ist.

Referenzmaterial

Leihen Sie sich aus dem Stapelüberlauf unten aus, wie Sie Zahlen in regulären Ausdrücken finden. http://stackoverflow.com/questions/4703390/how-to-extract-a-floating-number-from-a-string-in-python

Recommended Posts

Parametereinstellung mit luigi (2)
Parametereinstellung mit luigi
Leichte GBM-Parametereinstellung
Parameteroptimierung mit GridSearchCV / RandomizedSearchCV unter Verwendung des Voting Classifier
Hyperparameter-Tuning mit LightGBM-Tuner
Optimieren von Keras-Parametern mit Keras Tuner
Parameterschätzung mit Kalman-Filter
Verschiedene Feinabstimmungen mit Mobilenet v2
Kontrollieren von Testwiederholungen mit Luigi + pytest
Datenpipeline-Aufbau mit Python und Luigi
Automatisierung der Parameteroptimierung mit Keras mit GridSearch CV
Optimieren von Hyperparametern mit Grid Search mithilfe einer Pipeline mit Keras
Reibungslosere Pipeline-Verarbeitung mit Luigi! Gokart vorstellen
Ich habe versucht, CNN mit Resnet fein abzustimmen