Transkript: Naive Bayes
Vollständiges Transkript der Episode. Zeitstempel beziehen sich auf die Audiowiedergabe.
Ja, hallo liebe Hörerinnen und Hörer.
Willkommen bei der 13.
Episode vom Python Podcast.
Hier ist der Dominik, wir sind bei Jochen.
Jo, hallo.
Ja, heute haben wir ein schönes Thema für euch mitgebracht.
Und da wollten wir über naive Base-Klassifikation sprechen und ein bisschen Spam sortieren.
Genau, genau.
Also eigentlich, was wir oder für mich die Idee dabei war, mal wieder so ein bisschen was Einsteiger einsteigermäßiges mehr zu machen.
Und dann habe ich mir kurz Joch ein Drepo angeguckt und so einsteigerfreundlich ist das nicht.
Aber wenn euch das natürlich interessiert.
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.
Ja, da kann man auf jeden Fall wiedersehen.
Python kann das richtig gut.
Aber wenn ihr wirklich ein Einstiegsbeispiel haben wollt, also in der nächsten Folge haben wir wieder, glaube ich, was vor.
Übernächsten, wirklich für Einfänger noch.
Da machen wir mal so wirklich Einsteigergeschichten, einfach grundsätzliche Datentypen und so.
Ich habe jetzt auch versucht, mich dabei dem Beispiel auf so die grundlegenden Datenstrukturen zu beschränken, die es halt irgendwie eingebaut gibt.
Aber gut, sogar ein super Einsteigerfreundlich ist es vielleicht nicht.
Aber es ist gespannt.
Vielleicht trotzdem interessant.
Wir haben übrigens Ende August mittlerweile 2019 immer noch und es ist tatsächlich immer noch so unglaublich warm wieder.
Also heute, ich weiß nicht.
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.
Also wir waren auf der Frostkorn, also ich noch ganz kurz und du ein bisschen länger.
Ja.
Ja, das heißt, du hast ein bisschen mehr Vorträge gesehen.
Ich habe nur den einen letzten zu Reinforced Learning mehr angehört.
Du meinst den Workshop, das gab einen Deep Learning Workshop, ja, genau.
Ja, dazu gab es auch einen Vortrag, den habe ich auch geguckt.
Genau.
Ich habe auch sowieso wahnsinnig viele Talks gar nicht angeguckt.
Aus den Netzwerk, oh.
Aber ansonsten, doch, ja, so ein paar Sachen habe ich auch schon gesehen.
Das stimmt.
Ja, aber war interessant, war viel los.
Und es gab nur eine ganz tolle Stundebetreuung.
Ja.
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.
Hätte Mädels Spaß haben können.
Ja, genau.
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.
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.
Das wir auch schon mal gemacht hatten.
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.
Und ja, also die haben da irgendwie bessere Netze verwendet.
Also diese Zahlen waren hinterher besser.
Das war tatsächlich ganz cool zu sehen.
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.
Aber so, ansonsten war das jetzt für mich jetzt gar nicht, also war jetzt, war jetzt nicht so viel Neues dabei.
Ja.
Ja, und wir haben Post bekommen.
Nette Post.
Ah, genau, natürlich.
Einen ganz verbrief von Thorsten, vielen Dank für deinen super netten Brief.
Ja, danke schön.
Wir haben es irgendwie nicht so richtig geschafft, darauf zu antworten, weil gerade viel Stress war.
Ist aber noch viel Stress.
Gehört nicht auf.
Aber genau.
Ja, aber trotzdem hat uns sehr gefreut.
Wir hatten auch noch eine Mail bekommen von jemandem, der sich dafür interessiert hat, wie das mit den Generatoren so funktioniert.
Ja, und das ist natürlich auch eine interessante Frage und vielleicht kann man das eigentlich auch hier kurz
überhaupt nicht.
Ja, dann sag mal bitte, was hat der SPD?
Was muss er denn?
Genau, man kann auch einfach Listen nehmen und dann funktioniert das auch alles.
Ja, kann man, aber manchmal ist es halt schlauer, einen Generator zu nehmen.
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.
Das wäre natürlich halt schlecht, weil dann wird das nicht funktionieren.
Ist das nicht auch einer der Unterschiede von Python 2 auf Python 3 gewesen, dass bestimmte Sachen dann als Generatoren zurückgegeben wurden?
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.
Ich bin mir noch nicht sicher, ob das wirklich der Unterschied zwischen 2 und 3 war.
Kann aber gut sein.
Oder das Range und X-Range, nein, genau.
Bei Python 2 musste man X-Range.
Range gab eine Liste.
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.
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.
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.
Ja, aber genau, was ist überhaupt ein Generator?
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.
Das heißt, man geht über jedes einzelne Listenelement durch und kann dann damit Dinge anstellen.
Ja, der große Unterschied ist im Grunde, dass die Liste halt schon fertig ist.
Also alle Elemente der Liste sind halt ja schon drin und das Ding ist irgendwie in der Datenstruktur, die im Hauptspeicher liegt.
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.
Und intern sieht das dann halt so aus, dass eine Funktion meistens dann irgendwas raushieldet.
Also nicht Return, sondern irgendwie das.
Das merkt sich, wo sie gerade war.
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.
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.
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.
Genau, bei einer Liste, ja.
Der Generator hat dann viel weniger Speicher, den er verbraucht, gerade bei so großen Datenmengen.
Genau.
Und ja, also
schneller, ja.
Warum ist ja denn der Generator so viel schneller als die Liste?
Ja, das kommt drauf an.
Also das würde ich jetzt so nicht sagen, dass der Generator immer schneller ist, das kann man so nicht sagen.
Okay.
Eher wahrscheinlich ein bisschen langsamer, aber es hat halt andere Vorteile.
Also der Vorteil ist halt, man kann damit Dinge tun, die mit Listen halt nicht gehen.
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.
Oder du kannst halt da Schritt für Schritt durchgehen.
Und Generatoren werden halt sozusagen, also sozusagen, das wäre eine andere Möglichkeit, das zu vergleichen.
So irgendwie DOM Parser versus SAX-Parser.
Das kennt wahrscheinlich auch keiner.
Ach, warte, warte gerade.
Also DOM ist das Webseiten-Strukturelement von den HTML-Baken.
Object-Model, ja, genau.
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.
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.
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.
Und dafür muss das Ding aber dann halt nicht komplett im Hauptspeicher liegen, sondern das wird dann halt sozusagen iterativ gepasst.
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.
Und wenn jetzt 2 Gigabyte, weiß ich nicht, Ding auf der Platte liegen hat, dann hat man unter Umständen ein Problem.
Früher war das schlimmer, früher war bei 32 Bitzels sehen wir noch, dass da schnell Ende.
Ein V-Speicher voll.
Ja, war halt mit 3 GB 4, ja, das ist halt Hauptspeicher voll.
Also oben war out of mana, ne?
Ja, mittlerweile kann man ja auch viele Hauptspeicher einstecken.
Also begegnet es einem wahrscheinlich eher selten, dass man irgendwie das an den Hauptspeicher ausgeht, wenn man irgendwas passt.
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.
Und passt halt eventbasiert.
Ist ein bisschen mehr Arbeit dann sozusagen beim Programmieren, aber verbraucht halt nicht so viele Hauptsprecher.
Und solche Arten von Fällen gibt es natürlich viele, wo man irgendwie wo Ströme von Daten hat.
Irgendwie auch wenn man sich irgendwie sich an irgendwelche APIs dranhängt und dann kriegt man halt da irgendwie.
Häppchen weiter irgendwelche Requests.
Genau, genau.
Dann ja, für all diese Dinge ist es halt sehr sinnvoll.
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.
Generator-Protokoll dann halt verwenden oder man kann halt auch einfach eine Generator Expression schreiben.
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.
Aha, das heißt also, wenn ich eine List-Komprehension mit runden Klammern schreibe, habe ich automatisch einen Generator und das funktioniert genauso.
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.
Aber wenn man etwas raus yieldet, dann wird die Funktion sozusagen nur unterbrochen, bis halt sozusagen das nächste Ergebnis da rausgeholt wird.
Und wenn man jetzt auch noch Sachen da reinstecken kann, dann kann man tatsächlich so bidirektionale Kommunikation irgendwie haben.
Und dann kann man sowas haben wie einen Websocket-Server oder irgendwie einen Server, der halt Sachen annimmt und wieder Sachen zurückschickt.
Und das halt.
Auch das macht ein Generator schön.
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.
Und ja, sehr nett.
Oh, was mir auch da beim Beantworten dieser Mail aufgefallen ist, ist halt, dass mittlerweile Listen relativ wenig Hauptspeicher verbrauchen.
In Python 3.7 war das jetzt.
Das war früher viel mehr.
Früher waren das irgendwie, also ich sag mal, also keine Ahnung, was habe ich da hingeschrieben.
So bei 30 Byte oder ich weiß es nicht mehr genau.
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.
C-Programmier werden sagen, völlig ineffektiv wollen wir auch.
Ja, super ineffizient, sondern halt irgendwie das mal 3 oder sowas.
Oder vier.
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.
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.
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.
Oder man nimmt halt NumPy, da geht das auch.
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.
Und ich dachte so, huch, wie ist das?
Was ist das denn?
Ehrlich gesagt, ich weiß nicht genau, woran das liegt.
Das müsste ich vielleicht auch bis zum nächsten Mal recherchieren, woran das liegt, aber das ist ja, das ist ja super.
Also das ist viel weniger, als das früher war.
Wie wird hätte das früher so im Bereich, dann vielmal viel oder deutlich mehr?
Ja, da hätte ich ja eher erwartet, dass das halt so 3 GB werden oder so.
Weil, äh, ja.
Python-Sparplatz.
Irgendjemand hat das vernünftig.
Das ist da optimiert worden.
Vielleicht weiß das ja auch jemand, was passiert ist.
Ja, Generatoren, liebe Magic.
Genau, Generatoren.
Chapter mal ist Zeit ist, glaube ich, für.
Oh, ich habe gerade dazu gleich mein Handy geklaut.
Herzlichen Glückwunsch an meine Cousine, sie hat gerade einen Heiratsantrag bekommen.
Oha.
Ja, ja.
Wir freuen uns alle für Sie mit.
Ja, genau.
Ja, was hatten wir denn noch?
Ah, genau.
Dann habe ich irgendwie Podcasts gehört, das war auch irgendwie wieder sehr nett.
Du hörst sowas.
Ja, ja.
Der Django, äh, Django-Chat-Podcast hatte wieder eine ganz nette Folge mit.
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.
Wenn ich ja einmal kurz bei Werbung machen darf.
Ah, okay.
Falls jemand sich noch für Eishockey interessiert, weil es nicht so wahrscheinlich, aber vielleicht gibt es ja Menschen.
Ja, tolles Ding.
Gab es einen kleinen Skandal.
Nein, egal.
Ja, Düsseldorf und Eishockey, ja, doch, hat ja auch irgendwie.
Ja, ja, man hat sich um einen der Sponsoren aufgeregt, der war nicht so ganz.
Der hat so ein paar komische Sachen gepostet.
Das haben die investigativen Journalisten von Journalisten aufgedeckt.
Mal gucken, ob wir nächstes Jahr noch in der Liga ins Leisten kommen.
Tja.
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.
Früher hieß es South.
Was muss man früher machen, bevor man Django Migrations machen konnte?
Naja, da gab es halt drei, ich glaube, es gab drei unterschiedliche Systeme.
Es gab eins von Andrew Godwin, das South gab es, es gab eins von Simon Willison und es gab noch eins von
deutlich mehr Arbeit gewesen früher irgendwie.
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.
Also er hat das halt nicht einfach übernommen, sozusagen, sondern er hat es nochmal komplett neu geschrieben.
Ja, was man nicht so alles lernt, wenn man irgendwie zwei Jahre weiter ist, ne?
Wieso macht man das?
Ah, nee, offen.
So bei NFTG, was habe ich denn da geschrieben?
So ein Unsinn, ja.
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.
Also die ganzen großen Fanworks sind das nicht, Flaskes ist das auch nicht.
Bei Django ist es halt aber schwierig, das zu ändern, weil das einfach so viel Zeug ist.
Und weil halt die API, also die Whiskey-API gibt es halt nicht, ja.
Es gab.
Ich gebe Post.
Ja, Post.
Hahaha, die wollte ich schon immer überbringen.
Er hatte da vorher ein Projekt, Django Channels, oder das gibt es natürlich immer noch.
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.
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.
Das wird tatsächlich sehr interessant.
Also ich bin schon sehr gespannt.
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
elleicht.
Und dass man das alles auch wieder asynchron zusammen aggregieren kann und dann nicht das synchron hintereinander machen muss, wie das momentan passiert.
Dann hat man halt irgendwie 200 Abfragen, die man irgendwo hin macht.
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.
Und das ist natürlich blöd, weil die Latenz natürlich irgendwie entscheidend ist.
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.
Ja.
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.
300.000 Leute wollen in den nächsten 15 Sekunden unseren Service.
Ja.
Und dann müssen sie halt entsprechend Maschinen hochfahren oder zumindest irgendwie neue Applikationsserver oder so für eine bestimmte Geschichte.
Und sie haben das Problem, dass Django bei ihnen sehr langsam mittlerweile.
Also das ist halt auch so ein Eventbrite hat irgendwie so knapp über eine Million Zeilen, Python-Code.
In Django.
Und ist ein Django-Projekt, ja.
Und das startet relativ langsam.
Ja, ja, kennt ihr.
Ja, das ist, denke ich, auch bekannte Geschichte.
Und das Ding braucht halt mindestens 30 Sekunden zum Starten, weil das einfach so lange dauert, bis die ganzen Imports aufgelöst sind.
Also, oh Gott, oh Gott, oh Gott.
Wir haben so 30 Sekunden vorher wissen, was passiert.
Da kommt kein Sturm.
Das Problem ist, du kannst es halt nicht optimieren.
Es ist halt, wenn die Imports so lange dauern, dann dauert es halt so lang, da kannst du nicht viel machen.
Das ist natürlich schon bitter.
Ja, man müsste welche rausschmeißen eigentlich, ne?
Ja, aber.
Dann geht Muttiverlust.
Genau.
Das geht ja auch nicht.
Ja.
Also hoffentlich, also ja, muss man schon sagen, so das vielleicht dann doch irgendwie an der Zeit dann mal so den monolithischen Ansatz irgendwie
mehrere Optionen, wie man sowas ausmisten kann.
Irgendwo ab und zu mal ein paar Sachen abhacken, gucken, was noch stehen bleibt.
Oder mal wirklich mühevoll rangehen, alles neu umsortieren.
Dann ist halt die Frage, wie lange dauert so ein Refactoring, wenn du dann komplett auf.
Ja, aber du kannst nicht viel machen.
Also Refactoring hilft dir auch nicht.
Ja, aber alle Features erstmal rausschmeißen.
Ja, gut, die ganz ganzen Features streichen, aber das ist nicht.
Ja, aber du kannst ja zum Beispiel nicht sowas machen wie Features, nur dann laden, wenn du sie wirklich brauchst.
Und dann dafür irgendwelche extra Requests machen, weil die ganzen Basissachen vielleicht brauchen die gar nicht.
Ja, also bei Django ist es so, da werden deine Installed-Apps, die werden alle importiert da.
Du kannst es, soweit ich weiß, auch später nicht ändern.
Du kannst nicht sagen, jetzt irgendwas in Installed Apps hinzufügen, dynamisch.
Also wahrscheinlich geht es schon doch.
Wenn man sich da genug Mühe gibt, dann kriegt man das wahrscheinlich hin.
Aber das ist so nicht, sondern das passiert beim Starten.
Da wird gehen, genau, wenn die ganzen Installed-Apps gehen, dann geht man durch und importiert die ganzen Dinger.
Ja, also falls uns jetzt noch jemand zuhört, der nahe.
Achso, ja, genau.
Moment, wir sind noch nicht ganz durch mit den Geschichten.
Was haben wir denn, was haben wir denn noch?
Ne, oder sind wir doch durch?
Hattest du noch irgendwas?
Nö, gerade vor jetzt.
Alles klar, okay, dann haben wir doch, sind wir doch mit dem News-Teil durch.
Alles klar.
Ja, ja, ja.
Okay.
Dann mache ich hier mal eine Kapitelmarke zu.
Zum eigentlichen Thema.
Ja, wir wollten natürlich jetzt erklären, was naiv Base denn ist.
Was macht das denn?
Wofür braucht man das denn?
Und erstmal ist das ja erstmal, glaube ich, so eine Beschreibung einfach nur für so ein statistisches.
Ja, also die baseische Regel kennt man ja vielleicht.
Kennt man das?
Ja, warte, lass mich nochmal weiter nachkombinieren.
Ja, das geht ja nicht so Wahrscheinlichkeiten, die man bedingte Wahrscheinlichkeiten von Ereignissen berechnet, die in der Zukunft stattfinden.
Oder anhand dessen von der Eintrittswahrscheinlichkeit, die in der Vergangenheit, die man schon kannte, von ähnlichen Dingen.
Und ja, dann kann man die miteinander kombinieren.
Also bei Ethereum ist eigentlich einfach.
Wir gucken jetzt nicht wirklich bei Wikipedia nach und lesen Wikipedia vor, oder?
Dachte ich.
Okay, wir tun das.
Ah, naja.
Also ja, im Grunde ist das einfach nur eine Möglichkeit, wie man halt sozusagen die Wahrscheinlichkeiten umdrehen kann.
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.
Ja, nur als Beispiel, was kann man das dann.
Also ihr habt jetzt ein Kartenspiel oder sowas, ja, die Wahrscheinlichkeit dafür, dass er einen König zieht.
Wie viel ist das denn 4, 52 oder so?
Und dann willst du halt wissen, wie hoch die Wahrscheinlichkeit ist, dass du ein Bild ziehst.
Und dann hast du wie viel 3 mal, 4, 2.
Und dann kannst du dir überlegen, ja, die Wahrscheinlichkeit, dass so ein König siehst, dass es ein Bild ist.
Dann hast du die Wahrscheinlichkeit, dass es ein Bild ist und eine Bedingung ist ein König ist und andersrum.
Ja.
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.
Und andersrum kannst du dann halt ausrechnen, was kommt denn da raus.
Ja, also
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.
Darüber reibeln.
Genau.
Ja, wir haben eine Eintrittswahrscheinlichkeit, die würden wir gerne bestimmen, anhand von Features.
Und das ist ja das, was uns dann hinterher dann in diesem Machine Learning-Ding, glaube ich, am meisten interessiert.
Wie man aus diesem einfachen Beispiel von Feature-Dingern.
Ich glaube, wir haben gesagt, wir machen das anhand diesem Spam-Beispiel.
Das heißt, es geht darum, glaube ich, welche Worte da.
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?
Ja, also das lasse das gut an.
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.
Genau, und das ist es natürlich nicht so richtig, das stimmt nicht.
Man darf das nicht einfach so alles aufmultiplizieren.
Nach Idiot-Base sagen oder so.
Ja, aber es funktioniert.
Genau, es ist ja auch irgendwie sozusagen der erste funktionierende Ansatz gewesen, um irgendwie mit diesem Spam-Ding fertig zu werden.
2004 Programm Plan for Spam.
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.
Also ja, so Öl-Klassifikation, so einfache Dinge, ja, nein, bist du drauf nicht?
Nein.
Ist mein Gesicht drauf nicht?
Drauf kann ich nicht, kann ich nicht mit Bass machen?
Nee, da wird es wahrscheinlich eher, das wird schon nicht mehr gehen.
Aber es ist trotzdem interessant.
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.
Wo man nur die simplen Datenstrukturen irgendwie nimmt, die man halt irgendwie so dabei hat.
Also Skalare, Listen, ja oder beziehungsweise Strings als eine Form von irgendwie Variablen, die jetzt halt einen bestimmten Wert haben.
Listen, Dictionaries und das war's eigentlich.
Und mehr braucht man gar nicht.
Und halt man halt dann noch Funktionen, die man irgendwie aufruft und das war's.
Und das ist.
Wir sind bei einer totalen Einsteigerfolge angekommen.
Ja, eigentlich schon.
Also das ist halt das Interessante, dass man damit halt so wahnsinnig viel machen kann.
Und das ist halt etwas, was ich gerne irgendwie vermitteln würde.
Weil das, also wenn man das hinkriegt, wenn man das versteht, dann hat man schon ganz viel.
Okay, das heißt, anhand Python lernen ein bisschen anhand von Jochens Beispiel, mit dem man auch Machine Learning machen kann.
Und zwar hat ein Notebook hast du auch auf deinem GitHub.
Genau, das kann ich dann auch in den Showdown verlinken, wo da halt dieses Notebook drin ist und sich das mal angucken kann.
Ich benutze halt einfach irgendwie, es gibt so ein SMS-SBAM-Dataset bei Kagel.
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.
Das ist nicht so viel, das sind irgendwie, warte, lass mich mal gerade gucken.
Ich werde die Stadt, dass dieses Ding hier auch einfach mal erstmal neu.
Okay.
Lade das mal runter, es sind irgendwie nur so 200 Kilobyte.
Okay.
Anpausen wir das mal.
So.
Okay, wie viele Nachrichten haben wir denn da drin?
5500.
Und davon sind, ich weiß jetzt gar nicht genau, wie viele 1500 sind, ah nee, ich weiß, ihr müsst ja nachgucken.
Also es ist deutlich mehr Ham als Spam, aber.
Ein Schinken?
Ja, genau.
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.
Ja, also könnt ihr auch erstmal so ein bisschen Handling dafür bekommen.
Wie funktioniert das denn mit der Klassifikation, wenn ich jetzt so zwei Dinge habe, die ich voneinander trennen möchte?
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.
Also ganz genauso.
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.
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.
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.
Und dann würde man jetzt mit dem Ansatz auch immer nur eine von den Klassen kriegen.
Aber es könnte natürlich eben sein, dass es zum Beispiel eine Notifikation ist und Spam.
Ja, also das herausfällt, weil Naiv Base halt einfach sagt, nö, ich will jetzt nur eins haben.
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.
Man könnte es auch so umbauen, dass es Multilevel kann, aber ist halt nicht so.
Wir machen ja das Anfänger bei.
Wir machen jetzt ein einfaches Beispiel.
Also Analyse.
Genau.
So, was wir jetzt, was wir jetzt da zuerst machen, ist das halt in Training und Test-Dinger aufzuteilen.
Da habe ich das einfach zufällig getrennt nach, also 25% sind halt Tests, der Rest ist Training, also 75%.
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.
Und zwar das schon relativ gut.
Also indem es einfach die bedingte Wahrscheinlichkeit wohersagt, dass es World enthält, die Spam sind, unter der Bedingung könnte Spam sein.
Ja.
Ich kann ja mal kurz versuchen, mit Worten zu beschreiben, wie dieser Trainingsprozess aussieht.
Und der ist halt, man geht jetzt über alle Dokumente, die entweder Spam oder Ham sind, drüber.
Die in den Trainingsdaten steht ja dran, ob es ein Kopf ist.
Ob da Penis drinsteht.
Ja, genau, teilt das teilt irgendwie diese SMS halt auf in die Wörter, aus denen sie besteht.
Und dann guckt man in alle, also man hat ja Trainingsdaten, wo halt drin steht, dass es Spam ist oder es nicht Spam ist.
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.
Aber die Wahrscheinlichkeit, dass Penis vorkommt und es kein Spam ist und die Wahrscheinlichkeit, dass Penis vorkommt und es Spam ist.
Und daraus hat man jetzt so nach Base so eine kombinatorische Möglichkeit, sich das rauszurechnen.
Genau, man hat jetzt für jedes einzelne Wort eine Wahrscheinlichkeit dafür, dass dieses Wort irgendwie in dieser Kategorie vorkommt.
Das ist einfach die Frequenz von dem Wort in der Kategorie.
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.
Deswegen muss man sich das halt auch noch merken.
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.
Je nachdem, ob das.
Haben wir heute schon mal Penis gesagt?
Natürlich.
Oh, wir fliegen bei iTunes drauf machen.
Oh, wir sind auf Items?
Na gut.
Keine Ahnung.
Nee, ich glaube nicht.
Ne, Biaga.
Das könnte auch eine sehr gefährliche Folge werden.
Wir lesen keine Spam-Geschichten vor.
Na gut.
Auch wenn wir damit reich werden können.
Reich werden?
Ich wünsche schon.
Das ist ein altes Setter mit SMS-Swam.
Okay, wir denken euch gerade ab davon.
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.
Und man zählt jetzt sozusagen noch hoch quasi, welche Worte man wie oft gesehen hat, in welcher Kategorie.
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?
Ich habe jetzt nicht genau mitgerechnet, aber
ja, es ist immer blöd, sowas, also genau.
Und das macht man jetzt, also nochmal, ich gehe einfach jetzt, verdammt, das ist gar nicht so einfach.
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.
Nee, da musst du nochmal von vorne anfangen.
Ja.
Was man eigentlich.
Landfahrer.
Dazu kann ich was erzählen.
Jetzt habe ich offenbar keine Ahnung von, aber das ist eine ganz, ganz ultra interessante Geschichte.
Dass in, also in England gab es halt diese Kasse der Landfahrer, die waren reich.
Wenn man zum Beispiel, na, wie heißt das?
Eine Abtei, ein Gutshof.
Priori, wenn es umgeht.
Wie hieß dieses Buch nochmal?
Na, Pride and Prejudice.
Genau.
Sie fragt so irgendwie, ja, das spielt ja so ein bisschen guteradelig und so.
Ja, eigentlich ein gutes Buch, kann ich empfehlen.
Und dann kommt da plötzlich da dieser Pfarrer.
Wie kann das sein?
Das gehört doch eigentlich gar nicht dazu.
Doch, doch, doch, doch.
Das war, äh, die spielten damit.
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.
Voll gut.
Ab und zu mal vor der Kanzel, Herr Bundes.
Es gab sehr viele davon.
Und das gab denen Zeit, sich mit allen möglichen abseitigen, sozusagen in allen möglichen Richtungen ihren Interessen nachzugehen.
Also das war schon ein bisschen Nachbruder-Tack, oder?
Ja, natürlich.
Jemand aus wie ich mit so einem großen Fass hat am Bauch.
Nee, das ist
deutlich später.
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.
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.
Also ja.
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.
Ja, war gut.
Ja, tote Rückwärtsindution.
Ja.
Genau.
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.
Und genau, also was man sich eigentlich merkt, ist, wie viele Dokumente hat man jetzt pro Kategorie gesehen.
Und dann halt noch für jedes Wort da drin sozusagen, wie oft kam denn dieses Wort in der Kategorie vor.
Und dann hat man die Wahrscheinlichkeit, dass ein Wort vorgekommen ist, wie zum Beispiel Piep, unter der Bedingung, dass es Spam ist.
Oder das Wort Piep unter der Bedingung, dass es kein Spam ist.
Und das haben wir zwei bedingte Wahrscheinlichkeiten.
Und daraus kann man jetzt mit der allgemeinen Wahrscheinlichkeit für das Vorkommen dieses Wortes rausrechnen, wie hoch die Wahrscheinlichkeit denn sein könnte.
Genau.
Aber das klingt halt alles irgendwie so relativ kompliziert, wenn man es so erklärt.
In Code ist das sehr wenig Zeilen.
Ja, das ist ja so ein bisschen Brain hin und her, wie es immer bei
Satisfaction ist.
Also diese Train-Funktion, die hat halt, lass mich nicht lügen, 1, 2, 3, 4, 5, 6, 7 Zeilen.
Das ist alles.
Und die sind alle relativ kurz.
Also keine von diesen Zeilen hat mehr, hat irgendwie mehr als 30 Characters oder sowas.
Also es ist wirklich sehr, sehr einfach.
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.
Aber was ist Defaults Dikt?
Ach, das ist eine Bibliothek aus der Standardbibliothek.
Nee, ja, es ist in der Standardbibliothek, genau, und zwar aus dem Collections-Modul.
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
.z-Default, irgendwie dein Key, ja, Ecke, Klammer auf, Ecke Klammer zu, also Liste, Klammer zu, Punkt Append, irgendwie da einen Wert rein.
Das kann man auch machen.
Man kann das auch mit Z-Default machen, aber dann ist die Zeile relativ lang und dann wird es so ein bisschen eklig.
Ich hoffe, ihr habt mitgeschrieben.
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.
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.
Die Key gibt es da gar nicht.
Und wenn man Default dickt nimmt, dann passiert das nicht.
Weil er dann immer dann die leere Liste drin hat.
Dann, wenn es das noch nicht gibt, dann erzeugt er halt in dem Moment halt entsprechend eben eine Liste oder halt einen Integer.
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.
Plus gleich 1 zum Beispiel und zählt damit halt hoch.
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.
Und zwar
schön, Default-Keys direkt mit den Keysmann.
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.
Genau, also Z-Default hat man dann früher gemacht und heute, denke ich, machen die meisten Leute tatsächlich.
Oder ich weiß es nicht, es wäre interessant, Default dickt.
Und man kann das dann auch noch ineinander schachteln.
Also für die Counts der Wörter in den einzelnen Kategorien habe ich jetzt an.
Das ist unheimlich kompliziert, wenn man in Statistik irgendwie die ganzen bedingten Wahrscheinlichkeiten immer gegen das sich umdrehen.
Aber hey, wir können Dicts ineinander schachteln, ist doch schön.
JSON hört sich das an, P.JSON.
Ja, Dicts und JSON haben ja auch viel miteinander zu tun.
Also das ist ja sowas ganz ähnliches.
Es ist halt, du könntest Dicts als JSON rausrealisieren.
Also na gut, wenn es halt Objekte drin sind sich nicht in JSON rausrealisieren lässt, was natürlich auch sein kann, wie.
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.
Ach ja, JSON hat auch ein paar so hässliche Seiten.
Ja, das ist so ein bisschen genau, JSON zu parsen ist so ein bisschen ätzend.
Aber genau, also das ist wirklich, wirklich wenig, wirklich wenig Zeilen und trotzdem hat man damit ein Modell gebaut, das dann ganz ordentlich funktioniert.
Die Klassifikation ist jetzt ein bisschen schwieriger.
Ja, also wir möchten gerne jetzt klassifizieren in 2016.
Das beschreibe ich jetzt nicht.
Das hat schon beim Trainieren, das ist total einfach, hat das nicht gut funktioniert und jetzt beim Klassifizieren.
Also kann man sich angucken, wenn einen das interessiert.
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.
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.
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.
Genau.
Diese Zahlen sind dann halt sehr niedrig oft, weil entsprechend halt ja Worte auch nicht jetzt so.
Meistens gibt es.
Hier muss man natürlich noch mit der Anzahl normalisieren oder sowas.
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.
Ja, also ich glaube auch, wenn du größere Zahl miteinander multiplizierst, die unter 1 sind, wird es irgendwann null.
Naja, eben, genau, genau.
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.
Ich weiß nicht, ob ich das hier gehan habe, dass das nicht null wird.
Es ist aber auch im Grunde egal.
Es geht ja nicht darum, sozusagen eine exakte Wahrscheinlichkeit auszurechnen, sondern das irgendwie klassifizieren zu können.
Du könntest einfach den Logarithmus davon nehmen.
Ja, genau, das könnte man zum Beispiel machen.
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.
So dass man das halt als Wahrscheinlichkeiten interpretieren kann.
Ja, und
dann wisst ihr halt, ne, dass tatsächlich so der Quotient ist Spam, ist kein Spam.
Und dann habt ihr tatsächlich daraus logischerweise eure Wahrscheinlichkeit.
Genau.
Und das funktioniert halt halt jetzt, also bei dem Dataset war das so.
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.
Es ist sauschnell, es ist, äh, also das ist wahrscheinlich schneller als so ziemlich alles andere.
Auch deswegen, weil das halt kaum was macht.
Das ist halt irgendwie.
Und oder ich bin mir ziemlich sicher, dass es wahrscheinlich schneller ist als die meisten anderen Machine Learning-Verfahren.
Es ist sau schnell, man braucht keine Spezialbibliotheken wie NumPy oder sowas.
Aber ist das schon ein richtiges Machine Learning?
Weil im Prinzip rechnest du ja nur die einzelnen Wahrscheinlichkeiten für die einzelnen Kategorien.
Ja, aber es ist, ja.
Na gut.
Jetzt wissen wir, warum Statistiker sagen, haha.
Ja, ja, natürlich.
Also sie haben ja auch so ein bisschen recht, das ist schon so.
Aber trotzdem, ich meine, du kannst damit halt Sachen machen, wo Statistik halt Schwierigkeiten mit hätte.
Also wenn man das jetzt auf Papier machen wollen würde.
Was für der Unterschied zwischen Statistik und Maschinenbudding ist, man schreibt in einen Computer.
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.
Und während du auf klassischer Statistik irgendwie.
Die Formeln aufschreiben.
Genau, dann machst du es auf Papier alles und guckst halt, was ja auch oft dann genauer geht.
Du kannst dann halt dein Modell viel besser irgendwie bauen und so.
Aber und du hast halt nur wenige Beispiele oft.
Während bei Machine Learning ist es so, oft, ob das jetzt alles so genau passt oder so.
Das interessiert dich gar nicht, sondern es muss halt dahinter ein gutes Ergebnis dabei rauskommen, das kannst du evaluieren.
Und warum das jetzt nicht.
Statistische Fehlerchen machen.
Ja, das kann man natürlich auch rausargumentiert.
Es geht ja nur darum, ob morgen Wetter, Sonne scheint oder nicht.
Ja, ja, sagen wir so, die Kritik ist teilweise schon berechtigt.
Der muss halt immer mit seinen Daten auch ein bisschen aufpassen, ne stimmen die denn?
Und das Problem bei solchen Dingen ist halt, ihr habt halt meistens Abhängigkeit zwischen einzelnen Merkmalen irgendwie dann doch.
Und ja, also nur eine Mail in den Müll zu schmeißen, weil der jetzt Piep drin vorkommt, ist vielleicht blöd.
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.
Ja.
Genau.
Also, aber wenn man das jetzt evaluiert, also was dabei rauskommt, ist das schon ganz gut.
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.
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.
Und wenn man dann einen Klassifikator macht, der einfach immer sagt, es ist Spam, dann ist er halt eine Accuracy von 99%.
Tja, sieht gut aus, ist aber nicht wirklich sinnvoll, weil das Problem ist, man kommt keine
tiefere Erkenntnis.
Ja, der guten Mails kommt noch durch.
Das heißt, man kriegt gar keine Mail mehr, was so ein bisschen vielleicht nicht der Sinn von Mail ist.
Ja, wäre kontraproduktiv tatsächlich, ja.
Aber sehr halt in dieser, wenn man da.
Kommst du viel Spam?
Ich weiß es ehrlich gesagt nicht.
Es kommt kaum was durch.
Ich habe letztens eine gekammen, die kam super durch.
Das war sehr spannend.
Ja, also ne, weil es.
Ich habe gefragt, ob ich mich nicht sofort vor schnellen Text treffen möchte.
Und noch heute.
Und ich müsste doch einfach nur hier draufklicken.
Wirklich?
Ja, sowas habe ich noch nie bekommen.
Das war das erste Mal seit bestimmt acht Jahren oder sowas, dass sowas in meinem Postfach landete einfach.
Okay, es ist interessant, wie sie das geschafft haben, durch die Spam-Filter durchzukommen.
Aber ja, ich Werbung, genau, ich weiß es nicht genau.
Ich gucke jetzt hier gerade mal in meinen Spam-Folder.
Doch, es kommt jeden Tag.
Ich weiß es jetzt nicht.
Allein heute sehe ich also wahrscheinlich schon so 40, 50 Spam-Mails oder sowas.
Wie viele E-Mails bekommst du eigentlich jeden Tag?
Ich habe das irgendwann mal komplett raussortiert und.
Ich weiß es nicht.
Meine Inbox hier hätte gerade so 5600 ungelesene Mails.
Von 10.000 reduziert.
Ich bekomme relativ schnell voll, aber so, ah, 100, 200 Stück bleibt damit.
Ich hab dir auch die ganzen News-Saint.
Alle die abonniert, alles rausgekickt, alles gelöscht.
Wollte ich alles nicht mehr haben an Dokus.
Ja, also dieses, ja, also, Mail ist problematisch.
Wir bekommen natürlich jeden Tag immer zehnmal Fanpost von Hörern, von diesen unseren wunderschönen Post ab.
Ja, da geht es gerade noch.
Da könnte, das ist okay.
Also wenn ihr möchtet, schreibt unseren Hallo und weiß, man kann das nicht.
Das ist schon okay.
Es gibt ja auch keine, es ist blöde, ist halt irgendwie, es gibt ja auch keine Lösung mehr.
Natürlich kann man sagen, man nimmt einfach keine Mail mehr an oder man liest das nicht oder so ist es auch.
Ihr könntet mal einen Test machen, ihr könntet Piep in das nächste E-Mail, Fan-E-Mail an uns schreiben.
Also einmal das Wort und mal gucken, ob es bei uns im Filter landet.
Also wir sehen das auch.
Also ich gucke zumindest den Filter, muss man mal rein, die du auch.
Also ich schon nicht.
Verlass mich drauf, dass das irgendwie funktioniert.
Und dass die Leute, wenn es irgendwas Wichtiges war, dann halt andere Wege versuchen, mich zu erreichen.
Naja, also glaubst du wirklich, an den Hörer, wenn er uns nicht mehr so gut hat.
Nee, das ist ein bisschen eine Erklärung muss.
Das funktioniert leider nicht.
Ja, ja, ja, ja.
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.
Man würde das jetzt nicht wirklich verwenden, wenn man tatsächlich einen Spam.
Wie groß war jetzt nochmal der Trainingsansatz?
5000 hast du?
5500 im Material.
Vorkategorisierte Nachrichten.
Könnte man noch zusammentragen, wenn man so ein Classifier-Problem selber lösen wollen würde.
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.
Aber, also weil das halt nicht so genau ist.
Ich habe das jetzt mal verglichen, darunter sind noch so irgendwie zwei andere Dinger.
Ich habe einmal einfach nur eine lineare Supportvektor-Maschine genommen, die ist halt ein Stückchen besser.
Und auch nicht viel langsamer, die ist auch sehr schnell.
Und dann habe ich auch nochmal Spacey genommen mit so einem 11D-Convolutional Netz und das ist unfassbar viel langsamer.
Alle alle wieder abgehängt.
Ja, also der Witz ist, also eigentlich natürlich nimmt man nicht naiv Base.
Aber es könnte Situationen geben, in denen das total sinnvoll ist, sowas zu benutzen.
Wie zum Beispiel, also ein Szenario wäre, du möchtest Trainingsdaten generieren.
Ja.
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.
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.
Und das letzte Prozent Genauigkeit interessiert dich nicht.
Oder das letzte Prozent F1-Wert oder so.
Weil es einfach nur darum geht, möglichst schnell viele Trainingsdaten zu erzeugen.
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.
Und da kann halt das, äh, dieses Night-Base-Ding könntest du auch in JavaScript problemlos implementieren.
Das wären ein paar Zahlen mehr, nicht viel mehr Zahlen.
Und es wäre auch sauschnell in JavaScript.
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.
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.
Und benutzt halt zum Sortieren einen Classifier, der halt im Frontend-Code, in JavaScript oder so läuft.
Und für den Fall.
Aber die sind doch hier beim Python-Podcast.
Ja, natürlich.
Also du kannst es halt auch in Python machen.
Ein TypeScript ist ja auch relativ nah dran tatsächlich, ja.
Ja, aber also, sagen wir mal so, das ist halt ein Vorteil, den fast alle diese sogenannten Skriptsprachen halt haben.
Also ich finde das immer so ein bisschen.
Ja, man könnte das auch direkt wieder rausrennen, dann, ne, und irgendeine Datenbank, kleine Bulleitschreiben.
Irreführend, wenn die dann halt so abwärmt als Skriptsprachen, weil das ist halt eine große Stärke.
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.
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.
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
stark optimiert.
Um das zu entwickeln, in der Zeit hätte man einen Algorithmus.
Es ist wirklich, ja, ich meine, ich habe das ja dann auch schon häufig.
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.
Und du kannst es mit C<unk> viel schneller hinkriegen, aber du würdest halt derartig viel mehr Zeit dafür brauchen.
Und die Frage ist, brauchst du es halt so genau und so schnell?
Bist du bereit dafür so viel Zeit zu investieren?
Und die Antwort ist oft nein.
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.
Und das geht.
Und das ist halt, das ist das, was ich eigentlich damit zeigen wollte.
Also, Pre-Labeling von Trainingsdaten.
Ja.
Ja, wenn du, genau.
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.
Du kannst da nicht so richtig gut reingucken.
Natürlich kann man irgendwie das alles evaluieren oder so, aber du verstehst halt auch nicht so wirklich, was das tut.
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.
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.
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.
Ja, also in einem Notebook hast du dann tatsächlich das nochmal verglichen von der Geschwindigkeit her zu den ganzen anderen Verfahren.
Geschwindigkeit, das sind einfach nur die
Präzisionsgrade, Entschuldigung.
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.
Was ist das Precision Recall?
Ja, das ist halt Genauigkeit eben.
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.
Und dann benutzt man den Recall-Wert und.
Man benutzt Precision und Recall.
Und Precision ist halt sozusagen die, also man kann, es gibt vier Fälle, die auftreten können, wenn du jetzt irgendwie Spam klassifizierst.
Es kann halt sein.
Einfach Fehler, Beta-Fehler, ja und nein.
Genau, genau.
Oder bei Machine Learning nennt man das oft True Positive, False Positive, False Negative und True Negative.
Also sozusagen es ist.
Es ist Spam und du hast es als BAM erkannt?
Genau, das wäre es.
Es ist Spam und das ist bei deinem Post-Eingang gelandet.
Das wäre False Negative.
Es ist kein
Spam und du hast es ein Spam.
Es ist kein Spam und du hast es im Post-Eingang, was genau das
ist, was wir hast.
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.
Aber wenn du jetzt mehrere Klassen hättest, müsstest du das halt dann auch nochmal unterscheiden.
Oder bei Multilabel musst du es unterscheiden, weil es dann ja auch sein kann, dass etwas in keiner Klasse liegt oder so.
Aber den Fall haben wir ja gar nicht, wir haben ja nur irgendwie Spam oder Hand.
Und genau, dann ist Precision einfach Anzahl der Dinge, Anzahl der True Positives geteilt durch True Positive plus False Positive.
Also nochmal, True Positive ist eine Mail, die kein Spam ist und die im Posteingang landet.
Nee, True Positive ist es kein Spam und es ist im Posteingang landet.
Habe ich das nicht gesagt?
Oder hast du das gesagt?
Ja, dann ist das.
Okay, dann habe ich es nur falsch verstanden.
Musst du mal druckspulen, nochmal neu hören.
Genau, also es ist alles richtig gelaufen, das True Positive.
False Positive wäre halt irgendwie, es wurde als Spam erkannt, es war aber kein Spam.
Und jetzt addiert man halt die False Positives auf die True Positives.
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.
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.
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.
Recall.
Und Recall ist halt sozusagen das Gleiche, bloß irgendwie mit False Negatives statt True Positives.
Und das beschreibt im Grunde, wie viel von denen, die ich hätte erkennen sollen, habe ich tatsächlich erkannt.
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.
Es gibt so ein paar Machine Learning-Beispiel, für das vielleicht gar nicht so irrelevant ist.
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.
Das sind False-Positives, genau.
Das wäre auch, das ist auch schlimm.
Aber es ist je nach Problem, ist es halt unterschiedlich schlimm, ob jetzt False-Positives oder False-Negatives auftreten.
Ist aber beides natürlich blöd, dass halt einfach unterschiedliche Arten von Folgen.
Also im einen Fall kommt einfach die Mücke dann trotzdem rein und stichtig und im anderen Fall ist vielleicht eine Katze.
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.
Man kann halt darauf optimieren.
Du definierst quasi die Irrtumswahrscheinlichkeit, die du nicht unterschreiten willst und darauf optimierst du dann deinem dein Modell.
Genau, genau.
Man kann sagen, also ich möchte nicht, dass mir so und so viele echte Mails verloren gehen.
Das wäre wahrscheinlich das von dem Swampenclassifier.
Drei klassische Grenze 1%, 2%, 5% oder sowas.
Ja, also die aktuellen Geschichten sind wahrscheinlich alle noch deutlich drunter.
Aber genau, und dann sagt man, okay, dann mit dem anderen Fehler lebt man dann halt.
Also im Fall von Spam-Classifier würde man halt eher damit leben, dass halt ein bisschen Spam durchkommt.
Aber man möchte eigentlich nicht, dass echte Mail irgendwie wegsortiert wird.
Ja, das wäre nicht so gut.
Aber wie gesagt, je nach Anwendung kann das halt unterschiedlich sein.
Es gibt auch Anwendungen, bei denen es andersrum ist.
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.
Also ja, kommt.
Zu dem Spam-Fall noch ganz interessant.
Also um jetzt mal auf das echte Beispiel zurückzukommen, würde man dann vielleicht hingehen und bestimmte Ausnahmekriterien noch hinterherfiltern.
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?
Genau, also natürlich, das ist jetzt nicht ein echtes System oder so, sondern das ist einfach nur zum Beispiel.
Aber ja, natürlich diese ganzen Signale oder Features oder so, das würde man alles mit reinbeziehen eigentlich.
Ich weiß schon, was ich das ausprobieren.
Ja, ja.
Und ich glaube, also mittlerweile, ich weiß jetzt nicht, ich weiß nicht mal, was da verwendet wird.
Also bei Google habe ich jetzt noch, also die Verfahren, die heutzutage verwendet werden, sind alle sehr, sehr schlau mittlerweile.
Die hätten ja schon genug Trainingsdaten, um das noch ein bisschen messen zu machen.
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.
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.
Ja, oder weil wenn ich jetzt zum Beispiel ein nigerianischer Prinz bin, der irgendwie ein Bankkonto in der Schweiz hat, dann
wäre schon doof, wenn die ganzen Leute meine Hilfe versuchen, ich will den Geld schenken und keiner will es haben.
Also ja, die bestehen halt aus so einer globalen Teil und halt aus so einem personalisierten Teil.
Mir passiert das in meinem Nachnamen.
Leute sagen mal, haha, dann verarsche mich nicht.
Ja.
Ja, also.
Volks positive, ja.
Oder?
Was hast du denn?
Das wären Falls Positive, ja.
Es wird als Spam erkannt, weil man eigentlich war es alles in Ordnung, ja.
Genau, und ja,
ich mach mich lustig und finde meinen Humor doof.
Ja.
Ja, also die Dinger funktionieren so.
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.
Ich würde mal einfach sagen, das funktioniert.
Ja.
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.
Halt irgendwie, ja, ein bisschen mehr F1, irgendwie Prozent oder anderthalb oder sowas, aber viel mehr auch nicht.
Also, achso, F1 harmonische Mittel zwischen Precision und Record.
Wir haben das, glaube ich, bei der Textklassifikationsfolge auch schon nochmal alles erzählt.
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.
Also du musst vielleicht auch nochmal deswegen kurz erwähnen, was eine Support-Wegmaschine ist und was Base hier ist.
Ja, richtig.
Also Support-Wectormaschinen sind auch eine Art von Machine Learning-Verfahren, Modellen.
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.
Was das eigentlich tut, ist.
Otto-onale Vektoren auf irgendwelchen Ebenen erzeugen.
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.
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.
Ja, wobei halt, also das wäre auch, also klassischer Back-of-Words-Ansatz, dass halt jedes Wort ist sozusagen eine Dimension.
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.
Also du kannst auch einfach einsetzen, dann wäre es halt binär.
Aber du kannst, also eins, du hast ein Wort das Wort gesehen oder null, du hast das Wort halt nicht gesehen.
Wie viele Dimensionen kannst du dir so vorstellen vor deinem inneren Auge, wenn du versuchst,
sie zu visualisieren?
Das ist nicht schlimm, das muss man sich nicht großartig vorstellen.
Das muss man sich gar nicht vorstellen.
Nee, also was ich mir vorstelle, ist halt irgendwas dreidimensionales vielleicht.
Aber man kann ja sagen, okay, das ist jetzt nicht direkt dreidimensional, sondern halt hunderttausend dimensional oder so.
Ist ja nicht.
Ja, das 4 geht vielleicht auch noch, wenn man sich so einen feststehenden Raum im Laufe des Zeitablaufs wieder sich verändert vorstellt.
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.
Ja, aber immer sich vorzustellen, dass, also sich einen Text als Vektor hinzuschreiben, das kann man sich ja angucken, das ist nicht so schlimm.
Ja, aber da macht man sich nicht mehr so.
Sachen, die man dann macht, ist die Betrachtung, macht man dir dann irgendwie auf so einem Blatt Papier.
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.
Man macht eigentlich nur Spalten von einer Zeile.
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.
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.
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
ischen.
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.
Also, was man dann dann letztendlich macht, ist total simpel, aber es klingt irgendwie, oh, Winkel in einem hunderttausend dimensionalen Raum krass.
Klingt irgendwie voll abgefahren.
Ist aber eigentlich total einfach.
Also, wenn man sich jetzt anguckt, was wirklich passiert.
Und also da ist nichts Wildes dabei.
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.
So ein bisschen wie bei OLS Optimal Squares.
Ja, du meinst Ordinary Least Squares?
Ordinary Lease ein bisschen noch anders, ja.
Ist noch ein bisschen, also, naja, das ist nicht so ganz das gleiche.
Also tatsächlich das Modell, also die Verlustungszummen ist anders.
Und das Modell ist auch anders.
Aber, weil, also das Modell, was bei der Support-Factor-Maschine, obwohl, naja, es ist auch ein lineares Modell.
Also insofern ist es, ja, also es gibt zwischen all diesen linearen Modellen natürlich irgendwelche Verbindungen, aber ja.
Also, aber diese Margin-Maximierung ist schon charakteristisch für Support-Factor-Maschinen, beziehungsweise die Dinger werden halt auch Maximum Margin-Classifier genannt.
Und es gibt halt einen schönen Beweis, der sagt, ja, Margin-Maximierung ist halt auch, bedeutet Maximierung der Generalisierung beim Lernen.
Und das natürlich auch eine sehr schöne Geschichte ist.
Man kann es leider aus diversen technischen Gründen nicht so, also funktioniert es dann doch nicht.
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.
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.
Also vielleicht kann man die Güte erhöhen, indem man so ein bisschen diese Randwerte so außen vor lässt.
Ja, man rechnet halt eine Verlustfunktion aus.
Das kann man ja einfach machen.
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.
Das ist halt das, was passiert.
Ja, okay.
Und am Schluss kommt halt das Ding raus, was tatsächlich irgendwie diese beiden Teile trennt.
Und zwar, und wie Hyper-Ebene hat den größtmöglichen Abstand zwischen diesen beiden Bäumen.
Ja, ich glaube, da kann man vielleicht noch ein bisschen was dran drehen, indem man so diese Grundgesamtheit so ein bisschen manipuliert.
Aber ja.
Also sag mal so, das funktioniert halt, das funktioniert sehr gut.
Es ist halt auch so, irgendwie in diesem hochdimensionalen, da ist viel Platz.
Deswegen funktionieren lineare Modelle da so sehr schön, weil man kann die halt also durchlegen.
Wenn das weniger dimensional wird, dann geht das halt linear nicht mehr.
Da muss das alles irgendwie gebogen sein, aber das wird alles viel schwieriger.
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.
Gut, klar, natürlich, das kann auch immer sein.
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.
Da gab es halt eben bekannte Arbeit von Thorsten Joachim 1997 drüber.
Und seitdem habe ich jedenfalls nicht wirklich substanzielle Fortschritte gesehen.
Also, gut, doch.
Also, wenn man sagt, Word-Embeddings sind halt nochmal ein ordentlicher Fortschritt gewesen.
Aber das ist ja im Grunde nur eine andere Art, irgendwie Texte darzustellen.
Ja, das ist halt schon besser als Back of Words, aber wird dann halt auch nochmal irgendwie ein bisschen besser.
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.
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.
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.
Du musst halt einmal nochmal zeigen, was TF-IDF ist.
Ja, ja, genau.
Das ist halt eben, wie charakteristisch ist ein Wort eigentlich sozusagen.
Für die Kategorie.
Ja, genau.
Kann man sich halt auch ausrechnen.
Darf man natürlich auf dem Trainingsab machen, aber genau.
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.
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.
Ich weiß nicht, wie viel man kann man sich aussuchen, wie viele Dimensionen man verwenden möchte.
Und jedes Wort ist dann halt ein Vektor da drin.
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.
Hier ist dein Schild.
Ja, und das funktioniert sehr gut und das hat halt nochmal irgendwie Arbeit mit Text irgendwie genauer gemacht, aber so ein bisschen, ne?
Aber dass es wirklich da jetzt substanzielle Verbesserungen gegeben hätte, habe ich jetzt also seit 97 schon eine Weile her.
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.
Also, was wir das übersehen haben, bitte schicken.
Bis vor kurzem.
Und ja, das ist vielleicht auch noch eine ganze Sache, das möchte ich unbedingt mal selber ausprobieren.
Ach, das ist auch vielleicht, genau, wir haben ja mit Nico da diese Episode zu Textklassifikation gemacht.
Und der hat jetzt in seinem Podcast Fechttiefen auch so eine Miniserie zu Natural Language Processing gemacht.
Und da, äh, das fand ich, da fand ich einige Sendungen sehr gut.
Unter anderem die, wo er über diese neuen Modelle spricht, irgendwie.
Startup das da irgendwie mit.
Genau, genau.
Und halt auch die Folge bei Spacey fand ich sehr gut.
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.
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.
Ich habe in NLTK mal ein paar End-Gramme über Pereriporter mit ein paar Kindern.
Die haben das
sehr gefreut.
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.
Und aber Spaceyverse.
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.
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.
Da gab es ja auch irgendwie mit Deep Learning halt so eine
ImageNet kennt ihr noch.
Ja.
Hatten wir auch schon mal vorgestellt.
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?
Very Large Data, irgendwie Image, ich weiß nicht mehr genau.
Hatten wir auch überall erwähnt.
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.
Und 2013 hat Alex nett irgendwie dann diese Challenge gewonnen.
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.
Und ja, also da ist etwas passiert, was halt irgendwie, ja, und dann Jahr für Jahr danach ist es immer besser geworden.
Und also 2013 ist halt substanziell der Fehler irgendwie runtergegangen.
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.
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.
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.
Gut, also ich meine, da sind auch Feasebilder dabei, sowas wie unterschiedliche Hunderassen und sowas.
Man sieht nur so einen Hinterteil mit so einem Schwanz und weiß dann nicht, ist es eine Katze oder sonst irgendwas.
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.
Und zwar ist das halt in sehr kurzer Zeit passiert, sozusagen, was ja auch sehr beeindruckend.
Also da ist irgendwas passiert, was halt das ganze Feld sozusagen sehr stark in Bewegung gesetzt hat.
Und so etwas ähnliches sehen wir jetzt gerade bei NLP-Geschichten halt auch.
Das war mir jetzt bis vor eben kurz auch gar nicht so richtig klar, dass das gerade passiert.
Deutsch.
Ja.
Deutsch ist halt immer ein bisschen doof, ne?
Das ist eine Sprache, für die sich irgendwie niemand so richtig interessiert.
Also, ja, aber da genau gibt es wohl auch jemanden, es gibt halt diese großen Sprachmodelle, irgendwie Bird, irgendwie XLnet, LGBT2, ähm Bird.
Ja, wir werden Sesamstraße, wie war das?
Muppet Show, glaube ich, oder?
Muppet Show?
Oder Sesamstraße, ja, ich weiß nicht.
Also diesen Spaß.
Wahrscheinlich.
Und da werden halt so große Transformer-Modelle trainiert.
Und der Witz daran ist, ich habe mich vorher, man muss sich vorstellen, ich hab das schon mitgekriegt, dass das passiert.
Und ich dachte mir so, ja warum trainiert man denn so riesige Modelle, was soll denn das?
Also es ist auch sehr teuer und auch verbrennt unfassbar viel Energie und Taktzyklen und so.
Warum macht man das denn?
Jetzt, um ein bisschen besser vorherzusagen, was das nächste Wort im Satz ist.
Ja gut, ist schon ein interessantes Problem, aber warum wirft man da so viel Geld drauf und so viele Ressourcen?
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.
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.
Und kann dann halt irgendwie in einem konkreten Anwendungsfall halt sehr, sehr gut sein.
Und auch da, ich glaube auch da ist den Leuten noch nicht so richtig bewusst, was das eigentlich bedeutet.
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.
Das halt jetzt, also ja, eben, mein Beispiel dafür war halt irgendwie eigentlich, dass irgendwie Flaschen-Pfandautomaten da so schlecht sind.
Das muss eigentlich nicht sein, das könnte alles viel besser gehen.
Und das gilt im Grunde für alle Probleme, wo man irgendwie visuell was erkennen können möchte.
Das ist theoretisch durch.
Jetzt muss man es eigentlich nur praktisch umsetzen.
Ja, mir raut schon ein bisschen davon, ja, dieser Mensch darf in die Stadt.
Nein, der darf nicht in die Stadt.
Ja, dieser Mensch darf da und.
Leider könnte es auch sein, dass wir jetzt.
Diese Ampel bleibt für dich rot.
Ja.
Gib doch nicht mal die guten Tipps direkt weiter.
Ja, es ist nicht ganz unproblematisch, das stimmt auch.
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.
Dann kann man da unterschiedliche Prediction-Hats draufsetzen für unterschiedliche Probleme.
Und man nimmt halt sozusagen irgendwie, aber es sind halt alles Sprachprobleme.
Also auch so ein Textklassifikationsproblem kann man halt nehmen.
Jagt das halt irgendwie, benutzt halt zum Beispiel Bird, als um das halt irgendwie sozusagen um diese, diese, diese.
Das ist ein Prediction-Head.
Ja, genau.
Das ist halt im Grunde die Dinger übersetzen das ja irgendwie in eine interne Repräsentation.
Und dann übersetzen sie sich wieder zurück in das, was du haben willst.
Und du kannst das austauschen.
Du kannst halt sagen, okay, ich möchte, dass mein Language-Modell mir zum Beispiel Sätze generiert.
Oder ich möchte, dass es halt Textklassifikation macht.
Oder ich möchte, dass es irgendwie Named Entity Recognition macht oder irgendwas.
Also sozusagen Namen oder Orte findet in Texten oder sowas.
Die gilt ja direkt die Kasse, hör mal hin.
Oder Fragen beantworten kann oder solche Sachen.
Und du kannst das gleiche vortrainierte Modell nehmen für all diese unterschiedlichen Tasks.
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.
Kannst du dir nicht leisten wahrscheinlich.
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.
Du Kasse.
Genau.
Und das würde ich gerne noch ausprobieren, das habe ich jetzt noch nicht geschafft, aber das mache ich bestimmt nichts irgendwann.
Und dann, aber es gibt schon Papers dazu jetzt.
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.
Und da waren, also gegenüber diesen guten Zahlen von 97 Verbesserungen von so 5% im F1-Wert oder sowas, was Wahnsinn ist.
Also das ist halt richtig, richtig viel.
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.
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.
Und das ist natürlich ein Hinweis darauf, dass da noch viel.
Und da das jetzt, das sind die ersten Ergebnisse, ne?
Da kann man ja dann noch optimieren.
Das heißt, das wird sehr wahrscheinlich noch alles noch viel besser werden.
Und also man hat auf jeden Fall jetzt einen Ansatzpunkt, wo man wieder einen Hebel reinsetzen kann.
Ja, das heißt, wir kriegen jetzt wahrscheinlich auch was Probleme angeht, wo man mit Sprache zu tun hat, irgendwie deutlich bessere Ergebnisse.
Und das betrifft dann eben solche Sachen wie Textklassifikationen.
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.
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.
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.
Und das ist natürlich schon eine super interessante Geschichte.
Ja, genau.
Also da machen wir auch bestimmt noch Sachen zu.
Das wird noch cool.
Das wird's auch cool.
Ich bin schon mal gespannt, mal diese Dinger auszuhören.
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.
Also, also auch, ne, das war jetzt Stanford irgendwie ImageNet und dann, ich weiß jetzt nicht, wovon das Dings Sprachnetz herkam, aber es gibt.
Die Player da momentan sind, Google, Facebook, also Facebook ist Excelnet, Google ist Bird, dann genau, OpenAI hat GPT2 gemacht.
Ich weiß nicht so.
Aber die hat ja die großen Plan.
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.
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.
Alter Ego heißt das Projekt,
glaube ich.
Ja, aber da bin ich mal sehr skeptisch, wenn Leute solche Sachen behaupten.
Betty Ford Clinik?
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.
Auf der anderen Seite, aber man, also Menschen nicht gut können.
Und Menschen sind ziemlich gut.
Naja, aber vielleicht können die sie nicht mehr.
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.
Ich weiß es nicht so genau, aber.
Und wenn
die das schon nicht können, ja, wie soll das ein Modell hinkriegen?
Ja, aber die haben halt so ein Ding auf dem Gesicht, ne?
Also das ist ja interessant, guckt es mal an.
Alter Ego heißt das mit MIT-Programm.
Okay, muss ich mir mal anschauen.
Ist wirklich spannend.
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.
Das war Spacey.
Das war Spacey gut.
Das war so ein neuronales Netz.
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.
Macht ja natürlich auch viel kompliziertere Sachen.
Aber das ist halt auch so ein Ding.
Wenn die Daten das halt nicht hergeben und an der Stelle tun sie es wahrscheinlich nicht, dann nützt einem das halt nichts.
Sondern man braucht halt dann auch entsprechend Trainingsdaten, um halt diese ganzen Parameter dieses Modell halt halt auch ordentlich zu finden oder so.
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.
Wobei mit dem Dataset.
Naja.
Aber, aber, ja.
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.
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.
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.
Zumindest mal implementiert zu haben und zu sehen, ob man nicht irgendwo fundamental was kaputt macht oder was nicht verstanden hat.
Und für sowas, ja, ist es eigentlich ganz gut.
Cool.
Ja, ich glaube, damit sind wir eigentlich schon praktisch mit der Geschichte.
Ja, na, Eve-Base haben wir erklärt.
Fehlt eigentlich noch der Pick der Woche und schöne Wünsche fürs.
Ja.
Ja, leider ist erst Montag, Wochenende.
Aber.
Pick Picks.
Vielleicht ist es ja bei euch.
Ja, das wird auch noch ein bisschen dauern, bis die Sendung nicht.
Bis die Sendung raus ist.
Oh ja, wir wissen noch nicht, genau was sie erscheinen.
Ja, was ist denn bei deinem Pick der Woche?
Du hast ja auch was Schönes rausgesucht.
Genau, ist mir letztens irgendwie bei dem Weg gelaufen.
ISOWT.
Und zwar geht es dabei darum, dass halt.
Importe sortieren.
Ja.
Man kann ja auch sagen.
Man kann ja nicht aktuale Sachen machen, man automatisiert seine Importe.
Eine Standardform bringen ja mit Black und so.
Aber das ändert jetzt zum Beispiel die Reihenfolge von Importen halt nicht.
Und wenn man das komisch gemacht hat, dann.
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.
Genau.
Aber wenn man jetzt viele Imports irgendwie hat, dann ist es auch vielleicht nicht schlecht, da eine Struktur drin zu haben.
Und da guckt halt Black höchstens, dass die Zeilen nicht zu lang werden oder so.
Aber halt nicht, wie die sortiert sind, weil das spielt halt keine Rolle für Black Herzen.
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.
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.
Man kann das Ding auch relativ umfangreich konfigurieren.
Und ich fand einfach nett zu sehen, dass es da überhaupt irgendwie eine Möglichkeit gibt, das automatisch zu machen.
Ich glaube, da gab es sogar so einen Hook in Black oder sowas.
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.
Und dann haben sie gesagt, ah, ne, vielleicht nicht, gibt doch Icehort.
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.
Daraufhin hat der Autor von icewort da geschrieben, ja, ich sehe das auch alles irgendwie, dass das problematisch ist.
Und ich arbeite gerade an einer Black-Isewort-Implementation, die diese Probleme dann nicht hat.
Also falls ihr mittelgroße oder größere Kopf automatisch sortieren wollt mit euren Modulen, guckt euch das doch mal an.
Ja, also mein Pick der Woche war PP-Top.
Das macht sowas wie Python-Prozesse, anzeigbar wie HTOP, wenn ihr das irgendwie kennt oder so.
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.
Macht das das mit Python-Prozessen, das ist relativ cool.
Und ja, kann euch so eine Inspektion geben.
Was macht denn der Prozess eigentlich gerade?
Fand ich ganz interessant, um mal so ein bisschen rumzuspielen, mal ein bisschen zu debuggen und zu gucken, was passiert denn da eigentlich.
Klingt gut, muss ich mal ausprobieren.
Ja.
Ja, so.
Da haben wir es quasi fast heute wieder geschafft, würde ich sagen.
Ja, also falls jemand von euch gezählt hat, wie auf ihr Penis gezählt haben, kriegt natürlich eine Folge wünschen.
Noch toller wäre es natürlich, wenn ihr einen Algorithmus schreibt, der irgendwie Sprache analysiert und genau zeigt, wo das denn gewesen ist.
Wir wollen euch ja mal ein bisschen motivieren zu meinen Projekten, wer weiß.
Ja, danke, dass ihr wieder zugehört habt.
Bleibt uns gewogen und schaltet wieder rein.
Ja, wie immer auch seid.
Schönen Tag, schönen Morgen, Abend, Acht.
Bis zum nächsten Mal.
Bis dann.
Jo.
Tschüss.
Tschüss.