Transkript: Naive Bayes

· Zurück zur Episode

Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.

Dominik

Ja, hallo liebe Hörerinnen und Hörer.

Dominik

Willkommen bei der 13.

Dominik

Episode vom Python Podcast.

Dominik

Hier ist der Dominik, wir sind bei Jochen.

Jochen

Jo, hallo.

Dominik

Ja, heute haben wir ein schönes Thema für euch mitgebracht.

Dominik

Und da wollten wir über naive Base-Klassifikation sprechen und ein bisschen Spam sortieren.

Jochen

Genau, genau.

Jochen

Also eigentlich, was wir oder für mich die Idee dabei war, mal wieder so ein bisschen was Einsteiger einsteigermäßiges mehr zu machen.

Dominik

Und dann habe ich mir kurz Joch ein Drepo angeguckt und so einsteigerfreundlich ist das nicht.

Dominik

Aber wenn euch das natürlich interessiert.

Jochen

Genau, oder sagen wir mal so, einfach, weil ich denke, das ist, also ich habe halt nach einem Beispiel gesucht, was man irgendwie relativ leicht in Python machen kann und wo man jetzt in anderen Sprachen ein Problem hätte, das in der gleichen Kürze so hinzubekommen.

Dominik

Ja, da kann man auf jeden Fall wiedersehen.

Dominik

Python kann das richtig gut.

Dominik

Aber wenn ihr wirklich ein Einstiegsbeispiel haben wollt, also in der nächsten Folge haben wir wieder, glaube ich, was vor.

Dominik

Übernächsten, wirklich für Einfänger noch.

Jochen

Da machen wir mal so wirklich Einsteigergeschichten, einfach grundsätzliche Datentypen und so.

Jochen

Ich habe jetzt auch versucht, mich dabei dem Beispiel auf so die grundlegenden Datenstrukturen zu beschränken, die es halt irgendwie eingebaut gibt.

Jochen

Aber gut, sogar ein super Einsteigerfreundlich ist es vielleicht nicht.

Aber es ist gespannt.

Vielleicht trotzdem interessant.

Dominik

Wir haben übrigens Ende August mittlerweile 2019 immer noch und es ist tatsächlich immer noch so unglaublich warm wieder.

Dominik

Also heute, ich weiß nicht.

Jochen

Ja, wollen wir irgendwie, keine Ahnung, wir können ja erstmal so ein bisschen darüber reden, was passiert ist in letzter Zeit, was wir an so Dingen gesehen haben.

Dominik

Also wir waren auf der Frostkorn, also ich noch ganz kurz und du ein bisschen länger.

Ja.

Dominik

Ja, das heißt, du hast ein bisschen mehr Vorträge gesehen.

Dominik

Ich habe nur den einen letzten zu Reinforced Learning mehr angehört.

Jochen

Du meinst den Workshop, das gab einen Deep Learning Workshop, ja, genau.

Jochen

Ja, dazu gab es auch einen Vortrag, den habe ich auch geguckt.

Genau.

Jochen

Ich habe auch sowieso wahnsinnig viele Talks gar nicht angeguckt.

Aus den Netzwerk, oh.

Jochen

Aber ansonsten, doch, ja, so ein paar Sachen habe ich auch schon gesehen.

Das stimmt.

Dominik

Ja, aber war interessant, war viel los.

Dominik

Und es gab nur eine ganz tolle Stundebetreuung.

Jochen

Ja.

Jochen

Wenn ich das mal vorher gewusst hätte, habe ich mir gar nicht so aufgefallen, aber es gab einen Riesenhüpfburg und so.

Ja, hätte man.

Dominik

Hätte Mädels Spaß haben können.

Jochen

Ja, genau.

Jochen

Was, äh, also ich, genau, dieser Deep Learning-Vortrag war jetzt, für mich war da jetzt, also es ist interessant, weil mich das Thema natürlich interessiert und so, aber so wahnsinnig viel Neues war jetzt nicht dabei für mich.

Jochen

Auch der Workshop war jetzt, also wahrscheinlich schon interessant für Leute, die das jetzt noch gar nicht kennen, war das Katzen versus Hunde-Beispiel aus Kegel.

Das hatten wir auch schon mal gemacht.

Jochen

Das wir auch schon mal gemacht hatten.

Jochen

Deswegen fand ich das auch interessant, ob das Leute vielleicht auch aus dem Anamblikwinkel etwas besser darstellen oder was die da so zu erzählen.

Jochen

Und ja, also die haben da irgendwie bessere Netze verwendet.

Jochen

Also diese Zahlen waren hinterher besser.

Jochen

Das war tatsächlich ganz cool zu sehen.

Jochen

Und da muss ich auch mal gucken, ob ich da nicht vielleicht einfach da mal so ein bisschen ein paar stärkere Modelle mit reinbaue.

Jochen

Aber so, ansonsten war das jetzt für mich jetzt gar nicht, also war jetzt, war jetzt nicht so viel Neues dabei.

Dominik

Ja.

Dominik

Ja, und wir haben Post bekommen.

Dominik

Nette Post.

Jochen

Ah, genau, natürlich.

Dominik

Einen ganz verbrief von Thorsten, vielen Dank für deinen super netten Brief.

Jochen

Ja, danke schön.

Jochen

Wir haben es irgendwie nicht so richtig geschafft, darauf zu antworten, weil gerade viel Stress war.

Jochen

Ist aber noch viel Stress.

Jochen

Gehört nicht auf.

Jochen

Aber genau.

Jochen

Ja, aber trotzdem hat uns sehr gefreut.

Jochen

Wir hatten auch noch eine Mail bekommen von jemandem, der sich dafür interessiert hat, wie das mit den Generatoren so funktioniert.

Jochen

Ja, und das ist natürlich auch eine interessante Frage und vielleicht kann man das eigentlich auch hier kurz

überhaupt nicht.

Dominik

Ja, dann sag mal bitte, was hat der SPD?

Was muss er denn?

Jochen

Genau, man kann auch einfach Listen nehmen und dann funktioniert das auch alles.

Jochen

Ja, kann man, aber manchmal ist es halt schlauer, einen Generator zu nehmen.

Jochen

Also wenn man zum Beispiel eine sehr große Datenstruktur hat mit vielen Elementen in der Liste und darüber iteriert, dann passt die vielleicht gar nicht komplett in den Hauptspeicher.

Jochen

Das wäre natürlich halt schlecht, weil dann wird das nicht funktionieren.

Dominik

Ist das nicht auch einer der Unterschiede von Python 2 auf Python 3 gewesen, dass bestimmte Sachen dann als Generatoren zurückgegeben wurden?

Jochen

Ja, also bei dem Dikt ist es irgendwie ab Python 3 so, dass Items einen Generator zurückliefert, während bei Python 2, glaube ich, ITA-Items musste man dann aufrufen.

Jochen

Ich bin mir noch nicht sicher, ob das wirklich der Unterschied zwischen 2 und 3 war.

Jochen

Kann aber gut sein.

Jochen

Oder das Range und X-Range, nein, genau.

Jochen

Bei Python 2 musste man X-Range.

Dominik

Range gab eine Liste.

Jochen

Ja, und X-Range dann den Generator und jetzt mittlerweile ist es halt so, dass Range einen Generator zurückgibt, was ja halt auch irgendwie sinnvoller ist.

Jochen

Weil wenn man Range irgendwie, ich weiß nicht, wie groß die Zahl sein muss, die man in Range reinsteckt, damit man den Hauptspeicher dann platt macht und das Programm sofort beendet wird vom Kernel.

Jochen

Wahrscheinlich muss man eine große Zahl nehmen, aber dann ist halt so ein bisschen frustrierendes Erlebnis vielleicht, wenn dann einfach gar nichts mehr geht.

Dominik

Ja, aber genau, was ist überhaupt ein Generator?

Dominik

Also eine Liste, wir wissen ja vielleicht, da ist irgendwie eine kleine Datenstruktur, wo verschiedene Elemente drin stehen, über die man sowas kann wie iterieren.

Dominik

Das heißt, man geht über jedes einzelne Listenelement durch und kann dann damit Dinge anstellen.

Jochen

Ja, der große Unterschied ist im Grunde, dass die Liste halt schon fertig ist.

Jochen

Also alle Elemente der Liste sind halt ja schon drin und das Ding ist irgendwie in der Datenstruktur, die im Hauptspeicher liegt.

Jochen

Bei dem Generator ist es so, dass wenn man darüber iteriert, halt immer das Objekt gefragt wird, was ist denn das nächste Element, sozusagen gibt man das nächste Ding oder so.

Jochen

Und intern sieht das dann halt so aus, dass eine Funktion meistens dann irgendwas raushieldet.

Jochen

Also nicht Return, sondern irgendwie das.

Dominik

Das merkt sich, wo sie gerade war.

Jochen

Ja, genau, und hieldet dann das nächste Ding raus und muss aber die Sachen vorher und nachher gar nicht alle speichern, sondern betrachtet immer nur das aktuelle Element sozusagen oder das aktuelle Ergebnis einer Berechnung und wird dann halt weiterhin weiter ausgeführt bei der nächsten Iteration.

Jochen

Also das heißt, man kann halt über eine eben, wenn man das Beispiel Range nimmt, eine Liste von einer Billionen Zahlen iterieren, ohne diese Liste der Billionen Zahlen jemals irgendwo tatsächlich halten zu müssen.

Dominik

Aber es könnte an einer Stelle ein bisschen länger dauern, es zu berechnen, diesen einen Schritt zu gehen, was wahrscheinlich relativ marginal ist bei der CPU, aber die Liste würde sonst im Speicher schon komplett liegen.

Jochen

Genau, bei einer Liste, ja.

Dominik

Der Generator hat dann viel weniger Speicher, den er verbraucht, gerade bei so großen Datenmengen.

Jochen

Genau.

Jochen

Und ja, also

schneller, ja.

Dominik

Warum ist ja denn der Generator so viel schneller als die Liste?

Jochen

Ja, das kommt drauf an.

Jochen

Also das würde ich jetzt so nicht sagen, dass der Generator immer schneller ist, das kann man so nicht sagen.

Jochen

Okay.

Jochen

Eher wahrscheinlich ein bisschen langsamer, aber es hat halt andere Vorteile.

Jochen

Also der Vorteil ist halt, man kann damit Dinge tun, die mit Listen halt nicht gehen.

Jochen

Und ja, also auch wenn man jetzt irgendwie zum Beispiel Files parst oder so, man möchte halt möglicherweise, also das ist vielleicht aber ja auch so ein Beispiel für, du kannst natürlich irgendwie, wenn du ein großes XML-Dokument beispielsweise hast, auch das Ding komplett in den Hauptspeicher parsen als Datenstruktur und dann da mit irgendwas machen.

Jochen

Oder du kannst halt da Schritt für Schritt durchgehen.

Jochen

Und Generatoren werden halt sozusagen, also sozusagen, das wäre eine andere Möglichkeit, das zu vergleichen.

Jochen

So irgendwie DOM Parser versus SAX-Parser.

Das kennt wahrscheinlich auch keiner.

Ach, warte, warte gerade.

Dominik

Also DOM ist das Webseiten-Strukturelement von den HTML-Baken.

Jochen

Object-Model, ja, genau.

Jochen

Also diesen Baum gibt es aber nicht nur jetzt bei HTML-Seiten, sondern halt, wenn du jetzt irgendwie beliebige XML-Geschichten hast, kann man halt auch entweder das so parsen oder sich vom Parser so zurückgeben lassen, dass man halt den kompletten Baum im Hauptsprech hat.

Jochen

Was bei kleineren Sachen ja gar kein Problem ist und es ist halt ein bisschen komfortabler, weil man halt irgendwie da hin und her springen kann.

Jochen

Oder aber man sozusagen parst das Eventbasiert und lässt sich halt vom Parser Events geben, wie zum Beispiel, da kommt jetzt ein neues Element vorbei oder so.

Jochen

Und dafür muss das Ding aber dann halt nicht komplett im Hauptspeicher liegen, sondern das wird dann halt sozusagen iterativ gepasst.

Jochen

Und damit kann man halt Sachen parsen, die halt so groß sind, dass man, ich meine, braucht, wenn man das, wenn man XML komplett parst, wahrscheinlich das zwei, drei, vier-fachen Speicher von dem, wenn es auf der Platte liegt, im Hauptspeicher.

Jochen

Und wenn jetzt 2 Gigabyte, weiß ich nicht, Ding auf der Platte liegen hat, dann hat man unter Umständen ein Problem.

Jochen

Früher war das schlimmer, früher war bei 32 Bitzels sehen wir noch, dass da schnell Ende.

Ein V-Speicher voll.

Jochen

Ja, war halt mit 3 GB 4, ja, das ist halt Hauptspeicher voll.

Dominik

Also oben war out of mana, ne?

Jochen

Ja, mittlerweile kann man ja auch viele Hauptspeicher einstecken.

Jochen

Also begegnet es einem wahrscheinlich eher selten, dass man irgendwie das an den Hauptspeicher ausgeht, wenn man irgendwas passt.

Jochen

Aber selbst da, es kann natürlich immer noch passieren und wenn man jetzt sozusagen auch in der Lage sein möchte, Daten zu verarbeiten, die jetzt nicht in Hauptspeicher passen, dann macht man eben sowas.

Jochen

Und passt halt eventbasiert.

Jochen

Ist ein bisschen mehr Arbeit dann sozusagen beim Programmieren, aber verbraucht halt nicht so viele Hauptsprecher.

Jochen

Und solche Arten von Fällen gibt es natürlich viele, wo man irgendwie wo Ströme von Daten hat.

Jochen

Irgendwie auch wenn man sich irgendwie sich an irgendwelche APIs dranhängt und dann kriegt man halt da irgendwie.

Dominik

Häppchen weiter irgendwelche Requests.

Jochen

Genau, genau.

Jochen

Dann ja, für all diese Dinge ist es halt sehr sinnvoll.

Jochen

Und ja, man kann Generatoren halt auch quasi mehr oder weniger, also man kann diese Funktionssyntax mit Yield verwenden oder halt das Iterator-Protoll bzw.

Jochen

Generator-Protokoll dann halt verwenden oder man kann halt auch einfach eine Generator Expression schreiben.

Jochen

Das ist so ähnlich wie List-Comprehension, bloß halt mit Rundenklammern statt Ecking und dann hat man das halt auch in einer Zeile irgendeschrieben, was halt auch unter Umständen sehr praktisch ist.

Dominik

Aha, das heißt also, wenn ich eine List-Komprehension mit runden Klammern schreibe, habe ich automatisch einen Generator und das funktioniert genauso.

Jochen

Ja, und wenn man jetzt noch eine andere Geschichte mit dazu nimmt, dann hat man sogar, also wenn man jetzt nicht nur Sachen aus einer Funktion raushielden kann, also sozusagen da passiert ja folgendes, also wenn normalerweise eine Funktion returnt, dann ist die Funktion ja fertig.

Jochen

Aber wenn man etwas raus yieldet, dann wird die Funktion sozusagen nur unterbrochen, bis halt sozusagen das nächste Ergebnis da rausgeholt wird.

Jochen

Und wenn man jetzt auch noch Sachen da reinstecken kann, dann kann man tatsächlich so bidirektionale Kommunikation irgendwie haben.

Jochen

Und dann kann man sowas haben wie einen Websocket-Server oder irgendwie einen Server, der halt Sachen annimmt und wieder Sachen zurückschickt.

Jochen

Und das halt.

Dominik

Auch das macht ein Generator schön.

Jochen

Das wäre dann jetzt nicht mehr wirklich Generator, sondern das wäre dann irgendwie so Q-Routinen, aber das, das, was kann man da machen.

Jochen

Und ja, sehr nett.

Jochen

Oh, was mir auch da beim Beantworten dieser Mail aufgefallen ist, ist halt, dass mittlerweile Listen relativ wenig Hauptspeicher verbrauchen.

Jochen

In Python 3.7 war das jetzt.

Das war früher viel mehr.

Jochen

Früher waren das irgendwie, also ich sag mal, also keine Ahnung, was habe ich da hingeschrieben.

Jochen

So bei 30 Byte oder ich weiß es nicht mehr genau.

Jochen

Also vielleicht auch ein bisschen weniger, bis wir die genaue Zahl nachgucken, aber man hat halt einen gewissen Overhead, dadurch, dass das halt ein Objekt ist, ein Integer-Objekt, das halt in der Liste steckt und dann braucht man halt auch noch irgendwie eben, man hat halt die Referenz auf das Integer-Objekt, das Integer-Objekt trotzdem selber irgendwie Platz und dann hat man halt nicht das, was das Ding eigentlich brauchen würde, nämlich irgendwie 8 Byte bei einem 64-Bit.

Dominik

C-Programmier werden sagen, völlig ineffektiv wollen wir auch.

Jochen

Ja, super ineffizient, sondern halt irgendwie das mal 3 oder sowas.

Jochen

Oder vier.

Jochen

Was immer noch ganz okay ist, aber das macht natürlich schon einen großen Unterschied, wenn man jetzt Listen mit einer großen Menge von Zahlen im gleichen Datentyp hat oder so, dann denkt man sich so, naja gut, irgendwie bekloppt.

Jochen

Früher eine Möglichkeit, das Array-Modul in der Standardbibliothek zu verwenden, das macht das einfach quasi so ein Type-Memory-View in C.

Jochen

Da ist es auch, dem gibt man halt einen Typ an und dann braucht das genauso viel Platz, wie man da, wie der Typ halt braucht, nativ.

Jochen

Oder man nimmt halt NumPy, da geht das auch.

Jochen

NumPy ist natürlich jetzt nicht in der Standardbibliothek, aber so und jetzt habe ich halt nachgeguckt, okay, wie viel wir brauchen das in der Liste und da war ich eine Liste mit 100 Millionen Dingern genommen oder so und das hat dann nur noch irgendwie 860, knapp 68 MB Hauptspeicher gebraucht auf meinem System.

Jochen

Und ich dachte so, huch, wie ist das?

Jochen

Was ist das denn?

Jochen

Ehrlich gesagt, ich weiß nicht genau, woran das liegt.

Jochen

Das müsste ich vielleicht auch bis zum nächsten Mal recherchieren, woran das liegt, aber das ist ja, das ist ja super.

Jochen

Also das ist viel weniger, als das früher war.

Dominik

Wie wird hätte das früher so im Bereich, dann vielmal viel oder deutlich mehr?

Jochen

Ja, da hätte ich ja eher erwartet, dass das halt so 3 GB werden oder so.

Jochen

Weil, äh, ja.

Dominik

Python-Sparplatz.

Dominik

Irgendjemand hat das vernünftig.

Jochen

Das ist da optimiert worden.

Jochen

Vielleicht weiß das ja auch jemand, was passiert ist.

Dominik

Ja, Generatoren, liebe Magic.

Dominik

Genau, Generatoren.

Dominik

Chapter mal ist Zeit ist, glaube ich, für.

Dominik

Oh, ich habe gerade dazu gleich mein Handy geklaut.

Dominik

Herzlichen Glückwunsch an meine Cousine, sie hat gerade einen Heiratsantrag bekommen.

Jochen

Oha.

Ja, ja.

Dominik

Wir freuen uns alle für Sie mit.

Jochen

Ja, genau.

Jochen

Ja, was hatten wir denn noch?

Jochen

Ah, genau.

Jochen

Dann habe ich irgendwie Podcasts gehört, das war auch irgendwie wieder sehr nett.

Du hörst sowas.

Ja, ja.

Jochen

Der Django, äh, Django-Chat-Podcast hatte wieder eine ganz nette Folge mit.

Dominik

Bevor du davon erzählst, also ich höre ja auch ab und zu mal gerne Podcast, also ich höre auch was zum Bilden, aber manchmal auch einfach Eishockey-Short in den News.

Dominik

Wenn ich ja einmal kurz bei Werbung machen darf.

Jochen

Ah, okay.

Dominik

Falls jemand sich noch für Eishockey interessiert, weil es nicht so wahrscheinlich, aber vielleicht gibt es ja Menschen.

Dominik

Ja, tolles Ding.

Dominik

Gab es einen kleinen Skandal.

Dominik

Nein, egal.

Jochen

Ja, Düsseldorf und Eishockey, ja, doch, hat ja auch irgendwie.

Dominik

Ja, ja, man hat sich um einen der Sponsoren aufgeregt, der war nicht so ganz.

Dominik

Der hat so ein paar komische Sachen gepostet.

Dominik

Das haben die investigativen Journalisten von Journalisten aufgedeckt.

Dominik

Mal gucken, ob wir nächstes Jahr noch in der Liga ins Leisten kommen.

Tja.

Jochen

Genau, ja, nee, ich höre auch noch andere Podcasts, aber auch viel Zeugs und das, ähm, genau, da gab es eine Episode mit Andrew Godwin, der, der, das auch ein bekannter Django-Entwickler hat, viel, der von dem schaut das ganze Migrations Framework, was jetzt bei N7, glaube ich, in Django reingekommen ist.

Jochen

Früher hieß es South.

Dominik

Was muss man früher machen, bevor man Django Migrations machen konnte?

Jochen

Naja, da gab es halt drei, ich glaube, es gab drei unterschiedliche Systeme.

Jochen

Es gab eins von Andrew Godwin, das South gab es, es gab eins von Simon Willison und es gab noch eins von

Dominik

deutlich mehr Arbeit gewesen früher irgendwie.

Jochen

Naja, die meisten Leute haben dann dann schon South verwendet, irgendwie, insofern, was ich nicht wusste, ist, es ist komplett reimplementiert worden, als es dann bei Django 1.7 reinkam.

Jochen

Also er hat das halt nicht einfach übernommen, sozusagen, sondern er hat es nochmal komplett neu geschrieben.

Dominik

Ja, was man nicht so alles lernt, wenn man irgendwie zwei Jahre weiter ist, ne?

Dominik

Wieso macht man das?

Dominik

Ah, nee, offen.

Dominik

So bei NFTG, was habe ich denn da geschrieben?

So ein Unsinn, ja.

Jochen

Naja, jedenfalls, der macht momentan beschäftigt sich ja ganz viel mit, ja, da damit Django so ein bisschen mehr auf diese Async-Schiene zu kriegen, weil das ist ja so ein Ding, das ist halt Django überhaupt gar nicht.

Jochen

Also die ganzen großen Fanworks sind das nicht, Flaskes ist das auch nicht.

Jochen

Bei Django ist es halt aber schwierig, das zu ändern, weil das einfach so viel Zeug ist.

Jochen

Und weil halt die API, also die Whiskey-API gibt es halt nicht, ja.

Jochen

Es gab.

Jochen

Ich gebe Post.

Jochen

Ja, Post.

Dominik

Hahaha, die wollte ich schon immer überbringen.

Jochen

Er hatte da vorher ein Projekt, Django Channels, oder das gibt es natürlich immer noch.

Jochen

Er ist dann halt irgendwann, hat die Mint Handels davon abgegeben, aber jetzt geht es darum, halt sozusagen Django selber Async-fähig zu machen.

Jochen

Was halt auch eines der Ziele ist für jetzt Django 3 irgendwie und er hat da irgendwie ein Projekt, ein großes Projekt gestartet und so.

Jochen

Das wird tatsächlich sehr interessant.

Jochen

Also ich bin schon sehr gespannt.

Jochen

Also, das wäre natürlich, also meine Idealvorstellung auch, dass man ja, naja gut, das wird halt noch lange dauern, aber dass halt alles asynchron ist von, also einmal, dass man Web-Socket-Geschichten halt auch direkt machen kann, dass man Clients irgendwie, wenn sich irgendwas geändert hat, benachrichtigen kann und dass man halt auch irgendwie eine Menge Datenbankabfragen oder halt auch API-Anfragen an andere Geschichten, dass man halt sozusagen Endpunkte hat, die dann wiederum andere API-Endpunkte anfragen, irgendwo anders vi

Jochen

elleicht.

Jochen

Und dass man das alles auch wieder asynchron zusammen aggregieren kann und dann nicht das synchron hintereinander machen muss, wie das momentan passiert.

Jochen

Dann hat man halt irgendwie 200 Abfragen, die man irgendwo hin macht.

Jochen

Dann macht man vielleicht 100 Statements und dann fragt man noch irgendwie ein paar APIs und da muss man halt manchmal vielleicht auch zwei oder drei Requests machen und dann verbreitet man unheimlich viel Zeit dabei zu warten.

Jochen

Und das ist natürlich blöd, weil die Latenz natürlich irgendwie entscheidend ist.

Jochen

Und wenn man das asynchron machen würde, dann müsste man halt sozusagen nur, dann würde der längst laufende Request halt dann noch die Latenz bestimmen, aber ja, wenn der halt auch relativ schnell wieder da ist, dann kann das, kann das relativ flott gehen.

Das wäre sehr schön.

Nicht schlecht.

Jochen

Ja.

Jochen

Jedenfalls, genau, der hat auch irgendwas, der hat tolle Sachen erzählt, der arbeitet irgendwie bei Eventbrite und also zum Beispiel eine Geschichte, wo ich dachte, so hätte ich nie gedacht, dass Leute damit Probleme kriegen können, ist, dass sie teilweise sehr schnell darauf reagieren müssen, wenn sich irgendwie Traffic ändert bei Ihnen, weil manchmal kommt, so kriegen sie sehr kurz Bescheid gesagt und dann sehr viel Traffic.

Dominik

300.000 Leute wollen in den nächsten 15 Sekunden unseren Service.

Jochen

Ja.

Jochen

Und dann müssen sie halt entsprechend Maschinen hochfahren oder zumindest irgendwie neue Applikationsserver oder so für eine bestimmte Geschichte.

Jochen

Und sie haben das Problem, dass Django bei ihnen sehr langsam mittlerweile.

Jochen

Also das ist halt auch so ein Eventbrite hat irgendwie so knapp über eine Million Zeilen, Python-Code.

Dominik

In Django.

Jochen

Und ist ein Django-Projekt, ja.

Jochen

Und das startet relativ langsam.

Dominik

Ja, ja, kennt ihr.

Jochen

Ja, das ist, denke ich, auch bekannte Geschichte.

Jochen

Und das Ding braucht halt mindestens 30 Sekunden zum Starten, weil das einfach so lange dauert, bis die ganzen Imports aufgelöst sind.

Jochen

Also, oh Gott, oh Gott, oh Gott.

Dominik

Wir haben so 30 Sekunden vorher wissen, was passiert.

Dominik

Da kommt kein Sturm.

Jochen

Das Problem ist, du kannst es halt nicht optimieren.

Jochen

Es ist halt, wenn die Imports so lange dauern, dann dauert es halt so lang, da kannst du nicht viel machen.

Jochen

Das ist natürlich schon bitter.

Dominik

Ja, man müsste welche rausschmeißen eigentlich, ne?

Jochen

Ja, aber.

Dominik

Dann geht Muttiverlust.

Jochen

Genau.

Jochen

Das geht ja auch nicht.

Jochen

Ja.

Jochen

Also hoffentlich, also ja, muss man schon sagen, so das vielleicht dann doch irgendwie an der Zeit dann mal so den monolithischen Ansatz irgendwie

Dominik

mehrere Optionen, wie man sowas ausmisten kann.

Dominik

Irgendwo ab und zu mal ein paar Sachen abhacken, gucken, was noch stehen bleibt.

Dominik

Oder mal wirklich mühevoll rangehen, alles neu umsortieren.

Dominik

Dann ist halt die Frage, wie lange dauert so ein Refactoring, wenn du dann komplett auf.

Jochen

Ja, aber du kannst nicht viel machen.

Jochen

Also Refactoring hilft dir auch nicht.

Dominik

Ja, aber alle Features erstmal rausschmeißen.

Jochen

Ja, gut, die ganz ganzen Features streichen, aber das ist nicht.

Dominik

Ja, aber du kannst ja zum Beispiel nicht sowas machen wie Features, nur dann laden, wenn du sie wirklich brauchst.

Dominik

Und dann dafür irgendwelche extra Requests machen, weil die ganzen Basissachen vielleicht brauchen die gar nicht.

Jochen

Ja, also bei Django ist es so, da werden deine Installed-Apps, die werden alle importiert da.

Jochen

Du kannst es, soweit ich weiß, auch später nicht ändern.

Jochen

Du kannst nicht sagen, jetzt irgendwas in Installed Apps hinzufügen, dynamisch.

Jochen

Also wahrscheinlich geht es schon doch.

Jochen

Wenn man sich da genug Mühe gibt, dann kriegt man das wahrscheinlich hin.

Jochen

Aber das ist so nicht, sondern das passiert beim Starten.

Jochen

Da wird gehen, genau, wenn die ganzen Installed-Apps gehen, dann geht man durch und importiert die ganzen Dinger.

Dominik

Ja, also falls uns jetzt noch jemand zuhört, der nahe.

Jochen

Achso, ja, genau.

Jochen

Moment, wir sind noch nicht ganz durch mit den Geschichten.

Jochen

Was haben wir denn, was haben wir denn noch?

Jochen

Ne, oder sind wir doch durch?

Jochen

Hattest du noch irgendwas?

Nö, gerade vor jetzt.

Jochen

Alles klar, okay, dann haben wir doch, sind wir doch mit dem News-Teil durch.

Jochen

Alles klar.

Jochen

Ja, ja, ja.

Jochen

Okay.

Jochen

Dann mache ich hier mal eine Kapitelmarke zu.

Jochen

Zum eigentlichen Thema.

Dominik

Ja, wir wollten natürlich jetzt erklären, was naiv Base denn ist.

Dominik

Was macht das denn?

Dominik

Wofür braucht man das denn?

Dominik

Und erstmal ist das ja erstmal, glaube ich, so eine Beschreibung einfach nur für so ein statistisches.

Jochen

Ja, also die baseische Regel kennt man ja vielleicht.

Kennt man das?

Jochen

Ja, warte, lass mich nochmal weiter nachkombinieren.

Dominik

Ja, das geht ja nicht so Wahrscheinlichkeiten, die man bedingte Wahrscheinlichkeiten von Ereignissen berechnet, die in der Zukunft stattfinden.

Dominik

Oder anhand dessen von der Eintrittswahrscheinlichkeit, die in der Vergangenheit, die man schon kannte, von ähnlichen Dingen.

Dominik

Und ja, dann kann man die miteinander kombinieren.

Jochen

Also bei Ethereum ist eigentlich einfach.

Dominik

Wir gucken jetzt nicht wirklich bei Wikipedia nach und lesen Wikipedia vor, oder?

Jochen

Dachte ich.

Jochen

Okay, wir tun das.

Jochen

Ah, naja.

Jochen

Also ja, im Grunde ist das einfach nur eine Möglichkeit, wie man halt sozusagen die Wahrscheinlichkeiten umdrehen kann.

Jochen

Also man weiß halt die Wahrscheinlichkeit von B, wenn A, ja, und jetzt möchte man das irgendwie umdrehen und dafür gibt es halt diese Regel, die das dann sagt, wie das geht.

Dominik

Ja, nur als Beispiel, was kann man das dann.

Dominik

Also ihr habt jetzt ein Kartenspiel oder sowas, ja, die Wahrscheinlichkeit dafür, dass er einen König zieht.

Dominik

Wie viel ist das denn 4, 52 oder so?

Dominik

Und dann willst du halt wissen, wie hoch die Wahrscheinlichkeit ist, dass du ein Bild ziehst.

Dominik

Und dann hast du wie viel 3 mal, 4, 2.

Dominik

Und dann kannst du dir überlegen, ja, die Wahrscheinlichkeit, dass so ein König siehst, dass es ein Bild ist.

Dominik

Dann hast du die Wahrscheinlichkeit, dass es ein Bild ist und eine Bedingung ist ein König ist und andersrum.

Jochen

Ja.

Dominik

Weil die Wahrscheinlichkeit, dass es ein Bild ist und dann Bedingung, dass ein König ist, ist halt eins, weil jeder Königin ein Bild ist.

Dominik

Und andersrum kannst du dann halt ausrechnen, was kommt denn da raus.

Jochen

Ja, also

Dominik

verknüpfst du halt die beiden Wahrscheinlichkeiten mit den Ereignissen und so kann man ein bisschen in die Zukunft schauen, dass das da das, was die Statistiker so gerne tun mit der Glas.

Dominik

Darüber reibeln.

Dominik

Genau.

Dominik

Ja, wir haben eine Eintrittswahrscheinlichkeit, die würden wir gerne bestimmen, anhand von Features.

Dominik

Und das ist ja das, was uns dann hinterher dann in diesem Machine Learning-Ding, glaube ich, am meisten interessiert.

Dominik

Wie man aus diesem einfachen Beispiel von Feature-Dingern.

Dominik

Ich glaube, wir haben gesagt, wir machen das anhand diesem Spam-Beispiel.

Dominik

Das heißt, es geht darum, glaube ich, welche Worte da.

Jochen

Genau, im Grunde sind halt die, was man, was man halt weiß, ist sozusagen die Wahrscheinlichkeit, dass wenn man bestimmte Worte sieht, ob das jetzt spam ist oder nicht, man möchte es halt umdrehen, man möchte halt sagen können, ja, was, wenn ich jetzt diese Nachricht mit den Worten gesehen habe, welche Wahrscheinlichkeit habe ich denn jetzt?

Dominik

Ja, also das lasse das gut an.

Dominik

Deswegen ist das ja auch naiv, weil man tut so, als wären die unabhängig voneinander, als wäre ein Wort entweder spam oder nicht.

Jochen

Genau, und das ist es natürlich nicht so richtig, das stimmt nicht.

Jochen

Man darf das nicht einfach so alles aufmultiplizieren.

Dominik

Nach Idiot-Base sagen oder so.

Dominik

Ja, aber es funktioniert.

Jochen

Genau, es ist ja auch irgendwie sozusagen der erste funktionierende Ansatz gewesen, um irgendwie mit diesem Spam-Ding fertig zu werden.

Jochen

2004 Programm Plan for Spam.

Jochen

Ich habe das jetzt ehrlich gesagt gar nicht so deswegen gewählt, weil das für Machine Learning so eine interessante Geschichte ist, weil eigentlich ist es das nicht, das verwendet man ja.

Dominik

Also ja, so Öl-Klassifikation, so einfache Dinge, ja, nein, bist du drauf nicht?

Dominik

Nein.

Dominik

Ist mein Gesicht drauf nicht?

Dominik

Drauf kann ich nicht, kann ich nicht mit Bass machen?

Jochen

Nee, da wird es wahrscheinlich eher, das wird schon nicht mehr gehen.

Jochen

Aber es ist trotzdem interessant.

Jochen

Und zwar, also ich habe das vor allen Dingen deswegen mir jetzt nochmal angeguckt, beziehungsweise überlegt, dass es ein gutes Beispiel wäre, weil ich ein Beispiel haben wollte für etwas, was man in Pure Python sozusagen machen kann.

Jochen

Wo man nur die simplen Datenstrukturen irgendwie nimmt, die man halt irgendwie so dabei hat.

Jochen

Also Skalare, Listen, ja oder beziehungsweise Strings als eine Form von irgendwie Variablen, die jetzt halt einen bestimmten Wert haben.

Jochen

Listen, Dictionaries und das war's eigentlich.

Jochen

Und mehr braucht man gar nicht.

Jochen

Und halt man halt dann noch Funktionen, die man irgendwie aufruft und das war's.

Jochen

Und das ist.

Dominik

Wir sind bei einer totalen Einsteigerfolge angekommen.

Jochen

Ja, eigentlich schon.

Jochen

Also das ist halt das Interessante, dass man damit halt so wahnsinnig viel machen kann.

Jochen

Und das ist halt etwas, was ich gerne irgendwie vermitteln würde.

Jochen

Weil das, also wenn man das hinkriegt, wenn man das versteht, dann hat man schon ganz viel.

Dominik

Okay, das heißt, anhand Python lernen ein bisschen anhand von Jochens Beispiel, mit dem man auch Machine Learning machen kann.

Dominik

Und zwar hat ein Notebook hast du auch auf deinem GitHub.

Jochen

Genau, das kann ich dann auch in den Showdown verlinken, wo da halt dieses Notebook drin ist und sich das mal angucken kann.

Jochen

Ich benutze halt einfach irgendwie, es gibt so ein SMS-SBAM-Dataset bei Kagel.

Jochen

Das habe ich mir runtergeladen, irgendwie auf mein S3 gepackt und das Notebook zieht sich das davon einfach und lädt es runter und dann hat man das.

Jochen

Das ist nicht so viel, das sind irgendwie, warte, lass mich mal gerade gucken.

Jochen

Ich werde die Stadt, dass dieses Ding hier auch einfach mal erstmal neu.

Jochen

Okay.

Jochen

Lade das mal runter, es sind irgendwie nur so 200 Kilobyte.

Jochen

Okay.

Jochen

Anpausen wir das mal.

So.

Jochen

Okay, wie viele Nachrichten haben wir denn da drin?

Jochen

5500.

Jochen

Und davon sind, ich weiß jetzt gar nicht genau, wie viele 1500 sind, ah nee, ich weiß, ihr müsst ja nachgucken.

Jochen

Also es ist deutlich mehr Ham als Spam, aber.

Jochen

Ein Schinken?

Jochen

Ja, genau.

Jochen

Und ja, aber es ist halt eigentlich nicht viele Datenpunkte oder Beobachtungen, sozusagen, wenn man jetzt so heutige Maßstäbe anlegt, aber es ist auf jeden Fall ein Details, wenn man schon so ein bisschen was machen kann und ja, es tut halt auch nicht, wie man es irgendwo hin runterlädt.

Dominik

Ja, also könnt ihr auch erstmal so ein bisschen Handling dafür bekommen.

Dominik

Wie funktioniert das denn mit der Klassifikation, wenn ich jetzt so zwei Dinge habe, die ich voneinander trennen möchte?

Jochen

Genau, dieses Ding, das Beispiel hier würde übrigens auch für sozusagen beliebig, also für ganz beliebig vielleicht nicht, aber mehr als zwei auf jeden Fall auch funktionieren.

Jochen

Also ganz genauso.

Jochen

Also aber es wäre Multiclass-Klassifikation, das heißt, man würde hinterher sozusagen die bestpassendste Klasse rausfallen, man würde nicht mehrere Klassen, zu denen jetzt irgendwas gehört bekommen.

Jochen

Also man könnte sich ja vorstellen, es gibt jetzt nicht nur Spam und Ham, sondern es gibt auch noch irgendwie Newsletter oder irgendwie Notifikationen von irgendwelchen Social Networks oder sowas.

Jochen

Ja, aber vielleicht möchte man das ja aus irgendjemand noch immer irgendwie Pfeiler unterteilen und die Notifikationen sehen, die dich irgendwie dahin latschen sollen, doch mal wieder ein bisschen Zeit irgendwie auf Facebook zu verbringen oder so.

Jochen

Und dann würde man jetzt mit dem Ansatz auch immer nur eine von den Klassen kriegen.

Jochen

Aber es könnte natürlich eben sein, dass es zum Beispiel eine Notifikation ist und Spam.

Dominik

Ja, also das herausfällt, weil Naiv Base halt einfach sagt, nö, ich will jetzt nur eins haben.

Jochen

Also das wäre jetzt der, also das, was wir, das, was in einem Notebooks drin steht, da fällt halt hinterher eine Kategorie bei raus.

Jochen

Man könnte es auch so umbauen, dass es Multilevel kann, aber ist halt nicht so.

Dominik

Wir machen ja das Anfänger bei.

Jochen

Wir machen jetzt ein einfaches Beispiel.

Jochen

Also Analyse.

Jochen

Genau.

Jochen

So, was wir jetzt, was wir jetzt da zuerst machen, ist das halt in Training und Test-Dinger aufzuteilen.

Jochen

Da habe ich das einfach zufällig getrennt nach, also 25% sind halt Tests, der Rest ist Training, also 75%.

Jochen

Und ja, das, was ich jetzt eigentlich sozusagen, und das wäre natürlich schon schön, wenn man sich das irgendwie angucken würde oder so, aber was ich jetzt eigentlich zeigen wollen würde, ist, dass wie einfach das ist, sozusagen ein Modell zu trainieren, das jetzt zwischen Spam und nicht Spam unterscheiden kann.

Jochen

Und zwar das schon relativ gut.

Dominik

Also indem es einfach die bedingte Wahrscheinlichkeit wohersagt, dass es World enthält, die Spam sind, unter der Bedingung könnte Spam sein.

Dominik

Ja.

Jochen

Ich kann ja mal kurz versuchen, mit Worten zu beschreiben, wie dieser Trainingsprozess aussieht.

Jochen

Und der ist halt, man geht jetzt über alle Dokumente, die entweder Spam oder Ham sind, drüber.

Jochen

Die in den Trainingsdaten steht ja dran, ob es ein Kopf ist.

Dominik

Ob da Penis drinsteht.

Jochen

Ja, genau, teilt das teilt irgendwie diese SMS halt auf in die Wörter, aus denen sie besteht.

Dominik

Und dann guckt man in alle, also man hat ja Trainingsdaten, wo halt drin steht, dass es Spam ist oder es nicht Spam ist.

Dominik

Und wenn man jetzt sagt, okay, in denen, wo Spam ist, kommen 50 mal Penis vor und denen, wo nicht Spam ist, kommt nur einmal Penis vor, dann hat man so eine bedingte Wahrscheinlichkeit.

Dominik

Aber die Wahrscheinlichkeit, dass Penis vorkommt und es kein Spam ist und die Wahrscheinlichkeit, dass Penis vorkommt und es Spam ist.

Dominik

Und daraus hat man jetzt so nach Base so eine kombinatorische Möglichkeit, sich das rauszurechnen.

Jochen

Genau, man hat jetzt für jedes einzelne Wort eine Wahrscheinlichkeit dafür, dass dieses Wort irgendwie in dieser Kategorie vorkommt.

Jochen

Das ist einfach die Frequenz von dem Wort in der Kategorie.

Jochen

Also wenn halt ja also man muss das natürlich immer noch eben teilen durch die Anzahl der Worte, die überhaupt irgendwie in der Kategorie vorgekommen sind.

Jochen

Deswegen muss man sich das halt auch noch merken.

Jochen

Also was man tut, ist, man geht halt über alle Dokumente, merkt sich, okay, wie viele Wörter habe ich denn jetzt bisher gesehen für die Klasse Spam oder Ham und zählt das dann dann halt hoch.

Jochen

Je nachdem, ob das.

Dominik

Haben wir heute schon mal Penis gesagt?

Natürlich.

Jochen

Oh, wir fliegen bei iTunes drauf machen.

Dominik

Oh, wir sind auf Items?

Na gut.

Jochen

Keine Ahnung.

Jochen

Nee, ich glaube nicht.

Dominik

Ne, Biaga.

Jochen

Das könnte auch eine sehr gefährliche Folge werden.

Jochen

Wir lesen keine Spam-Geschichten vor.

Jochen

Na gut.

Jochen

Auch wenn wir damit reich werden können.

Reich werden?

Jochen

Ich wünsche schon.

Jochen

Das ist ein altes Setter mit SMS-Swam.

Dominik

Okay, wir denken euch gerade ab davon.

Jochen

Also, das, was eigentlich, was man da eigentlich macht, ist, man geht halt über alle Wörter drüber und merkt sich halt sozusagen für das entsprechende Label, was man gerade gesehen hat, irgendwie, ja, man hat jetzt, man zählt da halt hoch, wie viele Wörter hat man diese Kategorie überhaupt gesehen.

Jochen

Und man zählt jetzt sozusagen noch hoch quasi, welche Worte man wie oft gesehen hat, in welcher Kategorie.

Jochen

Und dann kann man hinterher sagen, okay, wenn ich jetzt eben in der Kategorie Spam zehnmal Penis gesehen habe und ich habe insgesamt tausend Wörter gesehen, unterschiedliche Wörter, dann ist die Wahrscheinlichkeit, dass es Spam ist, wenn ich jetzt das Wort Penisiere, ist es halt, was ist das dann, 1% oder sowas?

Dominik

Ich habe jetzt nicht genau mitgerechnet, aber

Jochen

ja, es ist immer blöd, sowas, also genau.

Jochen

Und das macht man jetzt, also nochmal, ich gehe einfach jetzt, verdammt, das ist gar nicht so einfach.

Jochen

Also die Trainingsfunktion ist einfach nur, ja, man geht über alle Dokumente drüber, zählt für das Label halt hoch, wie viele Dokumente man, ach Quatsch, jetzt habe ich das auch noch falsch erklärt.

Dominik

Nee, da musst du nochmal von vorne anfangen.

Jochen

Ja.

Jochen

Was man eigentlich.

Jochen

Landfahrer.

Jochen

Dazu kann ich was erzählen.

Jochen

Jetzt habe ich offenbar keine Ahnung von, aber das ist eine ganz, ganz ultra interessante Geschichte.

Jochen

Dass in, also in England gab es halt diese Kasse der Landfahrer, die waren reich.

Jochen

Wenn man zum Beispiel, na, wie heißt das?

Dominik

Eine Abtei, ein Gutshof.

Dominik

Priori, wenn es umgeht.

Jochen

Wie hieß dieses Buch nochmal?

Jochen

Na, Pride and Prejudice.

Jochen

Genau.

Jochen

Sie fragt so irgendwie, ja, das spielt ja so ein bisschen guteradelig und so.

Jochen

Ja, eigentlich ein gutes Buch, kann ich empfehlen.

Jochen

Und dann kommt da plötzlich da dieser Pfarrer.

Jochen

Wie kann das sein?

Jochen

Das gehört doch eigentlich gar nicht dazu.

Jochen

Doch, doch, doch, doch.

Jochen

Das war, äh, die spielten damit.

Jochen

Das war eine Klasse von Leuten, die relativ viel verdient haben für die damaligen Verhältnisse oder ja, waren halt so und sie mussten praktisch nichts tun dafür.

Jochen

Voll gut.

Dominik

Ab und zu mal vor der Kanzel, Herr Bundes.

Jochen

Es gab sehr viele davon.

Jochen

Und das gab denen Zeit, sich mit allen möglichen abseitigen, sozusagen in allen möglichen Richtungen ihren Interessen nachzugehen.

Dominik

Also das war schon ein bisschen Nachbruder-Tack, oder?

Dominik

Ja, natürlich.

Dominik

Jemand aus wie ich mit so einem großen Fass hat am Bauch.

Jochen

Nee, das ist

deutlich später.

Jochen

Aber das, also es gibt Leute, die tatsächlich ernsthaft behaupten, dass das einer der Gründe dafür ist, warum es dann, warum die Industrialisierung irgendwie so abgehoben hat und warum so viele coole neue Sachen da irgendwie rausgekommen sind, weil es gab halt eine Menge Leute, die hatten viel Zeit, viel Geld und echt nichts zu tun.

Jochen

Und dann haben die halt irgendwie sich einfach da so für interessiert, was sie, was, was, wie baut man eine Dampfmaschine oder ich meine, Darwin war auch so jemand.

Jochen

Also ja.

Jochen

Bayes war da so jemand, mir fällt das jetzt nicht ein, aber es gab eine ganze Menge Leute, die jetzt so total bekannt sind, wo man sich ja denkt, so, wow, die haben großartige Sachen gemacht, waren Landfahrer in England.

Jochen

Ja, war gut.

Dominik

Ja, tote Rückwärtsindution.

Jochen

Ja.

Genau.

Jochen

Also was ich jetzt gerade blödsinnigerweise falsch erzählt habe, ist, dass man sich nicht merkt, wie viele Worte jetzt in der Kategorie vorkommen, sondern merkt sich halt, wie viele Dokumente kommen jetzt pro Kategorie eigentlich vor.

Jochen

Und genau, also was man sich eigentlich merkt, ist, wie viele Dokumente hat man jetzt pro Kategorie gesehen.

Jochen

Und dann halt noch für jedes Wort da drin sozusagen, wie oft kam denn dieses Wort in der Kategorie vor.

Dominik

Und dann hat man die Wahrscheinlichkeit, dass ein Wort vorgekommen ist, wie zum Beispiel Piep, unter der Bedingung, dass es Spam ist.

Dominik

Oder das Wort Piep unter der Bedingung, dass es kein Spam ist.

Dominik

Und das haben wir zwei bedingte Wahrscheinlichkeiten.

Dominik

Und daraus kann man jetzt mit der allgemeinen Wahrscheinlichkeit für das Vorkommen dieses Wortes rausrechnen, wie hoch die Wahrscheinlichkeit denn sein könnte.

Jochen

Genau.

Jochen

Aber das klingt halt alles irgendwie so relativ kompliziert, wenn man es so erklärt.

Jochen

In Code ist das sehr wenig Zeilen.

Dominik

Ja, das ist ja so ein bisschen Brain hin und her, wie es immer bei

Jochen

Satisfaction ist.

Jochen

Also diese Train-Funktion, die hat halt, lass mich nicht lügen, 1, 2, 3, 4, 5, 6, 7 Zeilen.

Jochen

Das ist alles.

Jochen

Und die sind alle relativ kurz.

Jochen

Also keine von diesen Zeilen hat mehr, hat irgendwie mehr als 30 Characters oder sowas.

Jochen

Also es ist wirklich sehr, sehr einfach.

Jochen

Und ja, man kommt mit den ganz simplen Datenstrukturen, ich habe jetzt an der Stelle Defaults Dikt genommen, weil das in Zellen halt schöner ist, als wenn das normale Dikt nimmt, dann muss man so oft Get schreiben oder halt.

Dominik

Aber was ist Defaults Dikt?

Dominik

Ach, das ist eine Bibliothek aus der Standardbibliothek.

Jochen

Nee, ja, es ist in der Standardbibliothek, genau, und zwar aus dem Collections-Modul.

Jochen

Und was das macht, ist, dass man, also wenn man das, das sollte man vielleicht schon kennen, beim Dikt kann man sagen, irgendwie dict.set Default, dann gibt man ein Key an, dann halt der, ja, dann den Wert oder halt eine Datenstruktur, also ganz oft, was man halt macht oder früher gemacht hat, heute nimmt man wahrscheinlich devoldikt, ist halt irgendwie, du hast halt irgendein Dikt, ein Key und dann eine Liste von Sachen, die da dranhängen und dann sagst du irgendwie dieses Dikt

Jochen

.z-Default, irgendwie dein Key, ja, Ecke, Klammer auf, Ecke Klammer zu, also Liste, Klammer zu, Punkt Append, irgendwie da einen Wert rein.

Jochen

Das kann man auch machen.

Jochen

Man kann das auch mit Z-Default machen, aber dann ist die Zeile relativ lang und dann wird es so ein bisschen eklig.

Dominik

Ich hoffe, ihr habt mitgeschrieben.

Jochen

Da halt ein Default-Dikt macht das halt alles sehr viel einfacher und standardisiert das sozusagen, dann sagt man halt irgendwie, okay, wenn ich jetzt einen Default-Dikt habe von List, dann macht es genau das.

Jochen

Und dann muss man nicht Z-Default die ganze Zeit sagen, sondern normalerweise würde ja, wenn ich einen Dikt nehme und da einfach irgendwie einen Key reinsetze und dann dem irgendwie sage, append irgendwas oder so, oder neben dem Wert zuweise, dann kracht es halt, weil das sagt dann halt Key erroring.

Jochen

Die Key gibt es da gar nicht.

Jochen

Und wenn man Default dickt nimmt, dann passiert das nicht.

Dominik

Weil er dann immer dann die leere Liste drin hat.

Jochen

Dann, wenn es das noch nicht gibt, dann erzeugt er halt in dem Moment halt entsprechend eben eine Liste oder halt einen Integer.

Jochen

Wenn man sagt default dickt von int, dann wird halt, äh, kann man halt sagen, irgendwie dickt Eckige Klammer auf, Key, Ecke Klammer zu, plus gleich irgendwas.

Jochen

Plus gleich 1 zum Beispiel und zählt damit halt hoch.

Jochen

Ohne dass es einen Key-Error gibt, auch wenn es den Key darin noch nicht gab, weil wenn es den Key nicht gibt, dann wird das halt erzeugt.

Jochen

Und zwar

Dominik

schön, Default-Keys direkt mit den Keysmann.

Dominik

Hattet ihr schon mal, dass ihr irgendwie auf einen Key zugreifen wolltet und dass er einen Error gab und euer Programm durchgeflogen ist mit Z-Default, wäre das nicht passiert.

Jochen

Genau, also Z-Default hat man dann früher gemacht und heute, denke ich, machen die meisten Leute tatsächlich.

Jochen

Oder ich weiß es nicht, es wäre interessant, Default dickt.

Jochen

Und man kann das dann auch noch ineinander schachteln.

Jochen

Also für die Counts der Wörter in den einzelnen Kategorien habe ich jetzt an.

Dominik

Das ist unheimlich kompliziert, wenn man in Statistik irgendwie die ganzen bedingten Wahrscheinlichkeiten immer gegen das sich umdrehen.

Dominik

Aber hey, wir können Dicts ineinander schachteln, ist doch schön.

Dominik

JSON hört sich das an, P.JSON.

Jochen

Ja, Dicts und JSON haben ja auch viel miteinander zu tun.

Jochen

Also das ist ja sowas ganz ähnliches.

Jochen

Es ist halt, du könntest Dicts als JSON rausrealisieren.

Jochen

Also na gut, wenn es halt Objekte drin sind sich nicht in JSON rausrealisieren lässt, was natürlich auch sein kann, wie.

Dominik

Ja, und was ich total nicht tun ist, glaube ich, also bei JSON, wenn ich das richtig im Kopf habe, dass immer bei den letzten Elementen das Komma nicht dastehen darf.

Jochen

Ach ja, JSON hat auch ein paar so hässliche Seiten.

Jochen

Ja, das ist so ein bisschen genau, JSON zu parsen ist so ein bisschen ätzend.

Jochen

Aber genau, also das ist wirklich, wirklich wenig, wirklich wenig Zeilen und trotzdem hat man damit ein Modell gebaut, das dann ganz ordentlich funktioniert.

Jochen

Die Klassifikation ist jetzt ein bisschen schwieriger.

Dominik

Ja, also wir möchten gerne jetzt klassifizieren in 2016.

Das beschreibe ich jetzt nicht.

Jochen

Das hat schon beim Trainieren, das ist total einfach, hat das nicht gut funktioniert und jetzt beim Klassifizieren.

Jochen

Also kann man sich angucken, wenn einen das interessiert.

Jochen

Im Grunde, was passiert, ist eigentlich nur, dass man halt bei einer neuen Nachricht, bei der man nicht weiß, ist das jetzt beim oder nicht, zählt man auch wieder in Worte und multipliziert dann halt in für jede Kategorie halt sozusagen die Kategoriefrequenz dieses Wortes auf.

Dominik

Ja, also um das erstmal nochmal zu simplifizieren zu sagen, ohne dass das technisch vielleicht ganz korrekt ist, man nimmt einfach die Wahrscheinlichkeit jedes einzelnen Wortes, ob es Spam ist oder nicht Spam ist.

Dominik

Also bei Viaga oder Piep ist es vielleicht relativ hoch, dass dann die Mail Spam ist und multipliziert die miteinander und man kommt dann einen Gesamtwert raus, ob es jetzt Spam sein könnte oder nicht.

Jochen

Genau.

Jochen

Diese Zahlen sind dann halt sehr niedrig oft, weil entsprechend halt ja Worte auch nicht jetzt so.

Jochen

Meistens gibt es.

Dominik

Hier muss man natürlich noch mit der Anzahl normalisieren oder sowas.

Jochen

Genau, also normalerweise, man muss auch ein bisschen aufpassen, man muss ein bisschen tricksen, damit man da nicht irgendwie so in, es wird halt null irgendwie dadurch, dass man zu oft kleine Zahlen miteinander multipliziert hat.

Dominik

Ja, also ich glaube auch, wenn du größere Zahl miteinander multiplizierst, die unter 1 sind, wird es irgendwann null.

Jochen

Naja, eben, genau, genau.

Jochen

Und das ist halt, also hier muss man halt gucken, wenn die Texte lang werden, jetzt bei der SMS auch praktisch sind sie nicht so lang, aber da muss man halt Maßnahmen ergreifen.

Jochen

Ich weiß nicht, ob ich das hier gehan habe, dass das nicht null wird.

Jochen

Es ist aber auch im Grunde egal.

Jochen

Es geht ja nicht darum, sozusagen eine exakte Wahrscheinlichkeit auszurechnen, sondern das irgendwie klassifizieren zu können.

Dominik

Du könntest einfach den Logarithmus davon nehmen.

Jochen

Ja, genau, das könnte man zum Beispiel machen.

Jochen

Und was ich jetzt da gemacht habe, ist es einfach, so zu normalisieren, dass halt hinterher die Summe der beiden Zahlen, die dabei rauskommen, halt wieder 1 ist.

Jochen

So dass man das halt als Wahrscheinlichkeiten interpretieren kann.

Jochen

Ja, und

Dominik

dann wisst ihr halt, ne, dass tatsächlich so der Quotient ist Spam, ist kein Spam.

Dominik

Und dann habt ihr tatsächlich daraus logischerweise eure Wahrscheinlichkeit.

Jochen

Genau.

Jochen

Und das funktioniert halt halt jetzt, also bei dem Dataset war das so.

Dominik

Und das ist das Coole an der E-Bace, dass es funktioniert mit relativ wenig Daten, wie ihr gerade gehört habt.

Und genau, schnell sogar.

Jochen

Es ist sauschnell, es ist, äh, also das ist wahrscheinlich schneller als so ziemlich alles andere.

Jochen

Auch deswegen, weil das halt kaum was macht.

Jochen

Das ist halt irgendwie.

Jochen

Und oder ich bin mir ziemlich sicher, dass es wahrscheinlich schneller ist als die meisten anderen Machine Learning-Verfahren.

Jochen

Es ist sau schnell, man braucht keine Spezialbibliotheken wie NumPy oder sowas.

Dominik

Aber ist das schon ein richtiges Machine Learning?

Dominik

Weil im Prinzip rechnest du ja nur die einzelnen Wahrscheinlichkeiten für die einzelnen Kategorien.

Jochen

Ja, aber es ist, ja.

Dominik

Na gut.

Dominik

Jetzt wissen wir, warum Statistiker sagen, haha.

Ja, ja, natürlich.

Jochen

Also sie haben ja auch so ein bisschen recht, das ist schon so.

Jochen

Aber trotzdem, ich meine, du kannst damit halt Sachen machen, wo Statistik halt Schwierigkeiten mit hätte.

Jochen

Also wenn man das jetzt auf Papier machen wollen würde.

Dominik

Was für der Unterschied zwischen Statistik und Maschinenbudding ist, man schreibt in einen Computer.

Jochen

Ja, also ich würde tatsächlich sagen, das ist einer der Hauptunterschiede, dass du es halt mit Computern machst und dann auch damit rumspielen kannst.

Jochen

Und während du auf klassischer Statistik irgendwie.

Dominik

Die Formeln aufschreiben.

Jochen

Genau, dann machst du es auf Papier alles und guckst halt, was ja auch oft dann genauer geht.

Jochen

Du kannst dann halt dein Modell viel besser irgendwie bauen und so.

Jochen

Aber und du hast halt nur wenige Beispiele oft.

Jochen

Während bei Machine Learning ist es so, oft, ob das jetzt alles so genau passt oder so.

Jochen

Das interessiert dich gar nicht, sondern es muss halt dahinter ein gutes Ergebnis dabei rauskommen, das kannst du evaluieren.

Jochen

Und warum das jetzt nicht.

Dominik

Statistische Fehlerchen machen.

Dominik

Ja, das kann man natürlich auch rausargumentiert.

Dominik

Es geht ja nur darum, ob morgen Wetter, Sonne scheint oder nicht.

Jochen

Ja, ja, sagen wir so, die Kritik ist teilweise schon berechtigt.

Dominik

Der muss halt immer mit seinen Daten auch ein bisschen aufpassen, ne stimmen die denn?

Dominik

Und das Problem bei solchen Dingen ist halt, ihr habt halt meistens Abhängigkeit zwischen einzelnen Merkmalen irgendwie dann doch.

Dominik

Und ja, also nur eine Mail in den Müll zu schmeißen, weil der jetzt Piep drin vorkommt, ist vielleicht blöd.

Dominik

Vielleicht habt ihr auch eine nette Mail geschrieben von eurer zukünftigen, eurem zukünftigen Geliebten, der wollte euch irgendwas Nettes schreiben und dann ist es im Spam-Ordner gelandet oder sowas.

Jochen

Ja.

Jochen

Genau.

Jochen

Also, aber wenn man das jetzt evaluiert, also was dabei rauskommt, ist das schon ganz gut.

Jochen

Irgendwie so, ja, Genauigkeit ist ein bisschen irreführend, gerade wenn die Klassen nicht so, wenn da nicht so viel, wenn das halt nicht gleich verteilt ist, sondern sehr unterschiedlich.

