 Herzlich Willkommen zum ersten Coding Video des zweiten Teils der Vorlesung Data Science, Deep Learning und Neuronale Netzwerke. In diesem Video werde ich Ihnen erst einmal zeigen, wie man denn in Python überhaupt ein neuronales Netzwerk implementieren kann, wie man das trainieren lassen kann und wie man die Ergebnisse validieren kann. Und wir beginnen, wie gehabt, erst einmal damit einige Pakete einzubinden. Wir benutzen hier wieder NumPy, Panda, Seaborn, Mudplotlib und Tabulate. Das sind die Standardpakete, die wir als eigentlich in fast jedem Video verwendet haben. Wir benutzen von SQLearn unser train-test-split Funktion, damit es uns möglich ist, unseren Trainings- und Testdatensatz zu erzeugen. Wir importieren uns hier wieder eine Scaling-Funktion, in dem Fall hier den Minmax Scaler, um unsere Daten zu normalisieren. Und wir haben uns hier noch zwei Fehlermaße ausgesucht, den M.A.E. und den MSE. Den haben Sie in der Vorlesung bereits kennengelernt. Und wir werden hier zum aller ersten Mal mit TensorFlow arbeiten. TensorFlow ist ein Framework zur Datenstrom orientierten Programmierung. Und das ist eine sehr populäre Anwendung im Bereich des Machine-Learnings und auch im Bereich von künstlichen neuronalen Netzwerken auf mehr dimensionalen Datenfeldern. Das sind diese sogenannten Tensoren. TensorFlow wurde ursprünglich vom Google Brain Team für den Google internen Bedarf entwickelt und später eben als Open-Source-Lizenz der Öffentlichkeit zur Verfügung gestellt. Allerdings war das sehr, sehr, sehr komplex, weswegen es auch eine andere Bibliothek gab, die sich Keras nennt. Das war früher einmal die inoffizielle API zu TensorFlow, in der manche Funktionalitäten wesentlich schöner und einfacher zu bedienen angeboten wurden. Inzwischen ist es so, dass Keras so populär geworden ist, dass TensorFlow Keras als offizielle API adaptiert hat. Das heißt, es ist nicht mehr so, wie früher, dass Keras ein bisschen von den Profilentwicklern als netten Abklatsch von TensorFlow belächelt wurde. Es ist inzwischen einfach die offizielle API und es gehört hier dazu. Das macht die Sachen viel, viel einfacher. Sie können auch TensorFlow ohne Keras benutzen. Wir benutzen hier Keras aus dem simplen Grund, weil das die Sachen für sie wesentlich einfacher und angenehmer gestaltet. Und was nehmen wir hier raus? Denn aus den Modellen nehmen wir ein sequenzielles Modell und wir nehmen die Funktion Load-Modell. Das erlaubt es uns später, das trainierte Netzwerk zu speichern und eben zu einem späteren Zeitpunkt wieder zu laden und mit den trainierten Gewichten fortzufahren. Und wir importieren uns die Dentsfunktion. Sie können sich das gerne hier im Detail mal durchlesen. Im Großen und Ganzen ist das die Funktionalität, die es uns erlaubt, dichte Schichten zu implementieren. Wir haben in der Vorlesung ja bereits gelernt, dass wenn jedes Neuron einer Schicht mit jedem Neuron der Vollgeschicht verbunden ist, nennt man das Netzwerk Dicht oder eben diese Schicht Dicht und genau das machen wir hier auch. Bevor wir allerdings hier zu kommen, Sie kennen den Vorgang. Inzwischen brauchen wir erst einmal irgendwelche Daten, mit denen wir ein Netzwerk überhaupt befüllen können. Ich habe es mir hier erlaubt, Ihnen mal einen generischen Datensatz vorzubereiten. Den schauen wir uns hier entsprechend an. Das heißt, wir laden uns den Datensatz hier hinein. Wir betrachten uns den Datensatz. Wir schauen uns hier mal einen Paarplot an. Das heißt, wir können gleich auch auf Korrelationsstrukturen abstellen. Wir erzeugen uns hier unser X und Y Variablen, indem wir eben die zu prädizierende Variablen in unser Y speichern und die ganzen Features eben in unseren X Variable speichern. Das nächste, das kennen Sie aus dem vorherigen Video schon, erzeugen wir uns hier ein Trainings und Test Datensatz für die beiden Variablen auf Basis der SK Learn Funktion TrainTestsplit. Wenn Sie natürlich wieder die gleichen Ergebnisse erreichen wollen, wie ich es hier habe, beachten Sie bitte, dass Sie hier denselben Random State angeben. Wir schauen uns hier dann natürlich auch mal die Dimensionen dieser Trainings und Test Datensätze an, damit Sie sehen können, dass wir hier das auch in etwa genauso splitten, wie hier das dasteht. Anschließend werden wir hier unsere Daten normalisieren. Das heißt, wir skalieren die Features, die wir hier für unser Netzwerk verwenden werden. Das heißt, wir binden hier einen Scaler ein, wir fitten diesen Scaler auf die Trainingsdaten und danach transformieren wir eben die Trainingsdaten mittels dieses Scalers, genauso wie die Testdaten, an denen wir das Ganze validieren möchten oder nicht. Sollten Sie für Keras Hilfe benötigen, gibt es hier ein sehr großes Hilfemodul, in dem Sie sich austoben können. Das nächste, was wir hier machen, wir initialisieren unser Modell und hier gibt es einige Dinge zu beachten. Sie können, wie hier dargestellt, ein neuronales Netzwerk mit der Sequenzfunktion von Keras eben in einer Zeile erzeugen. Davon rate ich Ihnen allerdings ab. Das Problem ist nun, wenn Sie hier das alles in einer Zeile erzeugen und Sie müssen eine Schicht ändern, dann müssen Sie hier permanent die Funktion verändern und das ist gerade bei größerem Projekten nicht zu empfehlen. Den Syntag, den wir hier wählen werden und den wir hier auch weiter verfolgen werden, finden Sie hier unten. Hier unten erzeugen wir zunächst einmal ein Leeresmodell, eine leere Sequential Modellierung. Das ist ein neuronales Netzwerk, in dem einfach überhaupt erst mal gar nichts drin ist. Und anschließend werden wir Schritt für Schritt die Schichten zu diesem Modell hinzufügen. Sie sehen, dass wir hier eine Möglichkeit haben, Schichten dem Modell zuzufügen und da kommt auch unsere Denzfunktion zum Einsatz, in dem wir sagen können, okay, wie viele Neuronen möchtest du denn pro Schicht haben, mit welcher Aktivierungsfunktion und Sie sehen, wir fangen hier direkt an mit einem Deep Learning Neural Network, in dem wir hier drei Schichten haben mit jeweils vier Neuronen und wir haben natürlich eine Output Layer, die dürfen wir hier nicht vergessen und wir möchten hier auch nur eine einzige Output Neurone haben, damit wir eben einen Preis bekommen, der uns als Vorhersage dienlich ist. Was machen wir als nächstes? Wir kompellieren das Modell. Beachten Sie bitte, dass wenn Sie eine Klassifikationsproblematik haben, Sie hier bitte die Cross Entropy verwenden als Verlustfunktion und nicht den MSE, weil der MSE ist für Regressionsproblematiken da, das heißt für stetige Datensätze. Was machen wir als nächstes? Wir finden das Modell, das heißt wir trainieren das neuronale Netzwerk, das geschieht hier in dieser einzelnen Zeile, da übergeben wir dem Netzwerk die Trainingsdaten und wir setzen noch Epochs, das heißt wie oft wird dieses Datenset denn nun verarbeitet, wie viel Trainingsschritte sollen denn nun gemacht werden und das ist es dann eigentlich schon. Das ist die ganze Magie hinter Deep Learning Neural Networks und was wir dann danach machen ist, wir lassen uns die Verlustfunktion ausgeben, wir schauen uns den Verlauf dieser Verlustfunktion an und zum Schluss, Sie kennen das ja, das Vorgehen ist denke ich meistens bisher das gleiche gewesen, wir lassen das Netzwerk anhand der Testdaten Predictionen erstellen, speichern uns diese und schauen uns diese einfach einfach mal an und machen ein Bild dazu, weil das denke ich einfach ist, sich das grafisch anzusehen wie tabellarisch und können am Ende hier unsere Fehlermaße berechnen und ausgeben lassen und uns weitere statistische Maße hier anzeigen lassen und was wir hier noch machen, wir erzeugen hier zum Beispiel einfach mal ein neues Pärchen von Features, skalieren das ganze und lassen das Modell einfach mal eine Prediction anstellen auf Basis dieser neu hinzugekommenen Werte und was Sie hier unten machen können, Sie können mit model.save hier Ihr Modell speichern und wenn Sie das natürlich dann zu einem späteren Zeitpunkt erneut benötigen, können Sie hier einfach mit der Funktion load model Ihr gespeichertes Modell wieder in Ihr Skript laden und ausführen. Wir machen hier einfach mal dieselbe Prediction nochmal, damit Sie auch sehen können, dass da tatsächlich was passiert. Ich scroll jetzt nochmal nach oben, das war jetzt relativ viel, deswegen wiederhole ich das einfach nochmal, wir binden hier unsere Pakete ein, dann gehen wir her, laden unsere Daten, schauen die uns an, erzeugen unsere Feature Matrix und unseren Output Vector, den wir predizieren möchten, wir splitten unseren Datensatz in Test und Trainingsdaten, wir skalieren unsere Daten, das sehen Sie hier, wir initiieren das Modell und zwar bitte nicht so, sondern in einem schönen Zündtags, den Sie auch später nochmal verändern können, das sehen Sie hier, hier erzeugen wir quasi unser Neuronal ist ein Netzwerk und zwar indem wir sagen, wir haben ein sequenzielles Modell mit drei Schichten und eine Output Schicht mit einem Output Neuron, hier können Sie die Aktivierungsfunktion eingeben, wie Sie gerade möchten, Sie können für jedes Problem, was Sie haben, natürlich andere Aktivierungsfunktionen verwenden und es hat auch einen Sinn, gewisse Aktivierungsfunktionen für gewisse Probleme zu verwenden, um Ergebnisse zu bekommen, mit denen Sie tatsächlich arbeiten können, wir nehmen hier einfach mal die Relu-Funktion, die Sie in der Vorlesung auch schon kennengelernt haben, danach wird dieses Modell kompiliert, das neuronale Netzwerk wird kompiliert und danach wird es trainiert und gefittet und wir schauen uns diese Verluste an, evaluieren diese Machenschätzungen, speichern die Schätzungen, schauen uns die Ergebnisse entsprechend an und berechnen unsere Fehlermaser, bevor wir in der Lage sind, neue Feature Kombination, neue Feature Werte hier einzufügen und unser Modell zu speichern und ich hätte jetzt einfach gesagt, ich habe jetzt sehr viel erzählt, wir lassen dieses Modell jetzt einfach einmal durchlaufen. Fangen wir jedoch direkt einmal an, wir sehen in der Konsole die Übersicht über unsere Daten, wir haben quasi einen generischen Preis und wir haben zugehörige Features, beachten Sie bitte, dass das hier einfach ein generischer Datensatz ist, aber ich sage mal, wir später noch zu Datensätzen kommen, werden die auf Echtdaten beruhen. Was wir hier uns anzeigen können, ist ein Perplot, das heißt wir sehen hier die Verteilung der Variablen, ich mache das Ganze hier mal groß, dann sehen wir auch die Beschriftungen, wir sehen hier zum Beispiel den Preis und den Preis an sich, das heißt wir sehen hier die Verteilung der Variable selbst und wir sehen die Korrelation, die Streudiagramme mit Feature 1 und Feature 2 und wir sehen natürlich auch Feature 1 zu Feature 2, wir sehen hier die Verteilungen der einzelnen Variablen sowie die Streudiagramme der Variable untereinander, bitte beachten Sie, dass das hier eine symmetrische Matrix ist und diese drei Teile hier oben eigentlich obsolet sind, die sind redundant. Jetzt haben wir uns unsere Daten schon mal angesehen, wir sehen okay, es ist ein bisschen positiv bei Feature 1 und Feature 2, sieht hier eigentlich schon relativ gut aus, fahren wir doch einfach mal fort. Nun wird das Modell trainiert, es ging in diesem Fall sehr schnell, da wir sehr wenige Daten haben, das ist einmal Punkt 1 und wir ein sehr einfaches Modell haben und wir nur effektiv zwei Feature in dieses Netzwerk einfließen lassen. Was wir hier sehen, ich vergrößere das Ganze auch einmal, ist die Verlustfunktion des Netzwerks während der Trainingsdurchläufe, wir sehen hier an der Seite den Verlustwert und wir sehen hier die Epochen und wir sehen, dass hier so ab Epocher, ja, lassen Sie es mal 70 und 80 sein, hier der Verlust quasi nur noch konvergiert und wir schon sehr, sehr gut Ergebnisse erzeugt haben. Ich schließe das nochmal, dass wir hier weiter machen können. Das nächste, was in der Konsole sehen, hier sind die echten Y-Werte, die Testwerte und die Prediction, die unser Modell für eben diese Testdaten angestellt hat und ich habe Ihnen das Ganze hier noch mal als Scatterplot dargestellt. Ich lege das mal lehmeinander, das heißt, Sie sehen hier die Tabelle und hier quasi die grafische Darstellung, Sie sehen okay, das sieht schon mal gar nicht schlecht aus, also es sind mit diesem Modell schon gar nicht schlecht dabei. Schließen wir das nochmal und dann bekommen wir hier mehrere Dinge angezeigt, wir bekommen hier unsere Fehlermaße angezeigt, die können Sie hier ansehen und Sie bekommen eins, war da unten hier statistische, diskrepitive Maße, unsere Modellprediction und unsere wahren Y-Werte, wo Sie sehen können, dass wir hier eine Standardabweichung von 93,94 haben und wir hier mit unserem Modellfehler bei 5 sind, das heißt, wir sind hier schon sehr, sehr gut dabei und hier unten sehen wir einmal die Prediction für unser neues Featureset, was wir eingefügt haben und wir sehen das gleiche nochmal, das ist das, wo wir das Modell geladen haben und eben erneut ausgeführt haben. Das soll es für dieses Video gewesen sein, ich skrolle hier in der Konsole noch einmal nach oben, dass Sie hier das als sehen können, wir sehen uns hier unsere Preise beziehungsweise unsere Feature Matrix an, unsere Daten, wir trainieren hier das Modell, da können Sie Schritt für Schritt jede Epoche nachverfolgen, Sie sehen hier auch die Lossfunktionen und Werte entsprechend angezeigt, diese Trainingsdauer hier kann je nach Modell und je nach Datenumfang deutlich variieren, also ich möchte hier nicht die Illusion erzeugen, dass sich ein neuronales Netzwerk in 10 Sekunden trainieren lässt, das ist jetzt hier aus didaktischen Gründen im Datenumfang angepasst, nenne ich das mal hier unten sehen Sie dann die Gegenüberstellung Ihrer Testdaten sowie Ihrer Predictionen, die Sie mittels dieses Netzwerkes gemacht haben, hier sehen Sie dekriptive Maße, noch mehr Fehlermaße und eine Prediction neuer Daten und damit sind wir mit diesem Video am Ende, ich hoffe Sie haben etwas mitgenommen, wir sehen uns im nächsten.