Allgemeine Rahmenbedingungen für die Erstellung von Trainingsdaten?

8

Als Student der Computerlinguistik mache ich häufig maschinelle Lernexperimente, bei denen ich Trainingsdaten aus allen möglichen Ressourcen wie rohen oder annotierten Textkorpora oder syntaktischen Baumbanken erstellen muss. Für jede neue Aufgabe und jedes neue Experiment schreibe ich Programme (normalerweise in Python und manchmal Java), um die benötigten Funktionen und Werte zu extrahieren und die Daten von einem Format in das andere zu transformieren. Dies führt normalerweise zu einer sehr großen Anzahl von sehr großen Dateien und einer sehr großen Anzahl von kleinen Programmen, die sie verarbeiten, um die Eingabe für ein maschinelles Lernframework zu erhalten (wie die arff-Dateien für Weka).

Man muss sehr gut organisiert sein, um damit umzugehen und mit großer Sorgfalt darauf zu achten, dass keine wichtigen Besonderheiten, Ausnahmen oder Fehler in den Tonnen von Daten übersehen werden. Viele Prinzipien guten Software-Designs wie Design-Patterns oder Refactoring-Paradigmen sind für diese Aufgaben nicht besonders geeignet, da Dinge wie Sicherheit, Wartbarkeit oder Nachhaltigkeit keine große Rolle spielen. Sobald das Programm die Daten erfolgreich verarbeitet hat, braucht man es nicht mehr. Das ist so weit gegangen, dass ich sogar aufgehört habe, überhaupt Klassen oder Funktionen in meinem Python-Code zu verwenden und auf einfache Weise prozedural zu programmieren. Das nächste Experiment wird verschiedene Datensätze mit einzigartigen Eigenschaften und in einem anderen Format erfordern, so dass ihre Vorbereitung wahrscheinlich von Grund auf neu programmiert werden muss. Meine bisherige Erfahrung ist, dass es nicht ungewöhnlich ist, 80-90% der Zeit eines Projekts für die Vorbereitung von Trainingsdaten auszugeben. Stunden und Tage vergehen nur, wenn man darüber nachdenkt, wie man von einem Datenformat zum anderen gelangt. Manchmal kann dies ziemlich frustrierend werden.

Nun, du hast wahrscheinlich vermutet, dass ich ein bisschen übertreibe, sogar absichtlich, aber ich bin sicher, dass du verstehst, was ich zu sagen versuche. Meine Frage ist eigentlich folgende:

Gibt es allgemeine Rahmenbedingungen, Architekturen, Best Practices für die Bewältigung dieser Aufgaben? Wie viel von dem Code, den ich schreibe, kann ich bei optimalem Design als wiederverwendbar erwarten?

    
ferdystschenko 14.01.2010, 17:11
quelle

2 Antworten

2

Ich benutze meistens die textutils von GNU coreutils und flex für die Korpusvorbereitung, verkette die Dinge in einfachen Skripten, zumindest wenn die Vorbereitungen, die ich machen muss, einfach genug für reguläre Ausdrücke und triviale Filterungen sind.

Es ist immer noch möglich, Dinge wiederverwendbar zu machen, die allgemeinen Regeln gelten auch hier. Wenn Sie ohne Best Practices und dergleichen programmieren und nur prozedural programmieren, gibt es für IMHO wirklich kein Wunder, dass Sie beim Start eines neuen Projekts alles von Grund auf neu machen müssen.

Obwohl die Anforderungen an das Format sehr unterschiedlich sind, gibt es immer noch viele gemeinsame Aufgaben, z. Tag-Stripping, Tag-Übersetzung, Auswahl, Tabellierung, einige triviale Datenerhebung wie Anzahl der Token, Sätze und dergleichen. Die Programmierung dieser Aufgaben für eine hohe Wiederverwendbarkeit zahlt sich aus, auch wenn es zunächst etwas länger dauert.

    
Johan Benum Evensberget 14.01.2010, 18:33
quelle
1

Ich kenne keine solchen Rahmenbedingungen - das heißt nicht, dass sie nicht da draußen sind. Ich bevorzuge es, meine eigene zu verwenden, die nur eine Sammlung von Code-Schnipsel ist, die ich im Laufe der Zeit verfeinert / optimiert / ausgeliehen habe und die ich je nach Problem in verschiedenen Konfigurationen zusammenketten kann. Wenn Sie bereits Python kennen, dann empfehle ich dringend, alle Ihre Datenvorbereitung in NumPy zu behandeln - wie Sie wissen, ML-Datensätze tendenziell groß - Tausende von Zeilenvektoren mit Floats gepackt. NumPy ist brilliant für solche Dinge. Zusätzlich könnte ich vorschlagen, dass es für die Vorbereitung von Trainingsdaten für ML einige Aufgaben gibt, die bei fast jeder dieser Bemühungen auftauchen und die sich nicht sehr von einem Problem zum nächsten unterscheiden. Ich habe Ihnen Schnipsel für diese unten gegeben.

Normalisierung (Skalierung und Mittelzentrierung Ihrer Daten, um Übergewicht zu vermeiden. Wie Sie sicher wissen, können Sie -1 zu 1 oder 0 zu 1 skalieren. Normalerweise wählte ich letztere dass ich Sparsity-Muster nutzen kann.In Python mit der NumPy-Bibliothek:

%Vor%

Kreuzvalidierung (hier habe ich das Standardargument auf '5' gesetzt, also Testmenge ist 5%, Trainingssatz, 95% - wenn man dies auf eine Funktion setzt, wird k-fach gemacht viel einfacher)

%Vor%

Schließlich, hier ist eine ausgezeichnete Fallstudie (IMHO), sowohl klar als auch vollständig, wörtlich zu zeigen der gesamte Prozess von der Sammlung der Rohdaten über die Eingabe bis zum ML-Algorithmus (in diesem Fall ein MLP). Sie stellen auch ihren Code zur Verfügung.

    
doug 15.01.2010 01:00
quelle