Jochen

Da gibt es auch mal ein schönes Beispiel bei Spam, wenn halt irgendwie die Wahrscheinlichkeit, und das ist tatsächlich so, irgendwie, ich glaube, mittlerweile, es kann sein, dass mehr als 99% aller verschickten Mail irgendwie Spam ist.

Jochen

Und wenn man dann einen Klassifikator macht, der einfach immer sagt, es ist Spam, dann ist er halt eine Accuracy von 99%.

Jochen

Tja, sieht gut aus, ist aber nicht wirklich sinnvoll, weil das Problem ist, man kommt keine

Dominik

tiefere Erkenntnis.

Jochen

Ja, der guten Mails kommt noch durch.

Jochen

Das heißt, man kriegt gar keine Mail mehr, was so ein bisschen vielleicht nicht der Sinn von Mail ist.

Dominik

Ja, wäre kontraproduktiv tatsächlich, ja.

Jochen

Aber sehr halt in dieser, wenn man da.

Dominik

Kommst du viel Spam?

Jochen

Ich weiß es ehrlich gesagt nicht.

Jochen

Es kommt kaum was durch.

Dominik

Ich habe letztens eine gekammen, die kam super durch.

Dominik

Das war sehr spannend.

Jochen

Ja, also ne, weil es.

Dominik

Ich habe gefragt, ob ich mich nicht sofort vor schnellen Text treffen möchte.

Dominik

Und noch heute.

Dominik

Und ich müsste doch einfach nur hier draufklicken.

Dominik

Wirklich?

Dominik

Ja, sowas habe ich noch nie bekommen.

Dominik

Das war das erste Mal seit bestimmt acht Jahren oder sowas, dass sowas in meinem Postfach landete einfach.

Jochen

Okay, es ist interessant, wie sie das geschafft haben, durch die Spam-Filter durchzukommen.

Jochen

Aber ja, ich Werbung, genau, ich weiß es nicht genau.

Jochen

Ich gucke jetzt hier gerade mal in meinen Spam-Folder.

Jochen

Doch, es kommt jeden Tag.

Jochen

Ich weiß es jetzt nicht.

Jochen

Allein heute sehe ich also wahrscheinlich schon so 40, 50 Spam-Mails oder sowas.

Dominik

Wie viele E-Mails bekommst du eigentlich jeden Tag?

Dominik

Ich habe das irgendwann mal komplett raussortiert und.

Jochen

Ich weiß es nicht.

Jochen

Meine Inbox hier hätte gerade so 5600 ungelesene Mails.

Dominik

Von 10.000 reduziert.

Dominik

Ich bekomme relativ schnell voll, aber so, ah, 100, 200 Stück bleibt damit.

Dominik

Ich hab dir auch die ganzen News-Saint.

Dominik

Alle die abonniert, alles rausgekickt, alles gelöscht.

Dominik

Wollte ich alles nicht mehr haben an Dokus.

Jochen

Ja, also dieses, ja, also, Mail ist problematisch.

Dominik

Wir bekommen natürlich jeden Tag immer zehnmal Fanpost von Hörern, von diesen unseren wunderschönen Post ab.

Jochen

Ja, da geht es gerade noch.

Jochen

Da könnte, das ist okay.

Dominik

Also wenn ihr möchtet, schreibt unseren Hallo und weiß, man kann das nicht.

Jochen

Das ist schon okay.

Jochen

Es gibt ja auch keine, es ist blöde, ist halt irgendwie, es gibt ja auch keine Lösung mehr.

Jochen

Natürlich kann man sagen, man nimmt einfach keine Mail mehr an oder man liest das nicht oder so ist es auch.

Dominik

Ihr könntet mal einen Test machen, ihr könntet Piep in das nächste E-Mail, Fan-E-Mail an uns schreiben.

Dominik

Also einmal das Wort und mal gucken, ob es bei uns im Filter landet.

Also wir sehen das auch.

Dominik

Also ich gucke zumindest den Filter, muss man mal rein, die du auch.

Dominik

Also ich schon nicht.

Jochen

Verlass mich drauf, dass das irgendwie funktioniert.

Jochen

Und dass die Leute, wenn es irgendwas Wichtiges war, dann halt andere Wege versuchen, mich zu erreichen.

Dominik

Naja, also glaubst du wirklich, an den Hörer, wenn er uns nicht mehr so gut hat.

Jochen

Nee, das ist ein bisschen eine Erklärung muss.

Das funktioniert leider nicht.

Jochen

Ja, ja, ja, ja.

Jochen

Aber genau, also was ich halt an dieser Geschichte hier schick finde, ist, also man kann halt mit wenigen Zeilen Python kann man halt einen Knife-Base-Classifier schreiben, der schnell ist, der relativ genau funktioniert.

Jochen

Man würde das jetzt nicht wirklich verwenden, wenn man tatsächlich einen Spam.

Dominik

Wie groß war jetzt nochmal der Trainingsansatz?

Dominik

5000 hast du?

Jochen

5500 im Material.

Dominik

Vorkategorisierte Nachrichten.

Dominik

Könnte man noch zusammentragen, wenn man so ein Classifier-Problem selber lösen wollen würde.

Jochen

Ja, ja, nein, also ich meine, man würde das jetzt nicht, wenn man jetzt irgendwie einen Spam-Filter tatsächlich verwendet in einem Mail-Client oder so, da würde man jetzt diesen Ansatz nicht nehmen.

Jochen

Aber, also weil das halt nicht so genau ist.

Jochen

Ich habe das jetzt mal verglichen, darunter sind noch so irgendwie zwei andere Dinger.

Jochen

Ich habe einmal einfach nur eine lineare Supportvektor-Maschine genommen, die ist halt ein Stückchen besser.

Jochen

Und auch nicht viel langsamer, die ist auch sehr schnell.

Jochen

Und dann habe ich auch nochmal Spacey genommen mit so einem 11D-Convolutional Netz und das ist unfassbar viel langsamer.

Dominik

Alle alle wieder abgehängt.

Jochen

Ja, also der Witz ist, also eigentlich natürlich nimmt man nicht naiv Base.

Jochen

Aber es könnte Situationen geben, in denen das total sinnvoll ist, sowas zu benutzen.

Jochen

Wie zum Beispiel, also ein Szenario wäre, du möchtest Trainingsdaten generieren.

Ja.

Jochen

Und du hast jetzt, möchtest das aber im Frontend machen, so dass es halt sich für denjenigen, der das editiert, halt irgendwie schnell und so anfühlt, dass er damit irgendwie gut arbeiten kann.

Jochen

Und jetzt möchtest du halt nicht jedes Mal einen Request machen und irgendwie einen Server schicken, wo dann irgendwie irgendwas installiert ist mit einem Umpai oder so, was dann halt irgendwie ordentlich ein Classifier hat, sondern dir ist es wichtiger, dass es schnell ist.

Jochen

Und das letzte Prozent Genauigkeit interessiert dich nicht.

Jochen

Oder das letzte Prozent F1-Wert oder so.

Jochen

Weil es einfach nur darum geht, möglichst schnell viele Trainingsdaten zu erzeugen.

Jochen

Und dich interessiert vielleicht noch, ob ein Ding schwer oder leicht zu klassifizieren ist, aber nicht, ob das jetzt ganz genau stimmt oder nicht, weil es guckt ja eh jemand auch mal drauf.

Jochen

Und da kann halt das, äh, dieses Night-Base-Ding könntest du auch in JavaScript problemlos implementieren.

Jochen

Das wären ein paar Zahlen mehr, nicht viel mehr Zahlen.

Jochen

Und es wäre auch sauschnell in JavaScript.

Jochen

Und du könntest das halt im Frontend verwenden, um halt basiert, also jemand sagt, das ist Spam, das ist Spam, okay, sortiere mir nochmal um, sodass die uneinindeutigen Fälle oben sind.

Jochen

Und dann sortierst du nochmal, machst nochmal 20 Beispiele für die, 20 Beispiele für die Gruppe, sortierst nochmal um, dann kannst du halt wahrscheinlich tausende von Dingen in relativ wenig Zeit irgendwie labelen.

Jochen

Und benutzt halt zum Sortieren einen Classifier, der halt im Frontend-Code, in JavaScript oder so läuft.

Jochen

Und für den Fall.

Dominik

Aber die sind doch hier beim Python-Podcast.

Jochen

Ja, natürlich.

Jochen

Also du kannst es halt auch in Python machen.

Dominik

Ein TypeScript ist ja auch relativ nah dran tatsächlich, ja.

Jochen

Ja, aber also, sagen wir mal so, das ist halt ein Vorteil, den fast alle diese sogenannten Skriptsprachen halt haben.

Jochen

Also ich finde das immer so ein bisschen.

Dominik

Ja, man könnte das auch direkt wieder rausrennen, dann, ne, und irgendeine Datenbank, kleine Bulleitschreiben.

Jochen

Irreführend, wenn die dann halt so abwärmt als Skriptsprachen, weil das ist halt eine große Stärke.

Jochen

Also du kannst halt wirklich solche Sachen, du brauchst im Grunde nur diese drei Grunddatentypen, wie eben Zahlen, Strings, also Variablen, wo halt ein Ding irgendwie drin ist, Listen und Dicts und kannst damit halt schon sehr, sehr viel bauen.

Jochen

Und ja, musst da nicht irgendwie großartig irgendwie Boilerplate schreiben und irgendwie eine Klassenhierarchie aufbauen und irgendwie UML-Diagramme malen, sondern du kannst es halt einfach mal so kurz runterschreiben und kommst damit, wenn du es richtig machst, halt in Performance-Regionen, die sonst schwer zu erreichen sind.

Jochen

Also wenn du das zum Beispiel jetzt in C Pluslus machen wolltest und versuchst schneller zu sein als diese Python-Implementation, das wird schwer, weil die Dikt-Implementation ist in Python relativ

Dominik

stark optimiert.

Dominik

Um das zu entwickeln, in der Zeit hätte man einen Algorithmus.

Jochen

Es ist wirklich, ja, ich meine, ich habe das ja dann auch schon häufig.

Jochen

Also wenn du das dann in C Pluslus machst und dann die Hashmap aus der Standardbibliothek oder so, kann es gut sein, dass du langsamer bist als Python, weil die Implementation nicht so optimiert ist.

Jochen

Und du kannst es mit C<unk> viel schneller hinkriegen, aber du würdest halt derartig viel mehr Zeit dafür brauchen.

Jochen

Und die Frage ist, brauchst du es halt so genau und so schnell?

Jochen

Bist du bereit dafür so viel Zeit zu investieren?

Jochen

Und die Antwort ist oft nein.

Jochen

Es ist viel besser, irgendwie weniger Zeit zu brauchen und etwas zu haben, das vielleicht nicht total super optimal ist, aber halt auch schon sehr gut.

Jochen

Und das geht.

Jochen

Und das ist halt, das ist das, was ich eigentlich damit zeigen wollte.

Dominik

Also, Pre-Labeling von Trainingsdaten.

Jochen

Ja.

Jochen

Ja, wenn du, genau.

Jochen

Oder halt auch, um zu verstehen, wie was funktioniert, um wirklich sagen zu können, okay, ich kann mich jetzt darauf verlassen, dass das halt wirklich klappt, weil das Problem ist ja immer an den so Blackbox-Neuronalen Netzgeschichten oder so auch.

Jochen

Du kannst da nicht so richtig gut reingucken.

Jochen

Natürlich kann man irgendwie das alles evaluieren oder so, aber du verstehst halt auch nicht so wirklich, was das tut.

Jochen

Und es ist immer gut, so ein paar Sachen da zu haben, bei denen man wirklich auch das insofern verstanden hat, dass man es einfach mal selber implementiert hat, weil man dann beurteilen kann, was da passiert.

Jochen

Und wenn das halt ganz andere Ergebnisse liefert oder so, dann hat man auch einen interessanten anderes Ansatzpunkt, wo man nachfragen kann, was ist denn da jetzt eigentlich passiert.

Jochen

Und genau, daher finde ich das super sinnvoll, ab und zu mal so ein Verfahren auch selber zu implementieren oder in Naive Base ist er auch da super, weil es halt so super einfach ist.

Dominik

Ja, also in einem Notebook hast du dann tatsächlich das nochmal verglichen von der Geschwindigkeit her zu den ganzen anderen Verfahren.

Jochen

Geschwindigkeit, das sind einfach nur die

Dominik

Präzisionsgrade, Entschuldigung.

Jochen

Also eigentlich eben Genauigkeit sollte man sich nicht angucken, sondern Prezession Recall und ja, da ist halt irgendwie so lineare Supportwerk-Maschinen sind halt schon so ein bisschen.

Dominik

Was ist das Precision Recall?

Jochen

Ja, das ist halt Genauigkeit eben.

Jochen

Argument von eben ist halt, wenn mehr als 99% der Mails, die man halt so sieht, spam sind, dann ist Genauigkeit von 99%, das sagt halt nichts aus.

Dominik

Und dann benutzt man den Recall-Wert und.

Jochen

Man benutzt Precision und Recall.

Jochen

Und Precision ist halt sozusagen die, also man kann, es gibt vier Fälle, die auftreten können, wenn du jetzt irgendwie Spam klassifizierst.

Jochen

Es kann halt sein.

Dominik

Einfach Fehler, Beta-Fehler, ja und nein.

Jochen

Genau, genau.

Jochen

Oder bei Machine Learning nennt man das oft True Positive, False Positive, False Negative und True Negative.

Jochen

Also sozusagen es ist.

Dominik

Es ist Spam und du hast es als BAM erkannt?

Genau, das wäre es.

Dominik

Es ist Spam und das ist bei deinem Post-Eingang gelandet.

Jochen

Das wäre False Negative.

Es ist kein

Dominik

Spam und du hast es ein Spam.

Dominik

Es ist kein Spam und du hast es im Post-Eingang, was genau das

Jochen

ist, was wir hast.

Jochen

Bei der Geschichte, also True Negatives spielen bei uns jetzt keine Rolle, weil das ist halt das gleiche, wenn du jetzt nur zwei Klassen hast.

Jochen

Aber wenn du jetzt mehrere Klassen hättest, müsstest du das halt dann auch nochmal unterscheiden.

Jochen

Oder bei Multilabel musst du es unterscheiden, weil es dann ja auch sein kann, dass etwas in keiner Klasse liegt oder so.

Jochen

Aber den Fall haben wir ja gar nicht, wir haben ja nur irgendwie Spam oder Hand.

Jochen

Und genau, dann ist Precision einfach Anzahl der Dinge, Anzahl der True Positives geteilt durch True Positive plus False Positive.

Dominik

Also nochmal, True Positive ist eine Mail, die kein Spam ist und die im Posteingang landet.

Jochen

Nee, True Positive ist es kein Spam und es ist im Posteingang landet.

Jochen

Habe ich das nicht gesagt?

Jochen

Oder hast du das gesagt?

Jochen

Ja, dann ist das.

Jochen

Okay, dann habe ich es nur falsch verstanden.

Dominik

Musst du mal druckspulen, nochmal neu hören.

Jochen

Genau, also es ist alles richtig gelaufen, das True Positive.

Jochen

False Positive wäre halt irgendwie, es wurde als Spam erkannt, es war aber kein Spam.

Jochen

Und jetzt addiert man halt die False Positives auf die True Positives.

