DMC 2012 ======== :author: Jan Klemkow, Benjamin Franzke :lang: de :doctype: book // a2x: --dblatex-opts="-P latex.encoding=utf8" // a2x: --dblatex-opts "-P latex.output.revhistory=0" // a2x: --dblatex-opts "-P doc.publisher.show=0" Programme und Datenvorverarbeitung ---------------------------------- Zur Verarbeitung der Daten wurde das Programm Octave benutzt. Dieses ist eine Open-Source alternative zu MATLab. In dem Programm wurden die Daten in Form von Matrizen dagestellt. Das Script 'get_products.m' liest die Trainings- und Klasifikationsdatein die von einem sed-script für die Benutzung in Octave vorbearbeitet wurden: [source,sh] ---- #!/bin/sed -f # Delete the header line, which is on line 1 1d # Replace every | with a space s/|/ /g # Eliminate carriage return s/\r// ---- Das Octave-Script erstellt zwei Matrizen, je eine für die Preise und Quantitäten. Dabei hat jede Matrix 570 Spalten, jedes Produkt wird in einer eigenen Spalte gespeichert. Die Zeilennummer ist der index für den Tag. Damit ergibt sich eine Zeilengröße von 42 für die Quantitätsmatrix, und 56 für die Preismatrix, da diese zusätzlich die Klassifikationsdaten enthält: [source,octave] ---- include::../get_products.m[] ---- Die resultierende Matrix, die von allen implementierten Verfahren verwendet wird, hat folgendes Schema: .Preis-Matrix [latexmath] ++++++++++++++++++++++++++++++++++++++++++++ \[ P = \begin{pmatrix} price_{day1,product1} & price_{day1,product2} & \cdots & price_{day1,product570} \\ price_{day2,product1} & price_{day2,product2} & \cdots & price_{day2,product570} \\ \vdots & \vdots & \ddots & \vdots \\ price_{day56,product1} & price_{day56,product2} & \cdots & price_{day56,product570} \end{pmatrix} \] ++++++++++++++++++++++++++++++++++++++++++++ Verfahren zur Vorhersage ------------------------ [[anchor-middle]] Mittelwert ~~~~~~~~~~ Beim Mittelwertverfahren wird für jedes Produkte über die Trainingsmenge der Mittelwert gebildet und für den unbekannten Zeitraum Vorhergesagt. Dabei wurde eine Fehlerpunktzahl von 489 erreicht. .Mitterte aller Producte ueber zwei Wochen image::image/mean_pred.svg[scaledwidth="75%"] [[anchor-sevenday]] Sevenday-Verfahren ~~~~~~~~~~~~~~~~~~ Wenn man die Summe über dem Absatz alle Produkte für alle 42 Tage in einem Diagram abträgt, sieht man eine sehr deutliche periodische Schwankung der Werte. .Quantitätssumme image::image/q_sum.svg[scaledwidth="75%"] Diese Schwanken in einem Sieben-Tage-Rhythmus. Unter der Anahme, das dieses Verhalten jedem oder zumindest in den meisten Produkte zu grunde liegt, wurde das Sevenday-Verfahren entwickelt. Der Ansazt geht davon aus, dass der Absatz im mittel über eine Woche immer gleich ist und sich nur über Absatzstarke und -schwache Tage verteilt. Beim Sevenday-Verfahren wird für jeden Wochentag ein Mittelwert gebildet und Vorhergesagt. In der Summer versucht man also über sieben Tage einen mittlere Schwingung der Sieben-Tage-Schankung zu erzeugen und dieses dann für den unbekannten Zeitraum vorherzusagen. .Quantitätssumme mit Sevenday-Vorhersage image::image/sevenday_pred.svg[scaledwidth="75%"] In diesem Diagramm ist die mittlere kurve in den Vorhersagezeitraum abgetragen worden. Das Ergebniss sieht optisch gut aus, aber enttäuscht in der Fehlerzahl von 484 Punken. Wenn für ein Produkt an einem Tage ein zu hoher Wert vorhergesagt wird und für ein anderes Produkt ein zu niedriger im Vergleich zu den Realwerten, dann gleichen sich die Negativen- und Positvenabstände in der Summer wieder aus. Daher kann das Verhalten der Siebentagesschwankung nicht alleine Auschlaggebend für den Absatz eines Produktes sein. Lineare-Approximation Zeit -> Quantität ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Bei der Approximation der Quantitätskurve zu einer geraden, wird versucht einen allgemein steigenden oder fallenden Trend eines Produktes zu erkennen. Hierbei wird davon ausgegangen, dass sich ein Produkt über eine größeren Zeitraum im mittelveränder. Anders als beim Mittelwertverfahren, welches von einer immer gleichbleibenden Grundabsatzmenge ausgeht, wird hier ein Trend mit bedacht. Der Verlauf der Quantität über die Trainingsdaten wird linear angenähert und für den die Vorhersage benutzt. Das Ergebniss dieses Verfahrens lieferte für einige Produkte z. B. dem Ersten eine etwas besseres Ergebniss als der Reine Mittelwert. Für andere allerdings einen viel zu steilen Anstieg, der ziemlich große Fehlerwerte verussachte. TODO: Fehlerwerte noch mal bestimmen! Lineare-Regression Preis -> Quantität ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Dazu wurde eine allgemeine Polynomapproximation n-ten Grades erstellt, die zu einer gegeben Liste von Preisen und Quantitäten eine approximierte polynom-funktion latexmath:[quantity = f(price)] n-ten gerades berechnet. Die Preise der vorherzusagenden Quantitäten wird in die errechnete Funktion einsetzt. Lineare-Regresion (special) ~~~~~~~~~~~~~~~~~~~~~~~~~~~ Am Produkt Nr. 335 kann man examplarisch sehr gut erkennen, dass der Absatz von den beiden Einflussgrößen Siebentage-Schwankung sowie der Preisänderung abhängt. Mit diesem Verfahren wird versucht beide Einflussgrößen bei der Vorhersage zu beachten. Dabei wurde zunächte eine Fourie-Analyse der Kurve der Absatzsumme alle Produkte über die 42 Tage der Vorhersagemenge durchführt, um die Freqünzen der Siebentagesschwankung empirisch zu bestimmen. Es wurde jeweil einzelne Freqünzen entfernt und bei der Rücktransformation ein Digramm erwartet, welches dem mittelwert ähnelt. ... Die so ermittelten Freqünzen wurden dann nach der normalen Preis -> Quantitäts approxiamtion wieder hinzu genommen. Grundidee: - herrausrechnen der 7-Tage-Einbruche aus den Trainingsdaten für die Regression und eine Approximation für reinen Preis->Quantitäts-Zusammenhang. - 7-Tage-Einbrüche hinein rechnen. Der Absatz eines Produktes setzt sich aus verschiedenen Einflussfaktoren zusammen. Zum eine die Wochen- und die Preisschwankung. Zufallsverfahren ~~~~~~~~~~~~~~~~ Dieses Verfahren wurde entwickelt um Plausibität der anderen Verfahren zu Testen und um der Vermutung nach zu gehen, das es Produkte gibt, welche gar nicht vorhersagbar sind. Bei dieses Verfahren wurde für jedes Product der Mittelwert und die Standardabweichung ermittelt. Mit dieses Parametern konnten für jedes Product 14 Werte zufällig für die Vorhersage bestimmt werden. Zur Zufallsbestimmung wurden Octave-interen Zufallsfunktionen mit Normal- und mit Chi-Verteilung benutzt. Beide Verteiltungen lieferten ähnliche Ergebnisse. Der Gesammtfehler bei diesem Verfahren schankte zwischen 640 und 590 Fehlerpunkten. Im Vergleich mit anderen Verfahren (siehe Optimierungsverfahren) stellte sich herraus, dass es immer wieder Produkte gab, welche mit diesesm Verfahren bessere Werte lieferten. Circa 7% der Podukte liessen sich mit Zufall besser vorhersagen, als duch die Zuvor beschriebenen Verfahren. Es stellte sich aber herraus, dass es bei jedem duchlauf andere Produkte waren, welche mit dem Vergleich zu den Realendaten besser vorhergesagt wurden. Somit war dieses Verfahren keine Option für eine seriöse Vorhersage für unbekannten Datensätze. Optimierungsverfahren --------------------- Das Optmierungsverfahren ist Post-Clustering und wurde im Script 'opt_pred.m' implementiert. Dieses Meta-Verfahren bestimmt für jedes Produkt eines der oben genannten Verfahren, welches den geringsten Fehlerwert bei der Vorhersage über der Trainingsmenge ergab. Dabei werden die Vorhersage-Matrizen der Verfahren mit den Real-Daten über die Manhatten-Distanz verglichen. Als Ergebnis erhält man nun einen Vektor, welches die Indizes der jeweils besten Verfahren enthält. Die Position des Indizes spiegelt dabei das Produkt wieder, für die dieses Verfahren am besten geeignet ist. Mit diesem Vektor können nun die Vorhersagen der einzelnen Produkte für den unbekannten Zeitraum zusammen gelegt werden. .Anteil der Verfahren an der Gesammtlösung image::image/opt_pred_pie.svg[scaledwidth="75%"] Dieses Verfahren würde sich auch gut zur Bestimmung des Abgabe-Datensatzes für den Daten-Mining-Cup eignen. Dabei könnten alle Teams für ihre Verfahren einmal ihre Vorhersage für die Tage 29 bis 42 in Form der "train.txt" und ihre Vorhersagen für den unbekannten Zeitraum abgeben. Anhand der verschiedenen Fehler der Vorhersagen pro Produkt könnte wie oben beschrieben ebenfalls ein Vektor mit den Indizes der Verschiedenen Einreichungen erstellt werden und damit auch der Datensatz für die Einreichung im Wettbewerb. // vim: set syntax=asciidoc: