Transcript: Naive Bayes
Full episode transcript. Timestamps refer to the audio playback.
Ja, hallo liebe Hörerinnen und Hörer. Wir kommen 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 zwar 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 einsteigermäßiges mehr zu machen.
Und dann habe ich mir kurz Jochen Trepo 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, ja, Kürze so hinzubekommen.
Ja, da kann man auf jeden Fall wieder sehen, Python kann das richtig gut. Aber wenn ihr wirklich ein Einstiegsbeispiel haben wollt, also in unserer nächsten Folge haben wir wieder, glaube ich, was vor, in der übernächsten, wirklich für Einfänger nochmal.
Da machen wir mal so wirklich Einsteiger-Geschichten,
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, so ganz super einsteigerfreundlich ist es
vielleicht nicht. Aber es ist 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.
dass wir an so Dingen gesehen haben.
Also wir waren auf der Frostcourt, also ich noch ganz kurz
und du ein bisschen länger.
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?
Deep Learning Workshop, ja genau.
Ja, dazu gab es auch einen Vortrag, den habe ich auch geguckt.
Genau, ja.
Ich habe auch so wahnsinnig
viele Talks, habe ich gar nicht
angeguckt.
Du hast genetzt werden.
Aber ansonsten, doch, ja, so ein paar Sachen
habe ich auch schon gesehen, das stimmt.
Ja, aber es war sehr interessant, es war viel los.
Und es gab eine ganz tolle Kinderbetreuung.
Ja, wenn ich das mal vorher gewusst hätte,
ist mir gar nicht so aufgefallen.
Aber es gab einen riesen Hüpfbock und so.
Ja, hätte man...
Hätten die Mädels Spaß haben können.
Ja, genau.
Was, also, genau, dieser Deep Learning-Vortrag
war jetzt, für mich war der 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
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 hatten wir auch schon mal gemacht. Deswegen fand ich das auch
interessant, ob das Leute vielleicht aus einem Ahnblickwinkel
etwas besser darstellen
oder was die da so zu erzählen.
Ja, also die haben da
irgendwie bessere Netze verwendet.
Also die Zahlen waren hinterher besser.
Das war tatsächlich ganz cool zu sehen und da muss ich
mal gucken, ob ich da nicht vielleicht einfach noch mal so ein bisschen
ein paar stärkere Modelle mit reinbauen.
Aber so ansonsten
war das jetzt
für mich jetzt gar nicht, also
war jetzt nicht so viel
Neues dabei.
Ja, und wir haben Post bekommen.
Nette Post. Ah, genau, natürlich.
Ein ganz schöner Brief von Thorsten. Vielen Dank
für deinen super netten Brief. Ja, dankeschön.
Wir haben es irgendwie nicht so richtig geschafft, darauf zu antworten, weil
gerade viel Stress war. Es ist immer noch viel Stress.
Hier hört nicht auf.
Ja, aber trotzdem hat uns sehr gefreut und genau, 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 da eigentlich auch hier auch mal kurz...
Ja, Jocken, sag doch mal bitte, was ist denn mit einem Generator?
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 dann schlecht, weil dann würde 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, wie vorher?
Ja, also bei The Dict ist es
irgendwie ab Python 3 so, dass Items
einen
Generator zurückliefert, während
bei Python 2, glaube ich,
Iter-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.
Bei Python 2 musste man X-Range.
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
das 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 eine kleine Datenstruktur, wo verschiedene Elemente drinstehen,
über die man sowas kann wie iterieren.
Das heißt, man geht über jedes einzelne Listen-Element durch
und kann dann damit Dinge anstellen.
Der große Unterschied ist im Grunde, dass die Liste halt schon fertig ist.
Also alle Elemente der Liste sind halt 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?
Dann gibt man das nächste Ding oder so.
Und intern sieht das dann halt so aus,
dass eine Funktion meistens dann irgendwas
rausgildet. Also nicht
Return, sondern irgendwie
das Ergebnis. Das heißt, sie merkt sich, wo sie gerade war.
Ja, genau. Und
gildet 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, weiß ich nicht, 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.
ja, also es ist halt. Entsprechend auch schneller?
Ja? Warum ist denn der Generator
so viel schneller als die Liste?
Ja, das kommt drauf an. Also das würde ich jetzt so nicht sagen, dass
ein Generator immer schneller ist. Das kann man so nicht sagen.
Okay. Ja, 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 passt oder so, man möchte
halt möglicherweise, also das wäre vielleicht 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
damit 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
SACS Parser. Das kennt wahrscheinlich auch keiner.
Was ist denn bitte ein SACS Parser?
Ach, warte, warte.
Das ist doch mal das Webseiten-Strukturelement
von den HTML.
ObjectModel, 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 Hauptspeicher 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
parsed das Event basiert 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 halt nicht komplett im Hauptspeicher liegen,
sondern das wird dann halt sozusagen iterativ geparsed
und damit kann man halt Sachen parsen, die halt so groß
sind. Ich meine,
man braucht, wenn man das, wenn man
XML komplett parsed, wahrscheinlich das
den zwei-, drei-, vierfachen Speicher
von dem, wenn es auf der Platte liegt,
im Hauptspeicher. Und wenn jetzt 2 GB
Ding auf der Platte liegen hat, dann
hat man unter Umständen ein Problem.
Früher war das schlimmer. Früher als
32-Bit-Systeme noch,
da war schnell Ende.
Ein V-Speicher voll. Ja, war halt mit 3 GB
4, ja, das ist halt Hauptspeicher voll.
Ohm war out of mana, ne?
Ja.
Mittlerweile kann man ja auch viele Hauptspeicher
einstecken. Begegnet ist einem wahrscheinlich
eher selten, dass man irgendwie
den Hauptspeicher ausgeht, wenn man irgendwas passt.
Aber selbst das 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 den 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 Hauptspeicher.
Und solche Arten von Fällen gibt es natürlich viele,
wo man irgendwie Ströme von Daten hat.
Auch wenn man sich an irgendwelche APIs dranhängt,
Dann kriegt man halt da irgendwie
Reppchen weiter, irgendwelche Requests.
Genau, dann
ja, für all diese Dinge ist das 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-Protokoll beziehungsweise 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 runden Klammern
statt Eckigen und dann
hat man das halt auch in einer Zeile irgendwie hingeschrieben,
was halt auch unter Umständen sehr praktisch ist.
Aha, das heißt also, wenn ich eine LIS-Kompräension
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
rausgilden kann, also sozusagen da passiert
ja folgendes,
also wenn normalerweise eine Funktion retornt, dann ist die Funktion
ja fertig, aber
wenn man etwas rausgildet,
dann wird die Funktion sozusagen nur unterbrochen,
bis halt sozusagen das nächste Ergebnis
daraus geholt 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 so was
haben wie einen WebSocker-Server oder irgendwie einen Server,
der halt Sachen annimmt und wieder Sachen
zurückschickt. Und das halt...
Auch das macht einen Generator schön.
Das wäre dann jetzt nicht mehr wirklich Generator,
sondern das wäre dann irgendwie so Co-Routine.
Aber das kann man da machen.
Und ja, sehr nett.
Oh, was mir auch dabei 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 sage mal,
also keine Ahnung, was habe ich da hingeschrieben?
So bei 30 Byte oder so, ich weiß es nicht mehr genau.
Also vielleicht auch ein bisschen weniger,
bis wir die genauen Zahlen 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
braucht 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-Programmierer werden sagen,
völlig ineffektiv wollen wir eigentlich. Ja, super
ineffizient, sondern halt irgendwie das mal
3 oder sowas. Oder 4.
Was
immer noch ganz okay ist, aber
das macht natürlich schon einen großen Unterschied, wenn man
jetzt Listen mit
in 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 das 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 ein NumPy,
da geht das auch.
NumPy ist natürlich jetzt nicht in der Standardbibliothek, aber
so und jetzt habe ich halt nachgeguckt,
wie viel wir brauchen, das ist eine Liste und da habe ich
eine Liste mit 100 Millionen Dingern genommen
oder so und das hat dann nur noch irgendwie
860, knapp
68 Megabyte 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 bis zum nächsten Mal recherchieren,
woran das liegt, aber das ist ja
super, also das ist viel weniger
als das früher war.
Wie vielleicht das früher so im Bereich
dann viermal so viel oder deutlich mehr.
Ja, da hätte ich ja eher erwartet, dass das dann so
drei Gigabyte werden oder so.
Weil, ja.
Ein Python-Spartplatz.
Irgendjemand hat das vernünftig implementiert.
Irgendwas ist da optimiert worden.
Vielleicht weiß das ja auch jemand.
Ja, Generatoren, liebe Männer.
ChapterMark ist Zeit jetzt, glaube ich, für.
Ja.
Oh, ich habe gerade zufällig mein Handy gestaut.
Herzlich 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 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 Podcasts.
Also ich höre auch was zum Bilden,
aber manchmal auch einfach Eishockey-Short in den News.
Wenn ich einmal kurz Werbung machen darf.
Ah, okay.
falls man sich noch für Eishockey interessiert,
weil es nicht so wahrscheinlich ist,
aber vielleicht gibt es ja Menschen.
Ja, tolles Ding, 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 über einen der Sponsoren aufgeregt,
der war nicht so ganz...
Der hat so ein paar komische Sachen gepostet.
Das haben die investigativen Journalisten
von John Nissen aufgedeckt.
Mal gucken, ob wir nächstes Jahr noch in der Liga
und in den Saisen kommen werden.
Tja, genau, ja, nee, ich höre auch noch andere Podcasts, aber auch viel Zeugs und das, genau, da gab es eine Episode mit Andrew Godwin, der, das ist auch ein bekannter Django-Entwickler, hat viel erzählt, der von dem schreibt das ganze Migrations-Framework, was jetzt, was bei 1.7, glaube ich, in Django reingekommen ist. Früher hieß es South.
Was musst du denn früher machen, bevor man Dango Migrations
machen konnte? Naja, da gab es halt drei,
ich glaube, es gab drei unterschiedliche Systeme. Es gab
eins von Andrew Godwin, das ist halt das Haus.
Es gab eins von Simon Willison
und es gab noch eins von
Rusty Chris McGee oder so.
Das wird sich deutlich mehr Arbeit gewiesen
früher. Ja, die meisten Leute haben dann schon
das Haus verwendet irgendwie.
Insofern,
was ich nicht wusste, ist, dass es komplett reimplementiert worden ist,
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, aber das ist doch nicht so alles lernt, wenn man irgendwie zwei Jahre weiter ist.
Oh, nee, so macht man das.
Was habe ich denn da
geschrieben? So ein Unsinn.
Naja, jedenfalls, der macht
momentan beschäftigt sich ja ganz viel mit
ja, 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
Frameworks sind das nicht, Flask ist das auch nicht.
Bei Django ist es halt aber schwierig,
das zu ändern, weil das einfach so viel
Zwerg ist und
weil halt die API, also die
Whiskey-API
gibt es halt nicht her.
Es gibt Prost.
Die wollte ich schon immer noch bringen.
Er hatte da vorher
ein Projekt Django Channels
oder das gibt es natürlich immer noch, er ist dann halt
irgendwann hat die Maintenance 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 ich bin mal gespannt. Das ermöglicht ja auf einmal ungeahnte
weiten... 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 auch lange dauern, aber
dass halt alles asynchron ist von
so einmal, dass man
Websocket-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 vielleicht
und dass man das alles auch wieder asynchron
zusammen aggregieren kann und dann nicht
das synchron hintereinander machen muss, wie das
momentan passiert. Und dann hat man halt irgendwie 200
Abfragen, die man irgendwo hinmacht, dann macht man
vielleicht 100 Statements und dann fragt man
noch ein paar APIs und dann 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 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, 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. Manchmal kommen 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 startet. 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. Eventbrite kennt
ihr doch, oder? Ja, kennt ihr.
Das ist, denke ich, auch eine 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.
Oh Gott, oh Gott, oh Gott.
Dann musst du 30 Sekunden vorher wissen, was passiert.
Da kommt ein Sturm.
Das Problem ist, du kannst es halt nicht optimieren.
Wenn die Importe so lange dauern,
dann dauert es halt so lange, da kannst du nicht viel machen.
Das ist natürlich schon bitter.
Man müsste welche rausschmeißen eigentlich.
Ja, aber...
Dann geht es funktioniert, geht es verloren.
Das geht ja auch nicht.
Ja, also hoffentlich...
Ja, das muss man schon sagen.
Ja, vielleicht dann doch irgendwie an der Zeit
dann mal so den monolithischen Ansatz irgendwie.
Es gibt ja mehrere Optionen, wie man sowas ausmisten kann.
Irgendwo ab und zu mal ein paar Sachen abfackeln,
gucken, was noch stehen bleibt.
Oder mal wirklich mühevoll rangehen, alles neu umsortieren.
Das ist halt die Frage.
Wie lange dauert so ein Refactoring, wenn du dann komplett auf...
Du kannst nicht viel machen.
Also Refactoring hilft dir auch nicht.
Ja, aber alle Features erstmal rausschmeißen.
Ja gut, okay, die ganzen Features streichen, aber das ist nicht...
Ja, aber du könntest ja zum Beispiel, kannst du 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, so bei Django ist es so, da
werden deine Installed-Apps, die werden alle
importiert.
Du kannst das, 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, falls jetzt noch jemand zuhört, der
naja, wer ist das? Achso, ja genau.
Moment, wir sind noch nicht ganz durch mit
den
Geschichten. Was haben
wir denn noch?
Ne, oder sind wir doch durch? Hattest du noch irgendwas?
Nö, gerade für jetzt. Alles klar,
okay, dann sind wir doch mit dem News-Teil durch. Alles klar.
Ja, ja, ja. Okay.
Dann mache ich hier mal
eine Kapitelmarke zu
ja,
zum eigentlichen
Thema.
Ja, wir wollten natürlich jetzt
erklären, was naiv-based denn ist.
Was macht das denn? Wofür braucht man das denn?
Und erst mal ist das, glaube ich, so eine
Beschreibung einfach nur für so ein statistisches...
Ja, also die
Bayes-Riegel kennt man ja vielleicht.
Kennt man das?
Ja, warte, lass mich nochmal.
Ja, das geht ja um 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 Base Theorem ist eigentlich einfach nur…
Wir gucken jetzt nicht wirklich bei Wikipedia nach und lesen Wikipedia vor, oder?
Nein, dachte ich.
Okay, mit.
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.
Dafür gibt es halt diese Regel, die das dann sagt, wie das geht.
Ja, nur immer als Beispiel, was kann man sich dann...
Also ihr habt jetzt ein Kartenspiel oder sowas, ja, die Wahrscheinlichkeit dafür, dass ihr einen König zieht.
Wie viel ist das denn? 4,52 oder so, ne?
Und dann willst du halt wissen,
wie hoch die Wahrscheinlichkeit ist, dass du ein Bild siehst.
Und dann hast du wie viel?
Dreimal, 4,52.
Und dann kannst du dir überlegen,
ja, die Wahrscheinlichkeit, dass du ein König siehst
und es ein Bild ist.
Dann hast du die Wahrscheinlichkeit, dass es ein Bild ist
und die Wahrscheinlichkeit, dass es ein König ist und andersrum.
Ja.
Aber die Wahrscheinlichkeit, dass es ein Bild ist
und die Bedingung, dass es ein König ist, ist halt 1,
weil jeder König 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. Das ist ja das, was
die Statistiker so gerne tun mit Technik.
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 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, wenn ich jetzt diese Nachricht mit den Worten gesehen habe, welche Wahrscheinlichkeit habe ich denn jetzt?
Ja, das ist das Gute an anderen, deswegen ist das ja auch naiv, weil man tut so, als wäre 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.
Man kann auch Idiot-Based sagen oder so.
Ja, aber es funktioniert tatsächlich relativ gut.
Genau, das ist ja auch irgendwie sozusagen der erste funktionierende Ansatz gewesen,
um irgendwie mit diesem Spam-Ding fertig zu werden.
2004, Programme, 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
eher, ja.
Also Bildklassifikation, so einfache Dinge,
ja, nein, bist du drauf, nicht?
Ist mein Gesicht drauf, nicht? Kann ich nicht mit Base 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 das 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 hat man
noch Funktionen, die man irgendwie aufruft und
das war's.
Also ihr seht, 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.
Also wenn man das hinkriegt, wenn man das
versteht, dann hat man schon
ganz viel.
Das heißt, anhand Python lernen, ein bisschen anhand
von Jochens Beispiel, mit dem man auch
Machine Learning machen kann. Und zwar
ein Notebook hast du auch auf deinem GitHub?
Genau, das kann ich dann auch in den
Show Notes verlinken, wo da halt dieses Notebook drin ist.
und sich das mal angucken kann.
Ich benutze ja einfach irgendwie, es gibt so
ein SMS-Spam-
Dataset, wobei Kekkel,
das habe ich mir runtergeladen,
irgendwie auf meinen S3 gepackt und
das Notebook zieht sich das davon einfach
und lädt das runter und dann hat man das.
Das ist nicht so viel, das sind irgendwie, warte,
lass mich mal gerade gucken. Ich werde die Stadt, das ist dieses Ding hier auch
einfach mal erstmal neu.
Okay.
Lade das mal runter, es sind irgendwie nur so 200
Kilowatt. Okay.
So.
Dann pausen wir das mal so.
Okay, wie viele Nachrichten haben wir denn da drin?
5.500.
Und davon sind, ich weiß jetzt gar nicht genau, wie viele.
1.500 sind, ah nee, ich weiß nicht, ihr müsst nachgucken.
Also es ist deutlich mehr Hemm als Spam, aber...
Ein Schinken?
Ja, genau.
Aber es ist halt
eigentlich nicht viele Datenpunkte
oder Beobachtungen, wenn man
heutige Maßstäbe anlegt, aber
es ist auf jeden Fall ein Datastat, wenn man schon
ein bisschen was machen kann und es tut halt
auch nicht weh, wenn man es irgendwo hinrotaliert.
Du könntest ja auch erstmal 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,
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,
es 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. Oder Spam.
Ja, aber vielleicht möchte man das ja aus welchen Gründen auch immer irgendwie feiner unterteilen
und die Notifikationen sehen, die dich irgendwie dahin latschen sollen,
doch mal wieder ein bisschen Zeit 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, weil das da rausfällt, weil Naivbase halt einfach sagt, nö, ich will jetzt nur eins haben.
Also das wäre jetzt, also das, was
in dem Roadbook drinsteht,
da fällt halt hinterher eine Kategorie
bei raus. Man könnte es auch so
umbauen, dass es Multilabel kann,
aber ist halt nicht so.
Wir machen ja das Anfängerbeispiel.
Wir machen jetzt ein einfaches Beispiel.
Also, genau.
So, 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 Test,
der Rest ist Training, also 75%.
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 dem ist einfach die bedingte Wahrscheinlichkeit
vorhersagt, dass es Wörter enthält,
die Spam sind, unter der Bindung
könnte Spam sein.
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.
Und guckt, ob Penis drin steht.
Ja genau, teilt
das, teilt
irgendwie diese SMS halt auf
in die Wörter, aus denen sie besteht.
Und dann kommt 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, kommt 50
mal Penis vor und in 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 drin vorkommt, ist Spam ist. Und
daraus hat man jetzt auch 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
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.
Man geht halt über alle Dokumente, merkt sich
okay, wie viel
Wörter habe ich
denn jetzt bisher gesehen für die
Klasse
Spam oder Ham und zählt
das dann halt hoch, je nachdem, ob das...
Haben wir heute schon mal Penis gesagt?
Entschuldige, ich bin mal albern.
Oh, wir fliegen bei iTunes raus, Mann.
Oh, wir sind auf iTunes? Na gut.
Keine Ahnung. Ne, ich glaube nicht, aber...
Ne, wie Viagra.
Das könnte 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 will einen Spam.
Nee, das ist ein altes SMS-Spam.
Okay, wir denken euch gerade ab davon.
Ja, also, das, 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 zählt da halt hoch,
wie viele Wörter hat man in dieser 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 10 Mal Penis gesehen habe und ich habe insgesamt 1000 Wörter gesehen, unterschiedliche Wörter, dann ist die Wahrscheinlichkeit, dass es Spam ist, wenn ich jetzt das Wort Penis sehe, ist es halt, was ist das dann, ein Prozent oder sowas.
Ich habe jetzt nicht genau mitgerechnet.
Ja, es ist immer blöd, so was, 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.
Ja, da musst du nochmal von vorne anfangen.
Ja.
Was man eigentlich...
Du wusstest, dass du jetzt Pfarrer warst?
Ja, ja, natürlich. Landpfarrer.
Dazu kann ich was erzählen.
Mit der Fibreza
war ich ja offenbar keine Ahnung von, aber
nee, das ist eine ganz, ganz
eine ultra interessante Geschichte.
Das
in, also
in
England gab es
halt diese Kaste der Landfahrer, die waren reich.
Das, wenn man
zum Beispiel, na, wie heißt das?
Eine Abtei,
ein Gutshof.
Priorei, wenn es darum geht.
Wie hieß
dieses Buch nochmal?
Pride and Prejudice.
Genau.
Das spielt ja so ein bisschen
Leute Adelig und so.
Ja, eigentlich ein gutes Buch, kann ich empfehlen.
Und
dann kommt da plötzlich dieser Pfarrer,
Wie kann das sein? Das gehört doch eigentlich gar nicht dazu.
Doch, doch, doch, die spielten da mit.
Das war eine Klasse von Leuten, die relativ viel verdient haben
für die damaligen Verhältnisse.
Und sie mussten praktisch nichts tun dafür.
Voll gut.
Ab und zu mal vor der Kanzel herunterfliegen.
Und es gab sehr viele davon.
Und das gab denen Zeit, sich mit allen möglichen abseitigen,
in alle möglichen Richtungen ihren Interessen nachzugehen.
Das war schon ein bisschen Nachbrudertakt, oder?
Ich stelle mir gerade so, dass jemand aussieht wie ich
mit so einem großen Fass am Bauch.
Nee, das ist deutlich später.
Aber es gibt Leute, die tatsächlich ernsthaft behaupten,
dass das einer der Gründe dafür ist,
warum die Industrialisierung irgendwie so abgehoben hat
und warum so viele coole neue Sachen da 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,
wie baut man eine Dampfmaschine?
Ich meine, Darwin war auch so jemand.
Also, ähm, ja.
Bayes war so jemand,
mir fällt das jetzt nicht ein, aber es gab
eine ganze Menge, eine ganze Menge der 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.
Ähm. Ja,
rückwärts Induktion. Ja,
äh, 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 ein Piep unter der Bedingung, dass es Spam ist oder das Wort Piep unter der Bedingung, dass es kein Spam ist.
Und das hat man 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 so ein bisschen Brain hin und her.
Also diese Train-Funktion, die hat halt, lass mich nicht lügen, eins, zwei, drei, vier, fünf, sechs, sieben Zeilen. Das ist alles. Und die sind alle relativ kurz. Also keine von diesen Zeilen hat 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 DefaultsDict genommen, weil das zum Zählen halt schöner ist, als wenn man das normale Dict nimmt, da muss man so oft get schreiben.
Aber was ist DefaultsDict? 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 das sollte man vielleicht schon kennen,
beim Dict kann man sagen,
irgendwie Dict.setDefault,
dann gibt man einen 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 Default-Dict,
ist halt irgendwie, du hast halt,
irgendeinen Dikt, einen Key
und dann eine Liste von Sachen, die da dranhängen
und dann sagst du irgendwie
dieses Dikt.ZDFault, irgendwie
dein Key,
Eckeklammer auf, Eckeklammer zu,
also Liste, Klammer zu, Punkt, Append,
irgendwie da einen Wert rein.
Das kann man auch machen, man kann
das auch mit
ZDFault 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. Sagt man halt irgendwie,
okay, wenn ich jetzt ein Default-Dict habe
von List, dann macht es genau
das. Und da muss man nicht SetDefault die ganze Zeit sagen,
sondern normalerweise würde ja,
wenn ich ein Dict nehme und da
einfach irgendwie ein Key reinsetze und dann
dem irgendwie, dann sage Append irgendwas
oder so, oder dem Wertzuweiser, dann
kracht es halt, weil das sagt dann halt KeyError.
Die Key gibt es da gar nicht.
Und wenn man ein Default-Dict nimmt, dann passiert das nicht.
Weil er dann immer die leere Liste drin hat.
Wenn es das noch nicht gibt, dann erzeugt er halt
in dem Moment halt entsprechend eben eine Liste
oder halt ein Integer, wenn man sagt
DefaultDict von Int, dann wird halt,
kann man halt sagen, irgendwie
Dict, Ecke-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,
ja. Schön, DefaultKey ist
direkt mit den Keys mit. Hatte der schon mal, dass er irgendwie
auf einen Key zugreifen wollte, in dessen
ein Error gab und ein 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-Dict. Und man kann das
dann auch noch ineinander schachteln, also für die Counts der
Wörter in den einzelnen Kategorien habe ich jetzt ein...
Ah, das ist ja so unheimlich kompliziert, wenn man
in Statistik irgendwie die ganzen bedingten Wahrscheinlichkeiten
immer gegen sich umdreht. Aber hey, wir können Dicts
ineinander schachteln, das ist doch schön.
JSON hört sich das an, wie JSON.
Ja, Dicts und Jason haben ja auch viel miteinander zu tun.
Also das ist ja so was ganz Ähnliches.
Könntest Dicts als Jason
rausrealisieren. Also na gut,
du hast halt Objekte drin, die sich nicht
in Jason rausrealisieren lassen, was natürlich auch sein kann.
Ja, und was ich total
nicht so finde, ist, dass ich glaube, bei Jason, wenn ich das
richtig im Kopf habe, dass immer bei den letzten Elementen
das Komma nicht dastehen darf.
Ach ja, Jason hat so
ein paar so hässliche Seiten. Ja, das ist so ein bisschen
äh, genau, Jason
zu parsen ist so ein bisschen ätzend.
Ähm,
Aber genau, also das ist wirklich wenig Zeilen und trotzdem hat man damit ein Modell gebaut, das dann ganz ordentlich funktioniert. Die Klassifikation ist jetzt ein bisschen schwieriger.
Ja, wir möchten gerne jetzt klassifizieren.
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 einem das interessiert.
Im Grunde, was passiert ist eigentlich nur,
dass man halt bei einer neuen Nachricht,
bei der man nicht weiß, ist das jetzt bei mir oder nicht,
zerlegt man auch wieder in Worte
und multipliziert dann halt 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 Viagra oder
ein Piep, ist es vielleicht relativ hoch,
dass dann die Mail Spam ist und multipliziert die miteinander
und bekommt dann einen Gesamtwert raus,
ob es jetzt nur Spam sein könnte
oder nicht. Genau.
Diese Zahlen sind
dann halt sehr niedrig oft, weil
entsprechend halt, ja, Worte auch nicht
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, ich glaube, auch wenn du größere Zahlen miteinander multiplizierst,
die unter 1 sind, wird es irgendwann null.
Naja, eben, genau.
Und das ist halt, also muss man halt gucken,
wenn die Texte lang werden,
jetzt bei SMS auch praktisch sind sie nicht so lang,
aber da muss man halt Maßnahmen ergreifen.
Ich weiß nicht, ob ich das hier getan 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, sodass man das halt
als Wahrscheinlichkeit interpretieren kann.
Ja, und
dann wisst ihr halt,
ne, das ist tatsächlich so der Quotient
ist Spam, ist kein Spam
und dann habt ihr tatsächlich daraus
logischerweise eure Wahrscheinlichkeit. Genau.
Und das funktioniert dann halt jetzt,
also bei dem Dataset war das so...
Und das ist das Coole an der E-Base,
dass es funktioniert mit relativ wenig Daten,
wie ihr gerade gehört habt.
Genau.
Schnell sogar.
Es ist sauschnell.
Also das ist wahrscheinlich schneller
als so ziemlich alles andere.
Auch deswegen, weil das halt kaum was macht.
Das ist halt irgendwie...
Oder ich bin mir ziemlich sicher,
dass es wahrscheinlich schneller ist
als die meisten anderen Machine Learning Verfahren.
Es ist sauschnell.
Man braucht keine Spezialbibliotheken
wie NumPy oder sowas.
Aber ist das schon richtiges Maschinenlösung?
Weil im Prinzip berechnest 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.
Also der Unterschied zwischen Statistik und Maschinenlösung ist,
man schreibt es in einen Computer.
Ja, ich würde tatsächlich sagen, das ist einer der Hauptunterschiede,
dass du es halt mit Computern machst und
auch damit rumspielen kannst und
während du auf, weil, ja,
klassischer Statistik irgendwie
die Formeln
aufschreiben musst. Genau, dann machst du es
auf Papier alles und guckst halt, was da auch
oft dann genauer geht, ja, 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
hinterher ein gutes Ergebnis dabei rauskommen, das kannst du evaluieren.
Und warum das jetzt nicht funktioniert.
Man kann auch mal statistische Fehlerchen machen.
Ja, das kann man natürlich auch. Rausargumentiert.
Es geht ja nur darum, ob
morgen die Wetter, die Sonne scheint oder
nicht. Ja, ja.
Sagen wir mal so, die Kritik ist teilweise schon
prächtig, aber
Man muss halt immer mit seinen Daten auch ein bisschen aufpassen.
Und das Problem bei solchen Dingen ist halt, ihr habt halt
meistens Abhängigkeit zwischen einzelnen
Merkmalen irgendwie dann doch.
ja, also nur eine Mail in den Müll zu
schmeißen, weil jetzt Piep drin vorkommt, ist
vielleicht blöd. Vielleicht habt ihr auch eine nette Mail geschrieben
von eurer, äh,
zukünftigen, eurem zukünftigen
Geliebten, der wollte euch irgendwas Nettes schreiben und
dann ist er im Spam-Ordner gelandet oder sowas.
Ja, genau.
Also, wenn man das jetzt evaluiert, also was
dabei rauskommt, ist schon ganz gut, irgendwie so
ja, Genauigkeit, 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, kann einen, gibt's auch
immer ein schönes Beispiel bei Spam, wenn
halt irgendwie die Wahrscheinlichkeit, und das ist
tatsächlich so, irgendwie, ich glaube, mittlerweile,
wenn man, 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 hat er eine Accuracy von 99%.
Tja.
Sieht gut aus, ist aber nicht wirklich
sinnvoll, weil das Problem ist, man kommt
keine...
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.
Aber sehr halt in dieser
Bekommst du viel Spam?
Ich weiß es ehrlich gesagt nicht.
Es kommt kaum was durch.
Ich habe letztens eine gekommen, die kam super durch.
Das war sehr spannend.
Ich wurde gefragt, ob ich mich nicht sofort für schnellen Sex
treffen möchte. Und noch heute.
Und ich müsste auch einfach nur hier draufklicken.
Wirklich, sowas habe ich noch nie bekommen.
Das war das erste Mal seit bestimmt
acht Jahren oder sowas, dass sowas in meinem Postfach landete.
Okay, ist interessant, wie Sie das geschafft haben,
durch die Spamfilter durchzukommen.
Werbung, genau. Ich weiß es nicht genau.
Ich gucke jetzt hier gerade mal in meinen Spam-Foil.
Doch, es kommt jeden Tag.
Ich weiß es jetzt nicht.
Allein heute sehe ich wahrscheinlich schon so 40, 50 Spam-Mails oder sowas.
Wie viele E-Mails bekommst du eigentlich jeden Tag?
Ich habe das irgendwann mal komplett raus sortiert.
Ich weiß es nicht.
Meine Inbox hier hat gerade so 5.600 ungelesene Mails.
Von 10.000 reduziert.
Ich bekomme relativ schnell voll, aber 100, 200 Stück bleibt da.
Ich habe die ganzen E-Mails abonniert, alles rausgekickt,
alles gelöscht, wollte ich alles
nicht mehr haben, meine Dokus, nö.
Ja, also dieses, ja, also
ja, Mail ist problematisch.
Ich bekomme natürlich jeden Tag immer zehnmal
Fanpost von Hörern von diesen
wunderschönen Posten.
Ja, da geht's gerade noch.
Da könnte, das ist okay.
Also,
wenn ihr möchtet, schreibt uns an hallo.at.
Das ist schon okay.
Es gibt ja auch keine, das Blöde ist halt irgendwie,
es gibt ja auch keine Lösung. Natürlich kann man sagen,
man nimmt einfach keine Mail mehr an oder man liest
das nicht oder sowas auch. Also ihr könntet
mal einen Test machen. Ihr könntet ein Piep in das
nächste E-Mail, Fan-E-Mail
an uns schreiben. Einmal das Wort und mal
gucken, ob es bei uns im Filter landet. Also wir sehen
das auch. Also ich gucke zumindest in den Filter, muss man mal rein.
Du auch? Also ich schon.
Ich verlasse mich drauf, dass das irgendwie funktioniert.
Und dass Leute, wenn es
irgendwas Wichtiges war, dann halt andere Wege versuchen,
mich zu erreichen. Naja, also glaubt
doch wirklich an einen Hörer, wenn er uns
eine Liebeserklärung
sagt. Das funktioniert leider nicht.
Ja, ja, ja. Aber
genau, also
was ich halt an dieser
Geschichte schick finde, ist,
also man kann halt mit wenigen Zeilen
Python, kann man halt einen
I-Base-Classifier schreiben, der schnell ist, der
relativ genau funktioniert.
Man würde das jetzt nicht wirklich
verwenden, wenn man tatsächlich in Spam
Wie groß war jetzt nochmal der Trainingsdatensatz?
5.000, hast du gesagt? 5.500
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, da drunter sind noch so irgendwie zwei andere Dinge, ich habe einmal einfach nur eine lineare Support-Vector-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 1D-Convolutional-Netz
und das ist unfassbar viel langsamer.
Alle wieder abgehängt.
Ja, also der Witz ist,
also eigentlich natürlich nimmt man nicht Naive 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 das 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 ein Request
machen und uns irgendwie einen Server schicken, wo dann
irgendwie irgendwas installiert ist mit NumPy oder so, was
dann halt irgendwie ordentlich
einen Classifier hat,
sondern dir ist 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 nochmal drauf.
Und da
kann halt das, dieses
Naiv-Based-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 basierend, also jemand sagt,
das ist Spam, das ist Spam. Okay, jetzt sortiere
mir nochmal um, sodass die uneindeutigen
Fälle oben sind halt.
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
labeln
und benutzt halt zum Sortieren
einen Classifier, der
halt im Frontend-Code in JavaScript
so läuft. Und für den Fall
Aber wir sind doch hier
beim Python-Podcast. Ja, natürlich.
Also du kannst das halt auch in Python machen.
TypeScript ist ja auch relativ nah dran, tatsächlich.
Ja, aber
also, sagen wir 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...
Irreführend, wenn die dann halt so abwehren 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
ja, 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++ machen
wolltest und versuchst, schneller zu sein als diese
Python-Implementation, wird das,
das wird schwer, weil
die Dict-Implementation ist in Python relativ
relativ stark optimiert.
Da geht dann so viel Zeit rein, um das zu entwickeln.
In der Zeit hätte man einen Algorithmus.
Es ist wirklich,
ich meine, ich habe das ja dann auch schon häufig,
also wenn du das dann in C++ 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++ 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, 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 das, was ich eigentlich damit zeigen wollte.
Pre-Labeling von Trainingsdaten.
Ja, genau.
Oder halt auch, um zu verstehen, wie das funktioniert,
um wirklich sagen zu können,
okay, ich kann mich jetzt darauf verlassen,
dass das wirklich klappt,
weil das Problem ist ja immer an den 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 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 NaiveBase ist halt auch da super, weil es halt so super einfach ist, genau.
Ja, also in dem Notebook hast du dann tatsächlich das nochmal verglichen von der Geschwindigkeit her zu den ganzen anderen Verfahren.
Von der Geschwindigkeit her, das sind einfach nur die...
Präzisionsgrade, Entschuldigung.
Also eigentlich eben Genauigkeit sollte man sich nicht angucken, sondern Precision Recall und ja, da ist halt irgendwie so lineare Support-Weckmaschinen sind halt schon so ein bisschen besser.
Was ist Precision Recall?
Ja, das ist halt
Genauigkeit eben. Argument von eben
ist halt, wenn
mehr als 99% der Mails, die man
so sieht, Spam sind, dann
ist Genauigkeit von 99%
sagt halt nichts aus.
Und dann benutzt man den Recall-Wert?
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...
Alpha-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 Spam erkannt. Genau.
Es ist Spam und es ist bei deinem Impost-Eingang
gelandet. Das wäre
False-Negative, ja.
Oder es ist kein Spam
und du hast es als Spam erkannt und es ist False-Positive.
Oder... Es ist kein Spam
und du hast es im Post-Eingang, was genau das ist.
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, also
aber wenn du jetzt
mehrere Klassen hättest, müsstest du das halt auch nochmal
unterscheiden oder bei Multilabel musstest du das 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 Ham.
Wir binär, genau.
Und genau, dann
ist Precision einfach
Anzahl der Dinge,
Anzahl der True Positives geteilt durch
TruePositive
plus FalsePositive.
Also nochmal, TruePositive
ist ein Mail, die kein Spam ist
und die im Posteingang landet?
TruePositive ist
es ist kein Spam und
es ist im Posteingang gelandet.
Habe ich das nicht gesagt? Oder hast du das gesagt?
Okay, dann habe ich es nur falsch verstanden.
Musst du mal zurückspulen, nochmal neu hören.
Genau, also es ist alles richtig gelaufen,
das ist TruePositive. FalsePositive 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, wie kann man das sagen, die Quote der, 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.
Also, da hätte ich vielleicht recht, aber
ja, genau.
Okay, 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, man
kann halt einfach auf Precision optimieren,
indem man sagt, irgendwie
ja, man
klassifiziert
nur das Ding, wo man sich super sicher ist, als
nur eins als super sicher
als das, was man
wo 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 Beispiele, für die das vielleicht gar nicht so irrelevant ist.
Also wenn man jetzt zum Beispiel entscheidet, ob man jetzt
einen Laser auf einen Insekt richtet, um das dann abzuschieß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 False Positives... Das sind False Positives, genau.
Das wäre auch, das ist auch, 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, das sind halt einfach
unterschiedliche Arten von... Also im einen Fall kommt einfach
hat die Mücke dann trotzdem rein und sticht dich.
Und im anderen Fall ist es vielleicht deine Katze.
Genau, in dem Fall würde man wahrscheinlich eher
als 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.
Das heißt, du definierst quasi die Irrtumswahrscheinlichkeit,
die du nicht unterschreiten willst.
Und darauf optimierst du dann dein Modell.
Genau, genau.
Man kann sagen, also ich möchte nicht,
dass mir so und so viel echte Mails verloren gehen.
Das wäre wahrscheinlich das mit dem Swamp-Klassiker.
3 klassische Grenzen, 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, ja, 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 Fall-Spositives
sind egal, man möchte halt nicht, dass man jemanden
undiagnostiziert lässt, vielleicht, je nachdem,
was es für eine Klarheit ist.
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 Schimpfworte schreibe, oder?
Genau, also natürlich, das ist jetzt
nicht ein echtes System oder so, sondern das ist
einfach nur so ein Beispiel, aber
natürlich diese ganzen Signale oder
Features oder so, das würde man alles mit rein
beziehen eigentlich.
Ich weiß schon, was ich jetzt ausprobieren werde.
Ja, ja.
Und ich glaube also mittlerweile,
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 mehr zu optimieren.
Da gibt es einen globalen Anteil, zum Beispiel bei Google,
ich weiß nicht genau, wann ich das letzte Mal
ein Paper darü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,
die sie 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
beschäftigt, Spam von Nicht-Spam zu unterscheiden
und dann mir die Leute Spam schicken
als Beispiele und ich das nicht kriege,
weil das heißt, es muss auch
manche Leute, bei manchen Leuten
ist das ja vielleicht okay. Oder wenn ich
jetzt zum Beispiel ein nigerianischer
Prinz bin, der irgendwie ein Bankkonto in der Schweiz hat,
dann, ja.
Wäre schon doof, wenn die ganzen Leute meine Hilfe versuchen,
ich will den Geld schenken und keiner will es haben.
Alle denken so, haha, ja.
Also,
Ja, die bestehen halt aus so einem globalen Teil
und halt aus so einem personalisierten Teil.
Mir passiert das immer mit meinem Nachnamen.
Leute sagen immer, haha, verarsch mich nicht.
Ja.
Ja, ist so.
Vollst positiv, ja.
Oder? Was sagst du?
Das wäre vollst positiv, ja.
Das wäre mal eigentlich was, alles in Ordnung, ja.
Genau, und ja.
Ich denke halt immer, ich mache mich lustig
und finde meinen Humor doof.
Ja, also die
Dinger funktionieren. Also ich habe
weder das 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 einfach sagen, das funktioniert.
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
als Naive Bayes, aber
nicht so wahnsinnig, also in dem Fall halt gar nicht so
wahnsinnig viel. Halt irgendwie
bisschen mehr F1
irgendwie, ein Prozent oder
anderthalb oder sowas, aber viel mehr auch nicht.
Also, achso, F1, harmonische
Mittel zwischen Precision und Tricor. Wir haben das glaube ich
bei der Textklassifikationsfolge auch schon nochmal alles erzählt.
Ja, weil wir wollten jetzt auch nicht, dass alle das alles nochmal
hören müssen, die auch gerade einschalten oder nur
von der F-Base zuhören. Also du musst vielleicht
nochmal deswegen kurz erwähnen, was eine Support-Vector-Maschine
ist und was Base hier ist.
Ja,
richtig, also Support-Vector-Maschinen
sind
auch eine Art von
ja, Machine Learning
Verfahren, Modellen.
So ein bisschen, also manchmal
manche Namen sind halt ein bisschen blöd, da würde ich sagen, auch der Name
ist ein bisschen, also sagt einem halt nicht, was das macht.
Was das eigentlich
tut, ist...
Orthogonale 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ßerdem,
das macht das nicht so, aber
interpretiert halt
Texte als Vektoren in einem
enddimensionalen Vektorraum.
Ja, wobei halt, also das wäre auch
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, die du gesehen hast, diese Dimensionen,
denen ein Gewicht gibst, also du kannst auch einfach eins setzen,
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
hunderttausenddimensional oder so.
Ist ja...
Ja, ich hau gut einen dann halt unter Umständen.
Also
vier 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 einen Tunnel durchmacht, aber
sechs, sieben, acht, ah.
Ja, aber es ist ja...
sich vorzustellen, dass, also sich
einen Text als Vektor
hinzuschreiben, das kann man sich ja angucken, das ist
nicht so schlimm. Ja, aber dann macht man das ja flach,
dann ist die Betrachtung, macht man den dann irgendwie
auf so ein 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 auf
von einer Zeile. 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 Einsen und Nullen.
Und diese Werte, diese Gewichte sind halt
Term Frequency 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.
Ja, kann man entweder rausfiltern
oder es ist halt, weil die sind einfach
nicht, daraus kann ich jetzt
nicht schließen, ob das Spam oder nicht Spam war.
Während eben sowas wie Viagra oder das Penis
oder was auch immer, das ist wahrscheinlich
oder das ist
deutlich charakteristischer, die werden 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 zwischen
und das auch wieder bei
Phasenvektoren super einfach, weil
da man muss nur, die sind ja überall null
nur an bestimmten Stellen nicht und man muss nur
diese Stellen sich angucken, was dann halt auch wieder sehr schnell geht
also was man dann letztendlich
macht, ist total simpel, aber es klingt
irgendwie, oh, Winkel
in einem
hunderttausenddimensionalen Raum.
Krass. Klingt irgendwie voll
voll abgefahren. Ist aber eigentlich
total einfach. Also, wenn man sich jetzt
anguckt, was wirklich passiert.
Also, da ist nichts Wildes dabei. Das, was
aber jetzt die Sofort-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 nicht spammen und dann versucht
die Support-Vector-Maschine eine
Ebene so zwischen diese
unterteilende, also
eine separierende Hyper-Ebene so zwischen
diese beiden Klassen
zu legen, dass der Abstand
maximal wird zu beiden.
So ein bisschen wie bei
OLS, Optimal
Linear Squares.
Ja.
Du meinst
Ordinary Lease Squares?
Ordinary ist ein bisschen noch anders, ja.
Ist noch ein bisschen, also
naja, das ist nicht so ganz das Gleiche.
Also es ist tatsächlich das Modell, also
die
Verlustsummen 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 dieses Markenmodell
diese Margin-Maximierung
ist schon charakteristisch für
Support-Vector-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 ist natürlich auch
eine sehr schöne Geschichte. Man kann es leider
aus diversen technischen Gründen nicht so,
also funktioniert es dann doch nicht.
Das
Problem ist vielleicht, dass man sich,
wenn man sich an allen Punkten
orientiert, so ein bisschen auch an den
Extremwerten zu sehr an Langhallen
und wenn man sich mehr an dem Durchschnitt der Werte orientieren
würde und da die Ebenen 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.
Und am Schluss kommt halt das
Ding raus, was tatsächlich irgendwie
diese beiden Teile trennt.
Und zwar, dass den größten,
die Hyper-Ebene hat den größtmöglichen Abstand
zwischen diesen beiden. Ja, ich glaube, da kann man
vielleicht noch ein bisschen was dran drehen, indem man so diese Grundgesamtheit
so ein bisschen manipuliert. Aber ja.
Aber sagen wir so, das
funktioniert halt, das funktioniert sehr gut.
Es ist halt auch so, irgendwie in diesem
hochdimensionalen, da ist viel Platz, geht auch
deswegen funktionieren lineare Modelle da so sehr schön,
weil man kann die halt da so durchlegen.
Wenn das weniger dimensional wird,
dann geht das halt linear nicht mehr, dann muss das alles
irgendwie gewogen 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 das auch, also
Support-Effekte-Maschinen, schöne Geschichte, 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 Jochim zu 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.
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, 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-Ambeddings ist vielleicht noch sogar ein bisschen mehr,
aber so in der gleichen Größenordnung
wie von binären Gewichten zu TF-IDF zu
gehen. Du musst ja einmal noch mal sagen, was
EDF ist. 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 noch auf den Trainingsabend machen,
aber genau. Und
ja,
Word-Embeddings sind halt auch nochmal so eine Geschichte.
Müsste ich jetzt eigentlich auch nochmal erklären.
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,
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 für einen, sondern die 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,
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 viel passiert.
Falls wir was übersehen haben, bitte schicken.
Bis vor kurzem und
ja,
das ist vielleicht auch noch
eine ganz interessante, das möchte ich
unbedingt mal selber ausprobieren,
wir haben ja mit
Nico da diese
Episode zu Textklassifikation
gemacht und der hat
jetzt in seinem Podcast
Techtiefen auch
so eine Miniserie zu
Natural Language Processing gemacht
und da
fand ich einige Sendungen sehr gut,
unter anderem
die, wo er
über diese neuen
Modelle spricht
irgendwie.
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.
Also gibt
sicher Berechtigung, 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 Endgramme über
Harry Potter mit ein paar Kindern, die haben das sehr gefreut.
Das geht bestimmt alles super, aber wenn
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, aber Spacey wäre es.
Also 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 die kann man dann 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 so etwas
Ä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 heißt, da gibt es ja diese
darauf basierende,
also auf dem ImageNet-Dataset basiert,
so eine Challenge,
wie heißt dieser Wettbewerb noch?
Very Large Data, bla, irgendwie Image,
ich weiß nicht mehr genau,
hatten wir auch überwacht, 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 AlexNet 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 Labeln.
Mittlerweile, glaube ich, machen
die Modelle, die besten Modelle jetzt
machen so, die machen einen Fehler,
der ist halb so groß, wie der den Menschen machen.
Und das bei so Tasks wie,
ja, ist da eine Katze
auf dem Bild oder so, wo man sich denkt,
das ist, also, ja klar, das sollte man ja können.
Gut, also, ich meine,
da sind auch fiese Bilder dabei, sowas wie unterschiedliche
Hunderassen und sowas. Man sieht nur so ein Hinterteil
mit so einem Schwanz und weiß dann nicht, ist das eine Katze oder so
irgendwas. Ja, aber das ist halt
irgendwie, dass man da Modelle hat, die bei
so einem Ding, wo man denkt, da ja gut, also
da ist ein Mensch schon nicht so
schlecht drin,
dass die da deutlich besser sind, das ist
beeindruckend. Und zwar ist das
halt in sehr kurzer Zeit passiert.
Das ist 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 noch gar nicht so richtig klar,
dass das gerade passiert.
Deutsch.
Ja, Deutsch ist halt immer ein bisschen doof.
Das ist eine Sprache, für die sich irgendwie niemand so richtig interessiert.
Also, ja, aber da gibt es wohl auch jemanden,
es gibt halt diese großen Sprachmodelle,
irgendwie BERT, irgendwie XLNET, TPT2.
BERT.
Ja, wir werden in Sesamstraße, wie war das?
In Muppet Show, glaube ich, oder?
Muppet Show.
Oder Sesamstraße, ich weiß nicht.
Und da werden halt so große Transformer-Modelle trainiert.
Und der Witz daran ist, ich habe das schon mitgekriegt, dass das passiert.
Und ich dachte mir so, warum trainiert man dann so riesige Modelle, was soll denn das?
Also man ist auch sehr teuer und auch verbreitet 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, das 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 bei ImageNet, bei ImageNet ist es ja auch so,
dass dadurch, dass es vortrainierte 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, dass 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
möchte.
Das ist theoretisch
durch. Jetzt muss man es eigentlich nur noch praktisch umsetzen.
Ja, mir graut schon ein bisschen davon. Ja, dieser Mensch
darf in die Stadt. Nein, der darf nicht in die Stadt. Ja,
dieser Mensch darf da und da hin. Ja, leider könnte es auch sein,
dass er jetzt...
Ja, es ist...
Diese Ampel bleibt für dich rot.
Ja.
Gibt doch nicht mal die guten Tipps.
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ß ich nicht, auf einem Website-Crawl oder eben Wikipedia,
man braucht eigentlich noch ein bisschen mehr als Wikipedia,
dann kann man da unterschiedliche Prediction-Heads draufsetzen
für unterschiedliche Probleme.
Und man nimmt halt sozusagen irgendwie, aber es sind halt alles Sprachprobleme,
also auch so ein Text-Klassifikations-Problem kann man halt nehmen,
Jagt das halt, benutzt halt zum Beispiel
BERT, um das halt
irgendwie
sozusagen um diese
Ist das 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 es 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 Textklassifikationen
macht. Oder ich möchte, dass es irgendwie
Named Entity Recognition macht oder
irgendwas, also sozusagen Namen
oder Orte findet
in Texten oder sowas. Klingelt ja direkt die Kasse.
Oder Fragen beantworten
kann oder solche Sachen.
Und du kannst das gleiche
vortrainierte Modell nehmen für all diese unterschiedlichen
Tasks.
Das heißt, du kannst, und die gibt es
halt auch, du kannst halt, ich weiß nicht
wie viel Geld Google ausgegeben hat, um BERT zu
trainieren oder weiß ich nicht, auf jeden Fall eine ganze Menge.
Das konntest du nicht leisten wahrscheinlich.
Und du kannst das vortrainierte Modell
nehmen, passt es auf deinen Task an, wie zum Beispiel
jetzt irgendwie Text klassifizieren von diesem
Slam-Zox oder irgendwie
und trainierst das halt da drauf
und kriegst halt deutlich bessere Ergebnisse.
Toll, klasse. Genau.
Und das würde ich gerne noch ausprobieren, das habe ich
jetzt noch nicht geschafft, aber das mache ich bestimmt demnächst irgendwann.
Und dann, aber es gibt
schon Papers dazu jetzt. Ist aber auch jetzt im Frühjahr
erschienen, glaube ich, eins, das ist auch des Reuters-Dataset,
das wir auch in der Text-Klassifikations-
Ding
Episode hatten,
wo jemand das einfach genommen hat,
der hat noch zwei andere Text-Klassifikations-Korpus-Datasets benutzt.
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 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,
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
und
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, eben wie Textklassifikation,
Spam, nicht Spam, das ist gut, das ist schon gelöst
irgendwie, aber es ist halt auch so ein Spezialproblem
und man kann das halt auch mit Spezialgeschichten
gut anpacken.
Mir schwant böse, das ist mir schon böse.
Aber man hat
diese Probleme ja auch in anderen Bereichen, wo man dann jetzt nicht so viel
Energie reinstecken möchte, wie es
nicht ist bei der 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 kommen, machen wir auch
bestimmt noch Sachen zu. Das wird noch cool.
Ach, das wird auch cool.
Ich bin schon mal gespannt, weil diese Dinge
auszuprobieren. 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 auch
das war ja 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
GPT-2 gemacht,
aber ich weiß nicht so, aber die großen
habe ich am MIT so eine lustige Sache gesehen,
die haben etwas an die Gesichtsmuskeln
angeschlossen, dass dann die
Bewegung des Gesichtes auf
deine innere Stimme
metten kann. Und so könnte man tatsächlich
dann irgendwie so lesen, was für Sätze diese
Menschen denn gerade denken, wenn man sie irgendwie
so mitfilmen würde. Und daraus dann
solche Sachen zu bauen, ist ein bisschen gruselig.
Alter Ego heißt das Projekt, glaube ich.
Ja, aber da bin ich mir sehr skriptisch, wenn Leute
solche Sachen behaupten. Pettiford-Klinik?
Ja, ja, nein, aber ich meine
überhaupt, wenn es darum geht, vorher zu sagen, was
weil, also 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.
Also 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 bin ja 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
gute Polizisten sind. 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 sehr interessant, guck dir das mal an.
Alter Ego heißt das mit MIT-Projekten.
Okay, muss ich mir mal anschauen.
Ja. Das ist wirklich spannend.
Ja, also ich glaube, wir waren fast am Ende
mit den Classify, aber du hast noch eine Sache, hast du noch
gebaut, du hast noch eine andere, nach
der Vektormaschine, was
anderes getestet.
Das war Spacey.
Das war so ein neuronales Netz.
Also es ist tatsächlich
ein bisschen besser als NaiveBase. Es ist ein bisschen schlechter
als die lineare Support-Vector-Maschine
und verbraucht
aber wahnsinnig viel mehr
Rechenleistung 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 entsprechende Trainingsdaten,
um halt diese ganzen Parameter,
diesen Modell halt auch ordentlich zu fitten oder so.
Aber ich könnte mir halt, also was mich jetzt interessieren würde,
ist, was ist denn jetzt, wenn ich
jetzt so ein vortrainiertes
Language-Modell nehme und dann nochmal
gucke, vielleicht
wird das dann nochmal deutlich besser. Wobei mit dem
Dataset, naja.
Aber
das zeigt halt
zum Beispiel auch, finde ich, dass wenn man jetzt,
also Spacey gilt so als
State-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 genommen zu haben, wäre wahrscheinlich nicht unbedingt der richtige Weg
gewesen, sondern
ja. Lieber naiv Base.
Man muss manchmal so Dinge ausprobieren und manchmal
und es ist 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, das ist eigentlich ganz gut.
Cool. Ja, ich glaube, damit sind wir
eigentlich schon praktisch mit der Geschichte.
Ja, na, E-Space haben wir erklärt. Es fehlt eigentlich noch
der Pick der Woche und schöne Wünsche
fürs, ja, leider ist es erst Montag,
Wochenende, aber
vielleicht ist es ja bei euch.
Ja, das wird auch noch ein bisschen dauern, bis die Sendung
nicht, bis die Sendung raus ist. Aber ja, wir wissen
noch nicht genau, wann sie erscheinen.
Ja, was ist denn dein Pick der Woche?
Du hast dir ja auch was Schönes rausgesucht.
Äh, genau. Ist mir letztens irgendwie über den Weg gelaufen.
Ice Sword.
Und zwar geht es dabei darum, dass halt...
Importe sortieren?
Ja, man kann ja...
Man kann natürlich auch gefahrene 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 Autovermetter,
den man in seinem Editor zum Beispiel einstellen 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 man 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
Blackhands.
Aber das ist halt vielleicht, wenn man da auch
irgendwelche Regeln zu haben
und das, also jedenfalls
bringt iSort das halt auch in Standardformat.
Ich glaube, wenn man das einfach ohne
Config oder so benutzt, dann sortiert es das alphabetisch,
dass es vielleicht auch nicht die sinnvollste
Geschichte ist, aber man kann dem halt
auch sagen, was es priorisieren soll oder
sagen, okay,
Standard-Modul
aus der Standard-Bibliothek nach oben oder so. Man kann das Ding
auch relativ umfangreich konfigurieren
und ich fand da einfach nett zu sehen, dass es da überhaupt
irgendwie eine Möglichkeit gibt, das automatisch zu machen.
Ich glaube, es gab sogar so einen Hook in Black oder sowas?
Nee, also da genau, das war
in Black ist es so, dass
irgendwelche Leute haben
da ein GitHub aufgemacht
und gefragt, ob Black das nicht auch machen könnte.
Und dann haben sie gesagt,
naja, 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 IceHort
da geschrieben, ja, ich sehe das
auch alles irgendwie, dass das problematisch ist
und ich arbeite gerade an einer
Black-IceHort-Implementation,
die
diese Probleme dann nicht hat.
Also falls ihr mittelgroße oder größere Projekte automatisch
studieren wollt mit euren Modulen,
guckt euch das doch mal an.
Mein Pick der Woche war
PPtop.
Das macht sowas wie
Python-Prozesse anzeigbar wie Htop,
wenn ihr das irgendwie kennt oder so.
Htop 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 was mit Python-Prozessen, das ist relativ cool.
Und ja, kann euch
so eine Inspektion geben, was macht der
in der Prozess eigentlich gerade. Fand ich
ganz interessant, um mal so ein bisschen rumzuspielen, mal ein bisschen
zu debuggen, zu gucken, was passiert
denn da eigentlich?
Klingt gut, muss ich mal ausprobieren.
Ja.
Ja, so.
Haben wir es quasi fast heute wieder geschafft,
würde ich sagen. Ja, also falls jemand von
euch gezählt hat, wie oft wir Penis gezählt haben,
können da sich eine Folge binden.
Noch toller wäre es natürlich, wenn ihr einen Algorithmus schreibt,
der irgendwie die Sprache analysiert und uns genau zeigt, wo das
denn gewesen ist. Wir wollen euch ja mal
ein bisschen motivieren, zwei Projekte, wer weiß.
Ja, danke, dass ihr wieder zugehört habt.
Bleibt uns gewogen, schaltet wieder rein.
Ja, und ob immer auch seid.
Schönen Tag, schönen Morgen, Abend, Nacht.
Bis demnächst.
Bis dann.
Tschüss.