Jochen

Und wenn man jetzt sozusagen die True Positives teilt dadurch, durch die größere Zahl, dann kriegt man die Quote der ja, wie kann man das sagen, die Quote der jetzt, bei denen es richtig gelaufen ist, sozusagen.

Jochen

Aber das ist jetzt nicht so wie bei der Genauigkeit, sondern es ist halt, da wäre halt, wenn man jetzt sozusagen einen Classifier hätte, der immer sagt, spam.

Jochen

Ja, der hätte halt eine irre hohe Anzahl von False-Positives und der hätte dann halt eine Precision von Null, mehr oder weniger.

Und das heißt ja, oh taugt jetzt nicht richtig.

Dominik

Recall.

Jochen

Und Recall ist halt sozusagen das Gleiche, bloß irgendwie mit False Negatives statt True Positives.

Jochen

Und das beschreibt im Grunde, wie viel von denen, die ich hätte erkennen sollen, habe ich tatsächlich erkannt.

Jochen

Ja, gibt es ja auch, man kann halt einfach auf Precision optimieren, indem man sagt, irgendwie klassifiziert nur das Ding, wo man sich super sicher ist, als nur eins als super sicher als das, was man, wofür man es hält, ja, dann hat man wahrscheinlich eine Precision von eins, aber wenn man jetzt nicht alle findet, sondern irgendwie viele Spams halt durchgehen.

Dominik

Es gibt so ein paar Machine Learning-Beispiel, für das vielleicht gar nicht so irrelevant ist.

Dominik

Also wenn man jetzt zum Beispiel entscheidet, ob man jetzt ein Laser auf einen Insekt richtigt und das dann abzuschließen oder nicht, und das ist aus Versehen dann die Katze oder der Hund, das wäre dann vielleicht nicht ganz so gut, wenn man dann so ein paar Falls positives.

Jochen

Das sind False-Positives, genau.

Jochen

Das wäre auch, das ist auch schlimm.

Jochen

Aber es ist je nach Problem, ist es halt unterschiedlich schlimm, ob jetzt False-Positives oder False-Negatives auftreten.

Jochen

Ist aber beides natürlich blöd, dass halt einfach unterschiedliche Arten von Folgen.

Dominik

Also im einen Fall kommt einfach die Mücke dann trotzdem rein und stichtig und im anderen Fall ist vielleicht eine Katze.

Jochen

Genau, in dem Fall würde man wahrscheinlich eher False-Positives versuchen wollen zu vermeiden, aber ja, es hängt halt von dem Problem ab und man kann sich sozusagen meistens aussuchen, was man jetzt lieber hätte.

Jochen

Man kann halt darauf optimieren.

Dominik

Du definierst quasi die Irrtumswahrscheinlichkeit, die du nicht unterschreiten willst und darauf optimierst du dann deinem dein Modell.

Jochen

Genau, genau.

Jochen

Man kann sagen, also ich möchte nicht, dass mir so und so viele echte Mails verloren gehen.

Jochen

Das wäre wahrscheinlich das von dem Swampenclassifier.

Dominik

Drei klassische Grenze 1%, 2%, 5% oder sowas.

Jochen

Ja, also die aktuellen Geschichten sind wahrscheinlich alle noch deutlich drunter.

Jochen

Aber genau, und dann sagt man, okay, dann mit dem anderen Fehler lebt man dann halt.

Jochen

Also im Fall von Spam-Classifier würde man halt eher damit leben, dass halt ein bisschen Spam durchkommt.

Jochen

Aber man möchte eigentlich nicht, dass echte Mail irgendwie wegsortiert wird.

Jochen

Ja, das wäre nicht so gut.

Jochen

Aber wie gesagt, je nach Anwendung kann das halt unterschiedlich sein.

Jochen

Es gibt auch Anwendungen, bei denen es andersrum ist.

Jochen

Also medizinische Anwendungen sind oft dann zum Beispiel dann eher darauf optimiert, dass es Recall hoch ist und Fallspositives sind egal, weil man möchte halt nicht, dass man jemanden undiagnostiziert lässt, vielleicht je nachdem, was es verteilt.

Jochen

Also ja, kommt.

Dominik

Zu dem Spam-Fall noch ganz interessant.

Dominik

Also um jetzt mal auf das echte Beispiel zurückzukommen, würde man dann vielleicht hingehen und bestimmte Ausnahmekriterien noch hinterherfiltern.

Dominik

Beispielsweise, wenn du jetzt von mir eine Mail bekommst und ich bin ja wahrscheinlich irgendwie in deinem Adressbuch drin, dass du mich dann trotzdem kriegst, obwohl ich jetzt dir ganz viele Stimmpforte schreibe?

Jochen

Genau, also natürlich, das ist jetzt nicht ein echtes System oder so, sondern das ist einfach nur zum Beispiel.

Jochen

Aber ja, natürlich diese ganzen Signale oder Features oder so, das würde man alles mit reinbeziehen eigentlich.

Dominik

Ich weiß schon, was ich das ausprobieren.

Ja, ja.

Jochen

Und ich glaube, also mittlerweile, ich weiß jetzt nicht, ich weiß nicht mal, was da verwendet wird.

Jochen

Also bei Google habe ich jetzt noch, also die Verfahren, die heutzutage verwendet werden, sind alle sehr, sehr schlau mittlerweile.

Dominik

Die hätten ja schon genug Trainingsdaten, um das noch ein bisschen messen zu machen.

Jochen

Da gibt es ja dann einen globalen Anteil, das ist zum Beispiel bei Google, ich weiß nicht genau, wann ich das letzte Mal im Paper drüber gelesen habe, was sie machen, aber sie haben dann halt, irgendwie ihr Modell besteht teilweise halt aus so globalen Geschichten, weil sie halt sehr viel Spam und nicht-Spam haben, sozusagen, dass sie diese als Trainingsdaten verwenden können.

Jochen

Und dann ist das Modell auch immer noch teilweise personalisiert auf dich, weil es gibt halt vielleicht auch Leute, die wenn ich jetzt irgendwie, keine Ahnung, ein jemand bin, der sich professionell damit beschäftigt, Spam von Nicht-Spam zu unterscheiden, ja, und dann mir die Leute Spam schicken als Beispiele und ich das nicht kriege, weil das heißt, es muss auch ein, na, manche Leute, bei den manchen Leuten ist das ja vielleicht okay.

Jochen

Ja, oder weil wenn ich jetzt zum Beispiel ein nigerianischer Prinz bin, der irgendwie ein Bankkonto in der Schweiz hat, dann

Dominik

wäre schon doof, wenn die ganzen Leute meine Hilfe versuchen, ich will den Geld schenken und keiner will es haben.

Jochen

Also ja, die bestehen halt aus so einer globalen Teil und halt aus so einem personalisierten Teil.

Dominik

Mir passiert das in meinem Nachnamen.

Dominik

Leute sagen mal, haha, dann verarsche mich nicht.

Jochen

Ja.

Ja, also.

Dominik

Volks positive, ja.

Dominik

Oder?

Dominik

Was hast du denn?

Jochen

Das wären Falls Positive, ja.

Jochen

Es wird als Spam erkannt, weil man eigentlich war es alles in Ordnung, ja.

Jochen

Genau, und ja,

Dominik

ich mach mich lustig und finde meinen Humor doof.

Jochen

Ja.

Jochen

Ja, also die Dinger funktionieren so.

Jochen

Also ich habe weder dass Spam durchgekommen ist, noch, dass ich, okay, vielleicht kriege ich einfach nicht mit, dass bei mir normale Mail verschwindet, aber also früher war das tatsächlich immer noch so ein Problem und mittlerweile ist das alles so gut.

Jochen

Ich würde mal einfach sagen, das funktioniert.

Ja.

Jochen

Genau, ja, ich habe dann halt noch so ein paar Sachen probiert und eben zum Beispiel jetzt hier die, also irgendwie State of the Art, irgendwie Textklassifikationsgeschichte ist schon besser als Nive Base, aber nicht so wahnsinnig, also in dem Fall halt gar nicht so wahnsinnig viel.

Jochen

Halt irgendwie, ja, ein bisschen mehr F1, irgendwie Prozent oder anderthalb oder sowas, aber viel mehr auch nicht.

Jochen

Also, achso, F1 harmonische Mittel zwischen Precision und Record.

Jochen

Wir haben das, glaube ich, bei der Textklassifikationsfolge auch schon nochmal alles erzählt.

Dominik

Ja, weil wir wollten jetzt auch nicht, dass alles nochmal hören, muss das gerade die auch gerade einschalten oder nur für eine F-Base zuhören.

Dominik

Also du musst vielleicht auch nochmal deswegen kurz erwähnen, was eine Support-Wegmaschine ist und was Base hier ist.

Jochen

Ja, richtig.

Jochen

Also Support-Wectormaschinen sind auch eine Art von Machine Learning-Verfahren, Modellen.

Jochen

Also manchmal manche Namen sind halt ein bisschen biludar, würde ich sagen, auch der Name ist ein bisschen, also sagt einem halt nicht, was das macht.

Jochen

Was das eigentlich tut, ist.

Dominik

Otto-onale Vektoren auf irgendwelchen Ebenen erzeugen.

Jochen

Ja, es ist ein diskriminatives Machine Learning-Modell, das halt lernt sozusagen zwischen, wenn man jetzt ein paar Spam und nicht Spam nimmt, zwischen diesen beiden Klassen.

Jochen

Es interpretiert halt auch, wie eigentlich fast alle Machine Learning-Modelle, jetzt außer dem Nai-Base jetzt, das hat das macht das nicht so, aber interpretiert halt Texte als Vektoren in einem n-dimensionalen Vektorraum.

Jochen

Ja, wobei halt, also das wäre auch, also klassischer Back-of-Words-Ansatz, dass halt jedes Wort ist sozusagen eine Dimension.

Jochen

Und der Text ist halt einfach der Vektor, der dann entsteht, wenn du sozusagen bei allen Wörtern, du gesehen hast, diese Dimension, denen ein Gewicht gibst.

Jochen

Also du kannst auch einfach einsetzen, dann wäre es halt binär.

Jochen

Aber du kannst, also eins, du hast ein Wort das Wort gesehen oder null, du hast das Wort halt nicht gesehen.

Dominik

Wie viele Dimensionen kannst du dir so vorstellen vor deinem inneren Auge, wenn du versuchst,

sie zu visualisieren?

Jochen

Das ist nicht schlimm, das muss man sich nicht großartig vorstellen.

Das muss man sich gar nicht vorstellen.

Jochen

Nee, also was ich mir vorstelle, ist halt irgendwas dreidimensionales vielleicht.

Jochen

Aber man kann ja sagen, okay, das ist jetzt nicht direkt dreidimensional, sondern halt hunderttausend dimensional oder so.

Jochen

Ist ja nicht.

Dominik

Ja, das 4 geht vielleicht auch noch, wenn man sich so einen feststehenden Raum im Laufe des Zeitablaufs wieder sich verändert vorstellt.

Dominik

Fünf vielleicht noch, wenn da zwischendurch jemand den Vorhang aufmacht und reinguckt und sagt Hallo und dann da so ein Tunnel durchmacht, aber sechs, sieben, acht, ah.

Jochen

Ja, aber immer sich vorzustellen, dass, also sich einen Text als Vektor hinzuschreiben, das kann man sich ja angucken, das ist nicht so schlimm.

Dominik

Ja, aber da macht man sich nicht mehr so.

Dominik

Sachen, die man dann macht, ist die Betrachtung, macht man dir dann irgendwie auf so einem Blatt Papier.

Jochen

Ja, also das, was man dann tatsächlich macht, also wenn man sich das jetzt erzählt, dann klingt das irgendwie kompliziert, aber es ist eigentlich total simpel.

Dominik

Man macht eigentlich nur Spalten von einer Zeile.

Jochen

Ja, genau, also wenn man das jetzt geometrisch interpretieren wollte, ist das, wenn ich jetzt zum Beispiel Vektoren, also einmal habe ich halt da Werte drinstehen, nicht nur 1 und 0.

Jochen

Und diese Werte, diese Gewichte sind halt Term-Frequenzen, mal Inverse Document Frequency, sozusagen, wie wichtig ist dieses Wort üblicherweise in Texten, also ist das eher charakteristisch für bestimmte Sachen oder eher nicht so charakteristisch.

Jochen

Wörter wie der, die das, wären halt üblicherweise nicht, bekommen kein hohes Gewicht, weil ja kann man entweder rausfiltern oder es ist halt, weil die sind einfach nicht, ne, daraus kann ich jetzt nicht schließen, ob das Spam oder nicht spam war, während eben sowas wie Viaga oder das Penis oder was auch immer, das ist wahrscheinlich oder das ist deutlich charakteristischer, die werden, die bekommen ein höheres Gewicht und man guckt sich halt immer die Winkel zwischen Dingen an in diesen Vektorräumen und die kann man einfach ausrechnen, indem man halt Sachen das Skalarprodukt bildet zw

Jochen

ischen.

Jochen

Und das auch wieder bei Sphasen-Vektoren super einfach, weil da muss nur dieser, die sind ja überall null, nur an bestimmten Stellen nicht und man muss nur diese Stellen sich angucken, was dann dann auch wieder sehr schnell geht.

Jochen

Also, was man dann dann letztendlich macht, ist total simpel, aber es klingt irgendwie, oh, Winkel in einem hunderttausend dimensionalen Raum krass.

Jochen

Klingt irgendwie voll abgefahren.

Jochen

Ist aber eigentlich total einfach.

Jochen

Also, wenn man sich jetzt anguckt, was wirklich passiert.

Jochen

Und also da ist nichts Wildes dabei.

Jochen

Das was aber jetzt die Suffort-Vektormaschine macht an der Stelle, ist halt, wenn man sich jetzt diese Vektoren anguckt und man hat jetzt sozusagen die Wolken an Punkten irgendwie in diesem Raum, das eine spammen, das andere ist nicht spammen und dann versucht die Support-Vektormaschine eine Ebene so zwischen dieser, eine unterteilende, also eine separierende Hyperebene so zwischen diese beiden Klassen zu legen, dass der Abstand maximal wird zu beiden.

Dominik

So ein bisschen wie bei OLS Optimal Squares.

Jochen

Ja, du meinst Ordinary Least Squares?

Dominik

Ordinary Lease ein bisschen noch anders, ja.

Jochen

Ist noch ein bisschen, also, naja, das ist nicht so ganz das gleiche.

Jochen

Also tatsächlich das Modell, also die Verlustungszummen ist anders.

Jochen

Und das Modell ist auch anders.

Jochen

Aber, weil, also das Modell, was bei der Support-Factor-Maschine, obwohl, naja, es ist auch ein lineares Modell.

Jochen

Also insofern ist es, ja, also es gibt zwischen all diesen linearen Modellen natürlich irgendwelche Verbindungen, aber ja.

Jochen

Also, aber diese Margin-Maximierung ist schon charakteristisch für Support-Factor-Maschinen, beziehungsweise die Dinger werden halt auch Maximum Margin-Classifier genannt.

Jochen

Und es gibt halt einen schönen Beweis, der sagt, ja, Margin-Maximierung ist halt auch, bedeutet Maximierung der Generalisierung beim Lernen.

Jochen

Und das natürlich auch eine sehr schöne Geschichte ist.

Jochen

Man kann es leider aus diversen technischen Gründen nicht so, also funktioniert es dann doch nicht.

Dominik

Ja, das Problem ist vielleicht, dass man sich, wenn man sich an allen Punkten orientiert, so ein bisschen auch an den Extremwerten zu sehr entlang heilnet.

Dominik

Und wenn man sich mehr an dem Durchschnitt der Werte orientieren würde und an die Ebene bildet, wäre die vielleicht ein bisschen präziser.

Dominik

Also vielleicht kann man die Güte erhöhen, indem man so ein bisschen diese Randwerte so außen vor lässt.

Jochen

Ja, man rechnet halt eine Verlustfunktion aus.

Jochen

Das kann man ja einfach machen.

Jochen

Die sozusagen und das SVM ist halt sozusagen ein konvexes, also das ist halt ein konvexes Optimierungsproblem im Grunde und das Optimierungsverfahren innerhalb von der SVM löst das.

Jochen

Das ist halt das, was passiert.

Jochen

Ja, okay.

Jochen

Und am Schluss kommt halt das Ding raus, was tatsächlich irgendwie diese beiden Teile trennt.

Jochen

Und zwar, und wie Hyper-Ebene hat den größtmöglichen Abstand zwischen diesen beiden Bäumen.

Dominik

Ja, ich glaube, da kann man vielleicht noch ein bisschen was dran drehen, indem man so diese Grundgesamtheit so ein bisschen manipuliert.

Dominik

Aber ja.

Jochen

Also sag mal so, das funktioniert halt, das funktioniert sehr gut.

Jochen

Es ist halt auch so, irgendwie in diesem hochdimensionalen, da ist viel Platz.

Jochen

Deswegen funktionieren lineare Modelle da so sehr schön, weil man kann die halt also durchlegen.

Jochen

Wenn das weniger dimensional wird, dann geht das halt linear nicht mehr.

Jochen

Da muss das alles irgendwie gebogen sein, aber das wird alles viel schwieriger.

Dominik

Und es könnte sein, dass wenn man auf einmal ganz viele komische Werte bekommt, dass man irgendwie so ein Klassifizierungsproblem hat, weil man irgendwie vielleicht noch eine Klasse hat, die man übersehen hat oder sowas.

Jochen

Gut, klar, natürlich, das kann auch immer sein.

Jochen

Genau, aber eigentlich ist es auch, also Sport-Effekt-Maschine eine schöne Geschichte und aber das eigentliche Ding, warum ich das jetzt auch hier verwendet habe, ist, dass die halt für eben Textklassifikationen super funktioniert haben.

Jochen

Da gab es halt eben bekannte Arbeit von Thorsten Joachim 1997 drüber.

Jochen

Und seitdem habe ich jedenfalls nicht wirklich substanzielle Fortschritte gesehen.

Jochen

Also, gut, doch.

Jochen

Also, wenn man sagt, Word-Embeddings sind halt nochmal ein ordentlicher Fortschritt gewesen.

Jochen

Aber das ist ja im Grunde nur eine andere Art, irgendwie Texte darzustellen.

Jochen

Ja, das ist halt schon besser als Back of Words, aber wird dann halt auch nochmal irgendwie ein bisschen besser.

Jochen

Aber es ist halt, es wird auch durchgehend über alle Datasets und so besser, aber es ist halt jetzt nicht so, dass man sagt, okay, das ist jetzt eine ganz andere Kategorie von gut, plötzlich.

Jochen

Es ist halt, äh, es ist, also wenn man jetzt TF-IDF-Gewichte nimmt statt Binäre, einfach nur 1 zu 0, wird es auch ein bisschen besser.

Jochen

Und der Vorteil von Word Embeddings ist vielleicht noch so ein bisschen mehr, aber so in der gleichen Größenordnung wie von binären Gewichten zu TF-IDF zu gehen.

Dominik

Du musst halt einmal nochmal zeigen, was TF-IDF ist.

Jochen

Ja, ja, genau.

Jochen

Das ist halt eben, wie charakteristisch ist ein Wort eigentlich sozusagen.

Für die Kategorie.

Jochen

Ja, genau.

Jochen

Kann man sich halt auch ausrechnen.

Jochen

Darf man natürlich auf dem Trainingsab machen, aber genau.

Jochen

Und ja, Word-Embeddings sind halt auch nochmal so eine Geschichte, müsste jetzt eigentlich auch nochmal erklären, da ist halt eine andere Art, sozusagen Wörter in einen höherdimensionalen Vektorraum abzubilden.

Jochen

Und da ist es dann halt nicht mehr so, dass es sozusagen pro Wort eine Dimension gibt, sondern es gibt halt einen 300-dimensionalen Vektorraum oder was auch immer.

Jochen

Ich weiß nicht, wie viel man kann man sich aussuchen, wie viele Dimensionen man verwenden möchte.

Jochen

Und jedes Wort ist dann halt ein Vektor da drin.

Jochen

Sodass man halt auch abbilden kann, dass Worte oft nicht nur sozusagen ein Ding beschreiben oder vereinen, sondern sie haben halt Anteile da und Anteile da und man kann damit dann quasi sozusagen gewisserweise auch die Bedeutung so ein bisschen besser mit abbilden.

Dominik

Hier ist dein Schild.

Jochen

Ja, und das funktioniert sehr gut und das hat halt nochmal irgendwie Arbeit mit Text irgendwie genauer gemacht, aber so ein bisschen, ne?

Jochen

Aber dass es wirklich da jetzt substanzielle Verbesserungen gegeben hätte, habe ich jetzt also seit 97 schon eine Weile her.

Jochen

Ist schon relativ lange her und ist eigentlich nicht so, oder ich habe irgendwas übersehen, das kann natürlich auch sein, aber ich meine, nee, da ist nicht so wahnsinnig.

Dominik

Also, was wir das übersehen haben, bitte schicken.

Jochen

Bis vor kurzem.

Jochen

Und ja, das ist vielleicht auch noch eine ganze Sache, das möchte ich unbedingt mal selber ausprobieren.

Jochen

Ach, das ist auch vielleicht, genau, wir haben ja mit Nico da diese Episode zu Textklassifikation gemacht.

Jochen

Und der hat jetzt in seinem Podcast Fechttiefen auch so eine Miniserie zu Natural Language Processing gemacht.

Jochen

Und da, äh, das fand ich, da fand ich einige Sendungen sehr gut.

Jochen

Unter anderem die, wo er über diese neuen Modelle spricht, irgendwie.

Dominik

Startup das da irgendwie mit.

Jochen

Genau, genau.

Jochen

Und halt auch die Folge bei Spacey fand ich sehr gut.

Jochen

Spacey ist halt so eine Open Source Bibliothek für NLP-Geschichten, aber halt ein bisschen mehr fokussiert auf Produktionssachen als jetzt zum Beispiel NLTK, ist halt eher so Forschungsgeschichten.

Jochen

Super langsam, habe ich früher mal versucht zu verwenden, dass man so gibt sicher Berechtigungen, das zu verwenden, aber wenn man jetzt produktiv irgendwas machen möchte, dafür geht es oft nicht gut, weil es halt nicht darauf optimiert ist, das schnell zu sein.

Dominik

Ich habe in NLTK mal ein paar End-Gramme über Pereriporter mit ein paar Kindern.

Dominik

Die haben das

sehr gefreut.

Jochen

Das geht bestimmt alles super, aber wenn du jetzt irgendwie, ja, weiß ich nicht, wenn ein Geschäft darin besteht, Sachen zu klassifizieren oder so oder schnell zu sein, dann ist NLTK vielleicht nicht so die Wahl.

Jochen

Und aber Spaceyverse.

Jochen

So da die Geschichten da sind optimiert, ist es nicht so, dass es einfach ein Toolkit ist mit allen möglichen Dingen, die man halt verwenden kann, sondern die implementieren dann halt die Sachen, die am besten funktionieren, auch in schnell und dann die kann man dann halt sozusagen verwenden.

Jochen

Und ja, das ist sowieso interessant, was in dem Bereich alles passiert, aber was jetzt in letzter Zeit tatsächlich da passiert, ist sowas ähnliches wie bei ImageNet.

Jochen

Da gab es ja auch irgendwie mit Deep Learning halt so eine

Dominik

ImageNet kennt ihr noch.

Ja.

Dominik

Hatten wir auch schon mal vorgestellt.

Jochen

Das ist also in einem, also da gibt es ja diese darauf basierende, also auf dem ImageNet Dataset basiert es halt so eine Challenge, wie heißt dieser Wettbewerb noch?

Jochen

Very Large Data, irgendwie Image, ich weiß nicht mehr genau.

Jochen

Hatten wir auch überall erwähnt.

Jochen

Das Ding läuft irgendwie jedes Jahr und 2011 haben ja Leute da irgendwie angefangen, sich wirklich damit mal zu beschäftigen, so wie man das dann mit Bildklassifikationen kriegt.

Jochen

Und 2013 hat Alex nett irgendwie dann diese Challenge gewonnen.

Jochen

Und zwar mit großem Abstand, so irgendwie Reduktion des Fehlers um die Hälfte oder sowas und ist in Regionen vorgestoßen, wo man vorher gedacht hatte, da kommt man gar nicht hin und so.

Jochen

Und ja, also da ist etwas passiert, was halt irgendwie, ja, und dann Jahr für Jahr danach ist es immer besser geworden.

Jochen

Und also 2013 ist halt substanziell der Fehler irgendwie runtergegangen.

Jochen

Dann 2014 nochmal, 2005 nochmal, nach 2016 irgendwie oder so, glaube ich, sind die Modelle irgendwie bei Superhuman-Performance, also machen weniger Fehler als Menschen beim Label.

Jochen

Mittlerweile, glaube ich, machen die Modelle, die die besten Modelle jetzt machen, so die machen einen Fehler, der ist halb so groß, wie die Menschen machen.

Jochen

Und das bei so Tasks wie, ja, ist da eine Katze auf dem Bild oder so, wo man sich denkt, so, das ist, also ja klar, das wird man ja können.

Jochen

Gut, also ich meine, da sind auch Feasebilder dabei, sowas wie unterschiedliche Hunderassen und sowas.

Dominik

Man sieht nur so einen Hinterteil mit so einem Schwanz und weiß dann nicht, ist es eine Katze oder sonst irgendwas.

Jochen

Ja, aber dass das halt irgendwie, dass man da Modelle hat, die bei so einem Dingen, wo man denkt, naja gut, also das, äh, da sind Menschen schon nicht so schlecht drin, dass die da deutlich besser sind, das ist beeindruckend.

Jochen

Und zwar ist das halt in sehr kurzer Zeit passiert, sozusagen, was ja auch sehr beeindruckend.

Jochen

Also da ist irgendwas passiert, was halt das ganze Feld sozusagen sehr stark in Bewegung gesetzt hat.

Jochen

Und so etwas ähnliches sehen wir jetzt gerade bei NLP-Geschichten halt auch.

Jochen

Das war mir jetzt bis vor eben kurz auch gar nicht so richtig klar, dass das gerade passiert.

Deutsch.

Ja.

Jochen

Deutsch ist halt immer ein bisschen doof, ne?

Jochen

Das ist eine Sprache, für die sich irgendwie niemand so richtig interessiert.

Jochen

Also, ja, aber da genau gibt es wohl auch jemanden, es gibt halt diese großen Sprachmodelle, irgendwie Bird, irgendwie XLnet, LGBT2, ähm Bird.

Dominik

Ja, wir werden Sesamstraße, wie war das?

Jochen

Muppet Show, glaube ich, oder?

Jochen

Muppet Show?

Jochen

Oder Sesamstraße, ja, ich weiß nicht.

Jochen

Also diesen Spaß.

Jochen

Wahrscheinlich.

Jochen

Und da werden halt so große Transformer-Modelle trainiert.

Jochen

Und der Witz daran ist, ich habe mich vorher, man muss sich vorstellen, ich hab das schon mitgekriegt, dass das passiert.

Jochen

Und ich dachte mir so, ja warum trainiert man denn so riesige Modelle, was soll denn das?

Jochen

Also es ist auch sehr teuer und auch verbrennt unfassbar viel Energie und Taktzyklen und so.

Warum macht man das denn?

Jochen

Jetzt, um ein bisschen besser vorherzusagen, was das nächste Wort im Satz ist.

Jochen

Ja gut, ist schon ein interessantes Problem, aber warum wirft man da so viel Geld drauf und so viele Ressourcen?

Jochen

Und dann ist es aber genau wie beim ImageNet, bei ImageNet ist ja auch so, dass dadurch, dass es volltrainierte Modelle gibt, die sozusagen ein gutes Verständnis davon haben, wie unsere visuelle Welt halt so aussieht, kann man die auf neue Probleme sehr gut anpassen.

Jochen

Dann nimmt man halt irgendwas, wo man jetzt nur wenige Trainingsbeispiele hat und feintunt diese auf ImageNet trainierten Modelle auf dieses Problem und kriegt damit Sachen hin, die vorher halt völlig unmöglich wären oder wo man halt auch irgendwie hunderttausende Trainingsbeispiele gebraucht hätte oder so.

Jochen

Und kann dann halt irgendwie in einem konkreten Anwendungsfall halt sehr, sehr gut sein.

Jochen

Und auch da, ich glaube auch da ist den Leuten noch nicht so richtig bewusst, was das eigentlich bedeutet.

Jochen

Und Anwendungen gibt es da auch noch nicht so viele, aber da gibt es wahrscheinlich, also da werden wir sehr viele Anwendungen sehen, denke ich.

Jochen

Das halt jetzt, also ja, eben, mein Beispiel dafür war halt irgendwie eigentlich, dass irgendwie Flaschen-Pfandautomaten da so schlecht sind.

Jochen

Das muss eigentlich nicht sein, das könnte alles viel besser gehen.

Jochen

Und das gilt im Grunde für alle Probleme, wo man irgendwie visuell was erkennen können möchte.

Jochen

Das ist theoretisch durch.

Jochen

Jetzt muss man es eigentlich nur praktisch umsetzen.

Dominik

Ja, mir raut schon ein bisschen davon, ja, dieser Mensch darf in die Stadt.

Nein, der darf nicht in die Stadt.

Dominik

Ja, dieser Mensch darf da und.

Jochen

Leider könnte es auch sein, dass wir jetzt.

Dominik

Diese Ampel bleibt für dich rot.

Jochen

Ja.

Jochen

Gib doch nicht mal die guten Tipps direkt weiter.

Jochen

Ja, es ist nicht ganz unproblematisch, das stimmt auch.

Jochen

Aber eben, also das ist jetzt auch für Sprache halt so ein bisschen passiert, weil man eben, wenn man jetzt so ein Language-Modell trainiert hat auf irgendwie großen, weiß nicht, auf einem Website-Crawl oder eben Wikipedia, man braucht eigentlich noch ein bisschen mehr als Wikipedia.

Jochen

Dann kann man da unterschiedliche Prediction-Hats draufsetzen für unterschiedliche Probleme.

Jochen

Und man nimmt halt sozusagen irgendwie, aber es sind halt alles Sprachprobleme.

Jochen

Also auch so ein Textklassifikationsproblem kann man halt nehmen.

Jochen

Jagt das halt irgendwie, benutzt halt zum Beispiel Bird, als um das halt irgendwie sozusagen um diese, diese, diese.

Dominik

Das ist ein Prediction-Head.

Jochen

Ja, genau.

Jochen

Das ist halt im Grunde die Dinger übersetzen das ja irgendwie in eine interne Repräsentation.

Jochen

Und dann übersetzen sie sich wieder zurück in das, was du haben willst.

Jochen

Und du kannst das austauschen.

Jochen

Du kannst halt sagen, okay, ich möchte, dass mein Language-Modell mir zum Beispiel Sätze generiert.

Jochen

Oder ich möchte, dass es halt Textklassifikation macht.

Jochen

Oder ich möchte, dass es irgendwie Named Entity Recognition macht oder irgendwas.

Jochen

Also sozusagen Namen oder Orte findet in Texten oder sowas.

Dominik

Die gilt ja direkt die Kasse, hör mal hin.

Jochen

Oder Fragen beantworten kann oder solche Sachen.

Jochen

Und du kannst das gleiche vortrainierte Modell nehmen für all diese unterschiedlichen Tasks.

Jochen

Ja, das heißt, du kannst, und die gibt es halt auch, du kannst halt, weiß nicht, wie viel Geld Google ausgegeben hat, um Bird zu trainieren oder weiß ich nicht, aber auf jeden Fall eine ganze Menge.

Jochen

Kannst du dir nicht leisten wahrscheinlich.

Jochen

Und du kannst das vortrainierte Modell nehmen, passt es auf deinen Task an, wie zum Beispiel jetzt irgendwie Textklassifizier von diesen Framzocks oder irgendwie und trainierst das halt da drauf und kriegst halt deutlich bessere Ergebnisse.

Jochen

Du Kasse.

Jochen

Genau.

Jochen

Und das würde ich gerne noch ausprobieren, das habe ich jetzt noch nicht geschafft, aber das mache ich bestimmt nichts irgendwann.

Jochen

Und dann, aber es gibt schon Papers dazu jetzt.

Jochen

Ist aber auch jetzt im Früher erschienen, glaube ich, eins, das ist auch das Reuters-Dataset, das wir auch in der Textklassifikations-Ding-Episode hatten, wo jemand das einfach genommen hat, der hat noch zwei andere Textklassifikations-Korpus-Datasets benutzt, um halt, also man sollte halt immer mehrere nehmen, weil es kann ja auch Zufall sein, dass mal irgendwas in einem bestimmten Dataset besser funktioniert.

Jochen

Und da waren, also gegenüber diesen guten Zahlen von 97 Verbesserungen von so 5% im F1-Wert oder sowas, was Wahnsinn ist.

Jochen

Also das ist halt richtig, richtig viel.

Jochen

Das ist halt so Klasse von irgendwie, also in einem Ding, wo man seit 20 Jahren nichts mehr gefunden hat, was es irgendwie besser macht, da passiert plötzlich so ein Fortschritt, dass es halt, da ist irgendwas Fundamentales passiert.

Jochen

Also da scheint es so zu sein, zumindest, dass man tatsächlich mehr Informationen aus der Sprache da rausholen kann, als man das bisher konnte.

Jochen

Und das ist natürlich ein Hinweis darauf, dass da noch viel.

Jochen

Und da das jetzt, das sind die ersten Ergebnisse, ne?

Jochen

Da kann man ja dann noch optimieren.

Jochen

Das heißt, das wird sehr wahrscheinlich noch alles noch viel besser werden.

Jochen

Und also man hat auf jeden Fall jetzt einen Ansatzpunkt, wo man wieder einen Hebel reinsetzen kann.

Jochen

Ja, das heißt, wir kriegen jetzt wahrscheinlich auch was Probleme angeht, wo man mit Sprache zu tun hat, irgendwie deutlich bessere Ergebnisse.

Jochen

Und das betrifft dann eben solche Sachen wie Textklassifikationen.

Jochen

Spam nicht Spam, das ist gut, das ist schon gelöst irgendwie, aber es ist da auch so ein Spezialproblem und man kann das halt auch mit Spezialgeschichten gut anpacken.

Jochen

Aber man hat diese Probleme ja auch in anderen Bereichen, wo man dann jetzt nicht so viel Energie reinstecken möchte wie in Spam versus nicht spam Erkennung.

Jochen

Sondern man hat halt ein paar hundert eigene Datenpunkte oder so und kriegt dann plötzlich Ergebnisse hin, die man ansonsten, wo man sonst viel Engineering hätte reinstecken müssen oder viel, viel mehr Daten.

Jochen

Und das ist natürlich schon eine super interessante Geschichte.

Jochen

Ja, genau.

Jochen

Also da machen wir auch bestimmt noch Sachen zu.

Jochen

Das wird noch cool.

Das wird's auch cool.

Jochen

Ich bin schon mal gespannt, mal diese Dinger auszuhören.

Dominik

Ja, ich hatte da einige Horrorgeschichten vielleicht noch, die man jetzt daran direkt anschließen kann, weil es gibt ja dann die Möglichkeit, ja leider.

Dominik

Also, also auch, ne, das war jetzt Stanford irgendwie ImageNet und dann, ich weiß jetzt nicht, wovon das Dings Sprachnetz herkam, aber es gibt.

Jochen

Die Player da momentan sind, Google, Facebook, also Facebook ist Excelnet, Google ist Bird, dann genau, OpenAI hat GPT2 gemacht.

Jochen

Ich weiß nicht so.

Jochen

Aber die hat ja die großen Plan.

Dominik

Aber ich habe am MAT so eine lustige Sache gesehen, die haben etwas an die Gesichtsmuskeln angeschlossen, dass dann die Bewegungen des Gesichtes auf deine innere Stimme mappen kann.

Dominik

Und so könnte man tatsächlich dann irgendwie so lesen, was Versetze diese Menschen denn gerade denken, wenn man sie dann irgendwie so mitfilmen würde und daraus dann solche Sachen verbauen.

Ist ein bisschen gruselig.

Dominik

Alter Ego heißt das Projekt,

Jochen

glaube ich.

Jochen

Ja, aber da bin ich mal sehr skeptisch, wenn Leute solche Sachen behaupten.

Dominik

Betty Ford Clinik?

Jochen

Ja, ja, nein, aber ich meine überhaupt, wenn es darum geht, vorherzusagen, was, also, weil, also da, da geht sozusagen so der Internet Bullshit-Alarm los, weil das natürlich etwas ist, was alle super gerne hätten, dass sie halt irgendwie Gedanken lesen können.

Jochen

Auf der anderen Seite, aber man, also Menschen nicht gut können.

Jochen

Und Menschen sind ziemlich gut.

Naja, aber vielleicht können die sie nicht mehr.

Jochen

Die Quote, zum Beispiel bei erfahrenen Polizisten, die glauben alle, die könnten das, aber wenn du das testest, also die Studien jedenfalls, gut, ich meine, ich bin jetzt auch kein Experte dafür, aber ich habe da auch so Sachen gesehen, wo halt die Quote von guten Polizisten irgendwie Lügner zu erkennen in Verhören, ist so knapp über 50 Prozent.

Also wenn die eigentlich wahrscheinlich.

Dominik

Ich weiß es nicht so genau, aber.

Und wenn

Jochen

die das schon nicht können, ja, wie soll das ein Modell hinkriegen?

Dominik

Ja, aber die haben halt so ein Ding auf dem Gesicht, ne?

Dominik

Also das ist ja interessant, guckt es mal an.

Dominik

Alter Ego heißt das mit MIT-Programm.

Jochen

Okay, muss ich mir mal anschauen.

Dominik

Ist wirklich spannend.

Dominik

Ja, also ich glaube, wir waren fast am Ende mit den Classifiern, aber du hast noch eine Sache, hast du noch gebaut, du hast noch eine andere nach der Vektormaschine was anderes.

Jochen

Das war Spacey.

Das war Spacey gut.

Jochen

Das war so ein neuronales Netz.

Jochen

Also es ist tatsächlich ein bisschen besser als naive Base, es ist ein bisschen schlechter als die lineare Support-Vektormaschine und verbraucht aber wahnsinnig viel mehr Rechenleistungen natürlich.

Jochen

Macht ja natürlich auch viel kompliziertere Sachen.

Jochen

Aber das ist halt auch so ein Ding.

Jochen

Wenn die Daten das halt nicht hergeben und an der Stelle tun sie es wahrscheinlich nicht, dann nützt einem das halt nichts.

Jochen

Sondern man braucht halt dann auch entsprechend Trainingsdaten, um halt diese ganzen Parameter dieses Modell halt halt auch ordentlich zu finden oder so.

Jochen

Aber ich könnte mir halt vor, also was mich jetzt interessieren würde, ist, was ist denn jetzt, wenn ich jetzt so ein fortrainiertes Language-Modell nehme und dann dann nochmal gucke, vielleicht wird das dann nochmal deutlich besser.

Jochen

Wobei mit dem Dataset.

Jochen

Naja.

Jochen

Aber, aber, ja.

Jochen

Aber eben, das zeigt halt zum Beispiel auch, finde ich, dass wenn man jetzt, also Spacey ist schon, gilt so als Set of the Art und ich finde, das ist ja auch gut und so.

Jochen

Und wenn man das jetzt aber so naiv benutzt für so ein Problem, wo man jetzt halt irgendwie selber nicht so viele Daten hat, dann, also ich würde sagen, da jetzt einfach so naiv Spacey gelaufen zu haben, wäre wahrscheinlich nicht unbedingt der richtige Weg gewesen, sondern ja.

Jochen

Man muss manchmal so Dinge ausprobieren und manchmal und ist es oft, zumindest um eine Baseline zu haben, eine sehr sinnvolle Sache, ein ganz einfaches Verfahren, was man gut versteht.

Jochen

Zumindest mal implementiert zu haben und zu sehen, ob man nicht irgendwo fundamental was kaputt macht oder was nicht verstanden hat.

Jochen

Und für sowas, ja, ist es eigentlich ganz gut.

Cool.

Jochen

Ja, ich glaube, damit sind wir eigentlich schon praktisch mit der Geschichte.

Dominik

Ja, na, Eve-Base haben wir erklärt.

Dominik

Fehlt eigentlich noch der Pick der Woche und schöne Wünsche fürs.

Dominik

Ja.

Dominik

Ja, leider ist erst Montag, Wochenende.

Dominik

Aber.

Pick Picks.

Dominik

Vielleicht ist es ja bei euch.

Jochen

Ja, das wird auch noch ein bisschen dauern, bis die Sendung nicht.

Bis die Sendung raus ist.

Dominik

Oh ja, wir wissen noch nicht, genau was sie erscheinen.

Dominik

Ja, was ist denn bei deinem Pick der Woche?

Dominik

Du hast ja auch was Schönes rausgesucht.

Jochen

Genau, ist mir letztens irgendwie bei dem Weg gelaufen.

Jochen

ISOWT.

Jochen

Und zwar geht es dabei darum, dass halt.

Dominik

Importe sortieren.

Jochen

Ja.

Jochen

Man kann ja auch sagen.

Dominik

Man kann ja nicht aktuale Sachen machen, man automatisiert seine Importe.

Jochen

Eine Standardform bringen ja mit Black und so.

Jochen

Aber das ändert jetzt zum Beispiel die Reihenfolge von Importen halt nicht.

Jochen

Und wenn man das komisch gemacht hat, dann.

Dominik

Also Black ist ein Autoformatter, den man in seinem Editor zum Beispiel einstehen kann oder mit dem man dann Dateien später so formatiert, dass auch eure Kollegen das lesen können, weil die eure ganzen Gewohnheiten zunichte machen und das so formatieren wie es normalerweise tut.

Jochen

Genau.

Jochen

Aber wenn man jetzt viele Imports irgendwie hat, dann ist es auch vielleicht nicht schlecht, da eine Struktur drin zu haben.

Jochen

Und da guckt halt Black höchstens, dass die Zeilen nicht zu lang werden oder so.

Jochen

Aber halt nicht, wie die sortiert sind, weil das spielt halt keine Rolle für Black Herzen.

Jochen

Aber das ist halt, vielleicht, wenn man da auch irgendwelche Regeln zu haben, und das, also jedenfalls bringt iShort das halt auch in ein Standardformat.

Jochen

Ich glaube, wenn man das einfach ohne Config oder so benutzt, dann sortiert es das alphabetisch, dass es vielleicht auch die sinnvollste Geschichte ist, aber man kann dem halt auch sagen, was es priorisieren soll oder sagen, okay, Standardmodul aus der Schande-Bibliothek nach oben oder so.

Jochen

Man kann das Ding auch relativ umfangreich konfigurieren.

Jochen

Und ich fand einfach nett zu sehen, dass es da überhaupt irgendwie eine Möglichkeit gibt, das automatisch zu machen.

Dominik

Ich glaube, da gab es sogar so einen Hook in Black oder sowas.

Jochen

Nee, also da genau, das war, nee, in Black ist es so, dass irgendwelche Leute haben da ein Issue ein GitHub aufgemacht und gefragt, ob Black das nicht auch machen könnte.

Jochen

Und dann haben sie gesagt, ah, ne, vielleicht nicht, gibt doch Icehort.

Jochen

Und dann hat man irgendwelche Leute gesagt, oh, Icehort hat aber die und die und die Probleme und gerade in Kombination mit Black macht das manchmal Sachen kaputt.

Jochen

Daraufhin hat der Autor von icewort da geschrieben, ja, ich sehe das auch alles irgendwie, dass das problematisch ist.

Jochen

Und ich arbeite gerade an einer Black-Isewort-Implementation, die diese Probleme dann nicht hat.

Dominik

Also falls ihr mittelgroße oder größere Kopf automatisch sortieren wollt mit euren Modulen, guckt euch das doch mal an.

Dominik

Ja, also mein Pick der Woche war PP-Top.

Dominik

Das macht sowas wie Python-Prozesse, anzeigbar wie HTOP, wenn ihr das irgendwie kennt oder so.

Dominik

Hardtop, Atab oder Top, irgendwie was unter Linux, so ein bisschen die Prozesse und Memory Management der einzelnen laufenden Prozess-IDs und so weiter euch zeigt.

Dominik

Macht das das mit Python-Prozessen, das ist relativ cool.

Dominik

Und ja, kann euch so eine Inspektion geben.

Dominik

Was macht denn der Prozess eigentlich gerade?

Dominik

Fand ich ganz interessant, um mal so ein bisschen rumzuspielen, mal ein bisschen zu debuggen und zu gucken, was passiert denn da eigentlich.

Jochen

Klingt gut, muss ich mal ausprobieren.

Ja.

Jochen

Ja, so.

Dominik

Da haben wir es quasi fast heute wieder geschafft, würde ich sagen.

Dominik

Ja, also falls jemand von euch gezählt hat, wie auf ihr Penis gezählt haben, kriegt natürlich eine Folge wünschen.

Dominik

Noch toller wäre es natürlich, wenn ihr einen Algorithmus schreibt, der irgendwie Sprache analysiert und genau zeigt, wo das denn gewesen ist.

Dominik

Wir wollen euch ja mal ein bisschen motivieren zu meinen Projekten, wer weiß.

Dominik

Ja, danke, dass ihr wieder zugehört habt.

Dominik

Bleibt uns gewogen und schaltet wieder rein.

Dominik

Ja, wie immer auch seid.

Dominik

Schönen Tag, schönen Morgen, Abend, Acht.

Bis zum nächsten Mal.

Dominik

Bis dann.

Dominik

Jo.

Dominik

Tschüss.

Tschüss.