WEBVTT

00:00:00.640 --> 00:00:05.660
Ja, hallo liebe Hörerinnen und Hörer. Willkommen bei der 13. Episode vom Python-Podcast.

00:00:05.660 --> 00:00:07.780
Hier ist der Dominik, wir sind bei Jochen.

00:00:07.780 --> 00:00:08.620
Jo, hallo.

00:00:08.620 --> 00:00:18.920
Ja, heute haben wir ein schönes Thema für euch mitgebracht und zwar wollten wir über naive Base-Klassifikation sprechen und ein bisschen BEM sortieren.

00:00:19.420 --> 00:00:30.300
Genau, also eigentlich für mich die Idee dabei war, mal wieder so ein bisschen was Einsteigermäßiges mehr zu machen.

00:00:30.300 --> 00:00:35.680
Und dann habe ich mir kurz Jochen's Repo angeguckt und so einsteigerfreundlich ist das nicht. Aber wenn euch das natürlich interessiert.

00:00:35.680 --> 00:00:46.380
Genau, oder sagen wir mal so einfach, weil ich denke, ich habe halt nach einem Beispiel gesucht, was man relativ leicht in Python machen kann und wo man jetzt in anderen Sprachen ein Problem hätte,

00:00:46.380 --> 00:00:49.380
dass in der gleichen...

00:00:49.420 --> 00:00:52.100
Ja, kürze so hinzubekommen.

00:00:52.100 --> 00:00:54.920
Da kann man auf jeden Fall wieder sehen, Python kann das richtig gut.

00:00:54.920 --> 00:01:01.020
Aber wenn ihr wirklich ein Einstiegsbeispiel haben wollt, also in der nächsten Folge haben wir wieder, glaube ich, was vor oder in der übernächsten, wirklich für Einfänger noch.

00:01:01.020 --> 00:01:05.580
Da machen wir mal so wirklich Einsteigergeschichten, einfach grundsätzliche Datentypen und so.

00:01:05.580 --> 00:01:12.000
Ich habe jetzt auch versucht, mich dabei dem Beispiel auf so die grundlegenden Datenstrukturen zu beschränken, die es halt irgendwie eingebaut gibt.

00:01:12.000 --> 00:01:15.280
Aber gut, so ganz super einsteigerfreundlich ist es vielleicht nicht.

00:01:15.280 --> 00:01:16.400
Ja, aber seid gespannt.

00:01:16.400 --> 00:01:17.140
Vielleicht trotzdem interessant.

00:01:17.140 --> 00:01:19.280
Wir haben übrigens Ende August mittlerweile 2019.

00:01:19.420 --> 00:01:22.920
2019 immer noch und es ist tatsächlich immer noch so unglaublich warm wieder.

00:01:22.920 --> 00:01:24.420
Also heute, ich weiß nicht.

00:01:24.420 --> 00:01:32.300
Ja, aber irgendwie, keine Ahnung, wir können ja erstmal so ein bisschen darüber reden, was passiert ist in letzter Zeit, was wir an so Dingen gesehen haben.

00:01:32.300 --> 00:01:35.240
Also wir waren auf der Frostcon, also ich noch ganz kurz und du ein bisschen länger.

00:01:35.240 --> 00:01:36.440
Ja.

00:01:36.440 --> 00:01:38.640
Ja, das heißt, du hast ein bisschen mehr Vorträge gesehen.

00:01:38.640 --> 00:01:42.340
Ich habe nur den einen letzten zu Reinforced Learning mehr angehört.

00:01:42.340 --> 00:01:45.600
Du meinst den Workshop?

00:01:45.600 --> 00:01:46.080
Ja.

00:01:46.080 --> 00:01:47.460
Deep Learning Workshop, ja genau.

00:01:47.460 --> 00:01:47.720
Genau.

00:01:47.720 --> 00:01:49.400
Ja, dazu gab es auch ein paar.

00:01:49.420 --> 00:01:50.340
Den Vortrag, den habe ich auch geguckt.

00:01:50.340 --> 00:01:53.640
Genau, ja.

00:01:53.640 --> 00:01:59.280
Ich habe auch sowieso wahnsinnig viele Talks, habe ich gar nicht angeguckt.

00:01:59.280 --> 00:02:00.560
Du hast genetzt werden, oh.

00:02:00.560 --> 00:02:04.720
Aber ansonsten, doch, ja, so ein paar Sachen habe ich auch schon gesehen, das stimmt.

00:02:04.720 --> 00:02:08.240
Ja, aber es war sehr interessant, es war viel los und es gab eine ganz tolle Kinderbetreuung.

00:02:08.240 --> 00:02:13.360
Ja, wenn ich das mal vorher gewusst hätte, ist es mir gar nicht so aufgefallen, aber es gab einen riesen Hüpfbock und so.

00:02:13.360 --> 00:02:15.260
Ja, hätte man.

00:02:15.260 --> 00:02:16.820
Hätten die Mädels Spaß haben können.

00:02:16.820 --> 00:02:17.460
Ja.

00:02:17.460 --> 00:02:17.700
Ja.

00:02:19.420 --> 00:02:32.160
Äh, genau, ähm, was, äh, also, ich, genau, dieser, 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.

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

00:02:40.440 --> 00:02:41.240
Das hatten wir auch schon mal.

00:02:41.240 --> 00:02:49.240
Das ich auch schon mal, das wir auch schon mal gemacht hatten, deswegen fand ich das auch interessant, ob das Leute vielleicht auch aus einem anderen Blickwinkel etwas, äh, besser darstellen oder was die da so zu erzählen haben.

00:02:49.420 --> 00:03:01.060
Und, ähm, ja, also, die haben da, äh, irgendwie bessere Netze verwendet, also, die Zahlen waren hinterher besser, das war, das war tatsächlich ganz cool zu sehen und da muss ich ja mal gucken, ob ich da nicht vielleicht einfach nochmal so ein bisschen ein paar stärkere Modelle mit reinbaue.

00:03:01.060 --> 00:03:10.280
Aber so, ansonsten war das jetzt, äh, für mich jetzt gar nicht, also, war jetzt, war jetzt so nicht so viel Neues dabei.

00:03:10.280 --> 00:03:11.680
Ähm.

00:03:11.680 --> 00:03:14.260
Ja.

00:03:14.260 --> 00:03:15.640
Ja, und wir haben, äh, Post bekommen.

00:03:15.640 --> 00:03:16.220
Nette Post.

00:03:16.220 --> 00:03:17.180
Ah, genau, natürlich.

00:03:17.180 --> 00:03:18.020
Äh, ja.

00:03:18.020 --> 00:03:19.140
Einen ganz schönen Brief von Thorsten.

00:03:19.240 --> 00:03:20.680
Vielen Dank für deinen, äh, super netten Brief.

00:03:20.680 --> 00:03:21.220
Ja, dankeschön.

00:03:21.220 --> 00:03:24.100
Wir haben es irgendwie nicht so richtig geschafft, darauf zu antworten, weil gerade viel Stress war.

00:03:24.100 --> 00:03:25.060
Es ist immer noch viel Stress.

00:03:25.060 --> 00:03:26.400
Hier hört nicht auf.

00:03:26.400 --> 00:03:28.980
Aber, äh, genau.

00:03:28.980 --> 00:03:30.180
Ja, willkommen zum Atmen, ja, ja.

00:03:30.180 --> 00:03:43.720
Ähm, ja, aber, aber trotzdem hat uns sehr gefreut und, ähm, äh, genau, wir hatten auch noch eine Mail bekommen von, äh, von jemandem, der sich dafür interessiert hat, wie das mit den, äh, Generatoren so funktioniert.

00:03:43.720 --> 00:03:44.180
Genau.

00:03:44.180 --> 00:03:48.820
Ja, und das ist natürlich auch eine interessante Frage und, äh, vielleicht kann man das eigentlich auch hier aufkürzen.

00:03:49.060 --> 00:03:49.420
Genau.

00:03:49.420 --> 00:03:51.780
Ja, Jochen, sag doch mal bitte, was, was ist denn mit einem Generator?

00:03:51.780 --> 00:03:53.340
Wann braucht man den, was muss der denn?

00:03:53.340 --> 00:03:56.900
Genau, man kann auch einfach Listen nehmen und dann, äh, funktioniert das, äh, auch alles.

00:03:56.900 --> 00:04:02.120
Ja, äh, kann man, aber manchmal ist es halt, äh, schlauer, einen Generator zu nehmen.

00:04:02.120 --> 00:04:12.380
Also, wenn man zum Beispiel, äh, eine sehr große Datenstruktur hat mit vielen Elementen in der Liste und darüber iteriert, dann, äh, ähm, passt die vielleicht gar nicht komplett in den Hauptspeicher.

00:04:12.380 --> 00:04:15.260
Das wäre natürlich dann schlecht, weil dann wird das nicht funktionieren.

00:04:15.260 --> 00:04:19.040
Ist das nicht auch einer der Unterschiede von Python 2 auf Python 3 gewesen, dass bestimmte Sachen dann, äh.

00:04:19.040 --> 00:04:21.720
Als Generatoren zurückgegeben wurden, wie vorher.

00:04:21.720 --> 00:04:33.560
Ja, also bei, bei Dedict ist es irgendwie ab Python 3 so, dass Items, äh, einen Generator zurückliefert, während, äh, bei Python 2, glaube ich, Iter-Items musste man dann aufrufen.

00:04:33.560 --> 00:04:36.500
Ich bin mir noch nicht sicher, ob das wirklich der Unterschied zwischen 2 und 3 war.

00:04:36.500 --> 00:04:37.600
Kann, kann, kann aber gut sein.

00:04:37.600 --> 00:04:38.020
Einer von denen.

00:04:38.020 --> 00:04:39.580
Oder das Range, Range und X-Range.

00:04:39.580 --> 00:04:40.100
Genau, Range.

00:04:40.100 --> 00:04:41.120
Bei Python 2 musste man X-Range.

00:04:41.120 --> 00:04:42.000
Range gab eine Liste.

00:04:42.000 --> 00:04:42.900
Ja.

00:04:42.900 --> 00:04:49.020
Und, äh, X-Range dann den Generator und jetzt mittlerweile ist es halt so, dass Range einen Generator zurückgibt.

00:04:49.020 --> 00:05:10.280
Was, ja, halt auch irgendwie sinnvoller ist, weil, äh, wenn man Range, äh, irgendwie, äh, äh, ich weiß nicht, wie, wie groß die Zahl sein muss, die man in Range reinsteckt, damit, äh, äh, man den Hauptspeicher dann platt macht und das Programm sofort, äh, beendet wird vom Kernel, ähm, wahrscheinlich muss man eine große Zahl nehmen, aber dann ist halt, das ist so ein bisschen frustrierendes Erlebnis vielleicht, wenn dann einfach gar nichts mehr geht.

00:05:10.280 --> 00:05:12.880
Ja, aber genau, was ist überhaupt ein Generator?

00:05:12.880 --> 00:05:19.000
Also eine Liste, ähm, wir wissen ja vielleicht, da ist irgendwie eine kleine Datenschruktur, wo verschiedene Elemente drinstehen, über die man, äh,

00:05:19.000 --> 00:05:24.920
sowas kann wie iterieren, das heißt, man geht über jedes einzelne Listenelement durch und, äh, kann dann damit Dinge anstellen.

00:05:24.920 --> 00:05:31.820
Ja, der, 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 eine Datenschruktur, die im Hauptspeicher liegt.

00:05:31.820 --> 00:05:47.260
Bei dem Generator ist es so, dass, äh, ähm, wenn man darüber iteriert, halt immer das Objekt gefragt wird, was ist denn das nächste Element, sozusagen gibt man das nächste Ding oder so und intern sieht das dann halt so aus, dass eine Funktion meistens dann irgendwas rausgildet.

00:05:47.260 --> 00:05:48.980
Also nicht Return, sondern...

00:05:48.980 --> 00:06:11.340
Ja, genau, und, äh, hielt es dann das nächste Ding raus und, ähm, muss aber die Sachen vorher und nachher gar nicht alles speichern, sondern betrachtet immer nur das, äh, aktuelle, äh, Element sozusagen oder das aktuelle Ergebnis einer Berechnung und, ähm, wird dann halt weiterhin, weiter ausgeführt beim, bei, bei der nächsten Iteration.

00:06:11.340 --> 00:06:18.960
Also, äh, das heißt, man kann halt über eine, eben, wenn man das Beispiel Range nimmt, äh, äh, eine Liste von, weiß ich nicht, einer Billion Zahlen iterieren.

00:06:18.960 --> 00:06:22.800
Ohne diese Liste der Billionen Zahlen jemals irgendwo tatsächlich halten zu müssen.

00:06:22.800 --> 00:06:31.920
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, ähm, die Liste würde sonst im Speicher schon komplett liegen.

00:06:31.920 --> 00:06:32.860
Genau.

00:06:32.860 --> 00:06:34.060
Bei der Liste, ja.

00:06:34.060 --> 00:06:35.660
Äh, also...

00:06:35.660 --> 00:06:40.140
Also der Generator hat dann viel weniger Speicher, den er verbraucht, gerade bei so großen Datenmengen.

00:06:40.140 --> 00:06:42.420
Genau, und, ähm, ja, also es ist halt...

00:06:42.420 --> 00:06:43.760
Dementsprechend auch schneller, ja?

00:06:43.760 --> 00:06:44.420
Äh...

00:06:44.420 --> 00:06:46.300
Warum ist denn der Generator so viel schneller als die Liste?

00:06:46.300 --> 00:06:47.820
Ja, das kommt drauf an.

00:06:47.820 --> 00:06:48.740
Also das würde ich jetzt so nicht sagen.

00:06:48.840 --> 00:06:50.600
Dass der Generator immer schneller ist, das kann man so nicht sagen.

00:06:50.600 --> 00:06:51.040
Okay.

00:06:51.040 --> 00:06:55.100
Er wahrscheinlich ein bisschen langsamer, aber, äh, es hat halt andere Vorteile.

00:06:55.100 --> 00:06:57.860
Also der Vorteil ist halt, man kann damit Dinge tun, die mit Listen halt nicht gehen.

00:06:57.860 --> 00:07:18.720
Und, ähm, ja, äh, äh, also, äh, 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, äh, du kannst natürlich irgendwie, wenn du ein großes XML-Dokument beispielsweise hast, auch das Ding komplett, ähm, in den Hauptspeicher...

00:07:18.720 --> 00:07:24.580
...parsen als Datenstruktur und dann damit irgendwas machen oder du kannst halt da Schritt für Schritt durchgehen.

00:07:24.580 --> 00:07:36.060
Und, ähm, Generatoren werden halt sozusagen, also sozusagen, das wäre eine andere Möglichkeit, das zu vergleichen, ja, so irgendwie DOM, ähm, Parser versus, äh, Sachs Parser.

00:07:36.060 --> 00:07:37.080
Das kennt wahrscheinlich auch keiner.

00:07:37.080 --> 00:07:38.020
Was ist denn bitte ein Sachs Parser?

00:07:38.020 --> 00:07:38.700
Ach, warte, warte.

00:07:38.700 --> 00:07:39.760
Ja, das ist...

00:07:39.760 --> 00:07:43.560
Also DOM ist das Webseiten, äh, Strukturelement von den HTML...

00:07:43.560 --> 00:07:44.860
...Objektmodel, ja, genau.

00:07:44.860 --> 00:07:48.600
Ähm, also den, diesen, diesen Baum gibt es.

00:07:48.600 --> 00:07:59.420
Aber nicht nur jetzt bei HTML-Seiten, sondern halt, wenn du jetzt irgendwie beliebige XML-Geschichten hast, äh, 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.

00:07:59.420 --> 00:08:15.780
Was bei kleineren Sachen ja gar kein Problem ist und es ist halt ein bisschen komfortabler, weil man halt, äh, irgendwie, äh, da hin und her springen kann, äh, oder aber man, äh, sozusagen, äh, pars das Event basiert und lässt sich halt vom Parser Events geben, wie zum Beispiel, da kommt jetzt ein neues Element vorbei oder so.

00:08:15.780 --> 00:08:18.480
Und dafür muss man...

00:08:18.480 --> 00:08:42.260
Dafür muss das Ding aber dann halt nicht komplett im Hauptspeicher liegen, sondern das wird dann halt sozusagen iterativ geparsed und dann kann man halt Sachen parsen, die halt so groß sind, dass man, ich meine, man braucht, wenn man das, äh, wenn man XML komplett parsed, wahrscheinlich das, den zwei-, drei-, vierfachen Speicher von dem, wie es auf der, wenn es auf der Platte liegt, äh, im Hauptspeicher und wenn jetzt zwei Gigabyte, äh, weiß ich nicht, Ding auf der Platte liegen hat, dann hat man unter Umständen ein Problem, weil früher war das schlimmer.

00:08:42.260 --> 00:08:46.760
Früher bei 32, als 32-Bit-Systeme noch, das, äh, da, da war schnell Ende.

00:08:46.760 --> 00:08:47.840
Ein V-Speicher voll.

00:08:48.360 --> 00:08:51.340
Ja, war halt mit drei Gigabyte, äh, vier, ja, das ist halt Hauptspeicher voll.

00:08:51.340 --> 00:08:53.720
Also, um war out of mana, ne?

00:08:53.720 --> 00:08:54.300
Ja.

00:08:54.300 --> 00:09:18.240
Äh, mittlerweile kann man ja auch viele Hauptspeicher einstecken, also begegnet es einem wahrscheinlich eher selten, dass man irgendwie, äh, dass ein Hauptspeicher ausgeht, wenn man irgendwas parst, aber, ähm, selbst das kann natürlich immer noch passieren und, ähm, wenn man jetzt, äh, sozusagen, ähm, auch in der Lage sein möchte, Daten zu verarbeiten, die jetzt nicht in den Hauptspeicher passen, dann macht man eben sowas, äh, und parst halt eventuell.

00:09:18.240 --> 00:09:18.660
Eventbasiert.

00:09:18.660 --> 00:09:24.420
Ist ein bisschen mehr Arbeit dann, sozusagen, äh, beim Programmieren, aber, äh, verbraucht halt nicht so viel Hauptspeicher.

00:09:24.420 --> 00:09:29.560
Und solche Arten von Fällen gibt's natürlich viele, wo man irgendwie, wo Ströme von Daten hat, ne?

00:09:29.560 --> 00:09:33.860
Irgendwie auch, wenn man irgendwie sich an irgendwelche APIs dranhängt und dann kriegt man halt da irgendwie...

00:09:33.860 --> 00:09:35.360
Rewebchen weiter, irgendwelche Requests.

00:09:35.360 --> 00:10:04.560
Genau, genau, dann, äh, ja, für all diese Dinge ist das halt sehr sinnvoll und, ähm, ja, man kann Generatoren halt auch, äh, quasi mehr oder weniger, äh, also, man kann diese Funktionssyntax mit Yield verwenden oder halt, äh, das, ja, Iterator-Protokoll beziehungsweise Generator-Protokoll dann halt verwenden oder man kann halt auch einfach ne, äh, 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.

00:10:05.240 --> 00:10:10.720
Aha, das heißt also, wenn ich eine List Comprehension mit runden Klammern schreibe, habe ich automatisch einen Generator und das funktioniert genauso.

00:10:10.720 --> 00:10:34.060
Ja, und wenn man jetzt noch ne andere Geschichte mit dazu nimmt, dann hat man sogar, äh, also, wenn man jetzt nicht nur Sachen aus einer Funktion rausyielden kann, also sozusagen, da passiert ja folgendes, äh, also wenn normalerweise so eine Funktion retornt, dann ist die Funktion ja fertig, aber wenn man, ähm, etwas rausyieldet, dann wird die Funktion sozusagen nur unterbrochen, bis halt sozusagen das nächste Ergebnis da rausgeholt wird.

00:10:35.120 --> 00:11:00.740
Äh, und wenn man jetzt auch noch Sachen da reinstecken kann, dann, äh, kann man tatsächlich so bidirektionale Kommunikation irgendwie haben und dann kann man sowas haben wie ein Websocket-Server oder irgendwie ein Server, der halt Sachen annimmt und wieder Sachen zurückschickt und das halt, äh, das wäre dann jetzt nicht mehr wirklich Generator, sondern das wäre dann irgendwie so Co-Routine, aber das, das, was kann man da machen und, ähm, ja, äh, sehr nett.

00:11:05.000 --> 00:11:07.000
Ähm.

00:11:34.880 --> 00:11:41.480
Trotz 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.

00:11:41.480 --> 00:11:44.260
C-Programmierer werden sagen, völlig ineffektiv wollen wir.

00:11:44.260 --> 00:12:04.700
Ja, nicht so super ineffizient, sondern halt irgendwie das mal 3 oder sowas oder 4, äh, was immer noch ganz okay ist, aber, ähm, das macht natürlich schon einen großen Unterschied, wenn man jetzt Listen mit, äh, einer großen Menge von, von, äh, ja, Zahlen im gleichen Datentyp hat oder so, dann denkt man sich so, naja, gut, irgendwie bekloppt.

00:12:04.760 --> 00:12:20.100
Also, ähm, früher eine Möglichkeit, das Array-Area, äh, das Array-Modul in der Standardbibliothek zu verwenden, das macht das einfach quasi so ein Type-Num-Review 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.

00:12:20.100 --> 00:12:23.620
Ähm, oder man nimmt einen NumPy, da geht das auch.

00:12:23.620 --> 00:12:34.640
NumPy ist natürlich jetzt nicht in der Standardbibliothek, aber, ähm, so, und, ähm, jetzt habe ich halt nachgeguckt, okay, wie viel wir brauchen, das ist eine Liste und da war, da habe ich eine, irgendwie eine Liste mit 100.

00:12:34.640 --> 00:12:43.080
Millionen Dingern genommen oder so und das hat dann nur noch, irgendwie, 860, äh, knapp 68 Megabyte Hauptspeicher gebraucht auf meinem System und ich dachte so, huch, wie ist das, was ist das denn?

00:12:43.080 --> 00:12:52.260
Ehrlich gesagt, ich weiß nicht genau, woran das liegt, ich, das müsste ich vielleicht auch, vielleicht bis zum nächsten Mal recherchieren, woran das liegt, aber das ist ja, das ist ja super, also, das ist viel weniger, als das früher war.

00:12:52.260 --> 00:12:54.000
Und.

00:12:54.000 --> 00:12:57.640
Wie viel hätte das früher so im Bereich, ähm, dann vielmals viel oder deutlich mehr, ne?

00:12:57.640 --> 00:13:00.900
Ja, da hätte ich ja eher erwartet, dass das dann so drei Gigabyte werden oder so.

00:13:00.900 --> 00:13:03.900
Weil, äh, ja.

00:13:04.520 --> 00:13:05.220
Und spart Platz.

00:13:05.220 --> 00:13:06.860
Irgendjemand hat das vernünftig implementiert.

00:13:06.860 --> 00:13:07.760
Irgendwas ist da optimiert worden.

00:13:07.760 --> 00:13:10.460
Lass mal, vielleicht weiß das ja auch jemand, was da passiert ist.

00:13:10.460 --> 00:13:12.000
Ja, ja, Generatoren, liebe.

00:13:12.000 --> 00:13:12.860
Genau, Generatoren.

00:13:12.860 --> 00:13:15.120
Chaptermark ist, ist, ist Zeit jetzt, glaube ich, für.

00:13:15.120 --> 00:13:15.500
Ja.

00:13:15.500 --> 00:13:16.720
Äh.

00:13:16.720 --> 00:13:19.160
Oh, ich habe gerade zufällig mein Handy geklaut.

00:13:19.160 --> 00:13:21.480
Herzlich Glückwunsch an meine Cousine, sie hat gerade einen Heiratsantrag bekommen.

00:13:21.480 --> 00:13:22.660
Oha.

00:13:22.660 --> 00:13:23.440
Ja, ja.

00:13:23.440 --> 00:13:25.020
Wir freuen uns alle für sie mit.

00:13:25.020 --> 00:13:28.160
Ja, äh, genau.

00:13:28.160 --> 00:13:29.860
Ähm.

00:13:29.860 --> 00:13:32.820
Ja, was hatten wir denn noch?

00:13:32.820 --> 00:13:34.140
Ah, genau.

00:13:34.400 --> 00:13:37.780
Dann habe ich irgendwie Podcasts gehört, das war auch irgendwie wieder sehr nett.

00:13:37.780 --> 00:13:38.700
Du hörst sowas?

00:13:38.700 --> 00:13:39.300
Ja, ja.

00:13:39.300 --> 00:13:45.540
Der Django, äh, Django-Chat-Podcast hatte wieder eine ganz nette Folge mit, ähm.

00:13:45.540 --> 00:13:51.460
Bevor du davon erzählst, also ich höre ja auch ab und zu meinen gerne Podcasts, also ich höre auch was zum Bilden, aber manchmal auch einfach Eishockey-Short in den News.

00:13:51.460 --> 00:13:53.500
Wenn ich ja einmal kurz Werbung machen darf.

00:13:53.500 --> 00:13:54.620
Ah, okay.

00:13:54.620 --> 00:13:58.260
Falls jemand sich noch für Eishockey interessiert, das ist nicht so wahrscheinlich, aber vielleicht gibt es ja Menschen.

00:13:58.260 --> 00:14:00.220
Ja, toller, tolles Ding, tolles Ding.

00:14:00.220 --> 00:14:01.360
Gab es einen kleinen Skandal?

00:14:01.360 --> 00:14:02.020
Nein, egal.

00:14:04.280 --> 00:14:07.840
Ähm, ja, Düsseldorf und Eishockey, ja, doch, hat ja auch irgendwie.

00:14:07.840 --> 00:14:13.560
Ja, ja, man hat sich über einen der Sponsoren aufgeregt, der war, äh, nicht so ganz, äh, der hat so ein paar komische Sachen gepostet.

00:14:13.560 --> 00:14:17.340
Das haben die, äh, investigativen Journalisten von John Estern aufgedeckt.

00:14:17.340 --> 00:14:20.820
Mal gucken, ob wir nächstes Jahr noch in der Liga, äh, in den Saisen kommen.

00:14:20.820 --> 00:14:23.940
Tja.

00:14:23.940 --> 00:14:34.000
Äh, äh, genau, ja, nee, ich, äh, ähm, ich höre auch noch andere Podcasts, aber, aber auch viel, äh, äh, Zeugs.

00:14:34.160 --> 00:14:41.860
Und das, ähm, genau, da gab es eine Episode mit Andrew Godwin, der, der, äh, das ist auch ein bekannter Django-Entwickler, hat viel, äh,

00:14:41.860 --> 00:14:49.720
der, der, der, von dem ich glaube, das ganze Migrations, äh, Framework, was jetzt, äh, äh, was bei 1.7, glaube ich, in, in, in Django reingekommen ist.

00:14:49.720 --> 00:14:51.060
Früher hieß es South.

00:14:51.060 --> 00:14:54.080
Und was musst du denn früher machen, bevor man Django Migrations machen konnte?

00:14:54.080 --> 00:14:57.080
Naja, da gab es halt drei, ich glaube, es gab drei unterschiedliche Systeme.

00:14:57.080 --> 00:15:03.080
Es gab eins von, von Andrew Godwin, das heißt South, es gab eins von Simon Willison und es gab noch eins von, äh,

00:15:04.040 --> 00:15:07.840
Das hört sich an, als wäre es deutlich mehr Arbeit gewesen früher irgendwie.

00:15:07.840 --> 00:15:14.000
Ja, also die meisten Leute haben dann dann schon South verwendet, äh, irgendwie, äh, insofern, äh, was ich nicht wusste, ist,

00:15:14.000 --> 00:15:16.820
es ist komplett reimplementiert worden, als es dann bei Django 1.7 reinkam.

00:15:16.820 --> 00:15:21.500
Also er hat das halt, äh, nicht einfach übernommen, sozusagen, sondern er hat es nochmal komplett neu geschrieben.

00:15:21.500 --> 00:15:25.020
Ja, aber das war nicht so alles lernt, wenn man irgendwie zwei Jahre weiter ist, ne?

00:15:25.020 --> 00:15:25.520
Ja.

00:15:25.520 --> 00:15:30.260
Oh, nee, so macht man das, aha, nee, so, was hab ich denn da geschrieben, so ein Unsinn, ja.

00:15:30.260 --> 00:15:33.980
Äh, naja, jedenfalls, äh, der, äh, macht einen Tarnbeschäftigter, ist ja ganz viel,

00:15:34.000 --> 00:15:42.020
damit, ähm, ja, damit Django so ein bisschen mehr auf diese, äh, Async, äh, äh, Schiene zu kriegen,

00:15:42.020 --> 00:15:45.460
weil das ist ja so ein Ding, das ist halt Django überhaupt gar nicht, also die ganzen großen Frameworks sind das nicht,

00:15:45.460 --> 00:15:46.240
Flask ist es auch nicht.

00:15:46.240 --> 00:15:51.240
Äh, bei Django ist es halt aber schwierig, das zu ändern, weil das einfach so viel Zock ist.

00:15:51.240 --> 00:15:57.800
Und, ähm, weil halt die API, also die, äh, äh, Whiskey API gibt es halt nicht her.

00:15:57.800 --> 00:15:58.880
Äh, es gab...

00:15:58.880 --> 00:15:59.400
Whiskey Prost.

00:15:59.400 --> 00:16:00.020
Ja.

00:16:00.020 --> 00:16:01.900
Hahaha, die wollte ich schon immer noch bringen.

00:16:03.960 --> 00:16:08.460
Äh, er hatte da vorher ein Projekt, äh, Django Channels, ähm, oder das, das gibt es natürlich immer noch,

00:16:08.460 --> 00:16:17.320
er ist dann halt, irgendwann hat die Mentenz davon abgegeben, aber, äh, jetzt geht's darum, halt, äh, sozusagen Django selber, äh, Async fähig zu machen.

00:16:17.320 --> 00:16:25.080
Was halt auch eines der Ziele ist für, für jetzt Django 3, äh, irgendwie, und, ähm, er hat da irgendwie ein Projekt, ein großes Projekt gestartet.

00:16:25.080 --> 00:16:27.660
Das ist ja auf einmal ungeahnte, weiten...

00:16:27.660 --> 00:16:29.780
Das wird, das wird, das wird tatsächlich sehr interessant.

00:16:29.780 --> 00:16:33.920
Also, äh, ich bin, ich bin schon sehr gespannt, also das wäre natürlich, also meine Idealvorstellung auch,

00:16:33.920 --> 00:16:44.820
dass man, ja, naja, gut, das wird halt auch lange dauern, aber, äh, dass halt alles asynchron ist von, äh, also einmal, dass man Web-Stalker-Geschichten halt auch direkt machen kann,

00:16:44.820 --> 00:16:55.340
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,

00:16:55.340 --> 00:17:03.840
dass man halt sozusagen, äh, Endpunkte hat, die dann wiederum andere API-Endpunkte anfragen, irgendwo anders vielleicht, äh, und dass man das,

00:17:03.880 --> 00:17:09.500
dass man dann auch wieder asynchron zusammen aggregieren kann und dann nicht das Synchron hintereinander machen muss, wie das momentan passiert.

00:17:09.500 --> 00:17:16.040
Und dann hat man halt irgendwie 200 Abfragen, die man irgendwo hinmacht, dann darf man, macht man vielleicht 100 Statements und dann macht man irgendwie noch, fragt man noch irgendwie ein paar APIs

00:17:16.040 --> 00:17:22.200
und dann muss man halt manchmal vielleicht auch zwei oder drei Requests machen und dann, äh, verbreitet man unheimlich viel Zeit dabei zu warten.

00:17:22.200 --> 00:17:25.580
Und das ist natürlich blöd, weil die Latenz natürlich irgendwie entscheidend ist.

00:17:25.580 --> 00:17:33.860
Und, äh, wenn man das asynchron machen würde, dann müsste man halt sozusagen nur, dann würde der längst laufende, äh, Request halt dann noch die Latenz,

00:17:33.860 --> 00:17:41.220
die Latenz bestimmen, aber, äh, ja, wenn, wenn der halt auch relativ schnell wieder da ist, dann kann das, kann das relativ flott gehen.

00:17:41.220 --> 00:17:43.040
Das ist ja sehr schön.

00:17:43.040 --> 00:17:43.660
Nicht schlecht.

00:17:43.660 --> 00:17:53.260
Ja, äh, äh, jedenfalls, genau, der hat auch irgendwas, äh, der hat tolle Sachen erzählt, der arbeitet irgendwie bei, äh, Eventbrite und also zum Beispiel eine Geschichte, wo ich dachte so, hätte ich nie gedacht, dass Leute damit Probleme kriegen können,

00:17:53.260 --> 00:18:03.660
ist, dass sie teilweise sehr schnell, äh, darauf reagieren müssen, wenn sich irgendwie Traffic, Traffic ändert bei ihnen, weil manchmal kommen so, kriegen sie sehr kurz,

00:18:03.820 --> 00:18:06.460
Bescheid gesagt und dann, ähm, sehr viel, sehr viel Traffic.

00:18:06.460 --> 00:18:10.620
300.000 Leute wollen in den nächsten 15 Sekunden unseren Service.

00:18:10.620 --> 00:18:11.160
Ja.

00:18:11.160 --> 00:18:17.560
Und da müssen sie halt entsprechend Maschinen hochfahren oder, oder, oder zumindest irgendwie neue Applikationsserver oder so für eine bestimmte Geschichte.

00:18:17.560 --> 00:18:21.700
Und, äh, sie haben das Problem, dass Django bei ihnen sehr langsam mittlerweile startet.

00:18:21.700 --> 00:18:27.740
Also das ist halt auch so ein, äh, Eventbrite hat irgendwie so knapp über eine Million Zeilen Python-Code.

00:18:27.740 --> 00:18:29.200
In Django.

00:18:29.200 --> 00:18:30.480
Und ist ein Django-Projekt, ja.

00:18:30.480 --> 00:18:33.780
Äh, und, ähm, das startet relativ langsam.

00:18:33.780 --> 00:18:35.040
Äh, Eventbrite kennt ihr doch, oder?

00:18:35.040 --> 00:18:35.720
Ja, ja, kennt ihr.

00:18:35.720 --> 00:18:38.740
Ja, das ist, denke ich, auch, äh, bekannte Geschichte.

00:18:38.740 --> 00:18:45.480
Und, äh, das Ding braucht halt mindestens 30 Sekunden zum Starten, weil das einfach so lange dauert, bis die ganzen Imports aufgelöst sind.

00:18:45.480 --> 00:18:48.180
Also, oh Gott, oh Gott, oh Gott, ja.

00:18:48.180 --> 00:18:50.280
Da musst du 30 Sekunden vorher wissen, was passiert.

00:18:50.280 --> 00:18:50.500
Hm.

00:18:50.500 --> 00:18:56.080
Ja, und dann, das Problem ist, du kannst es halt nicht optimieren.

00:18:56.080 --> 00:19:00.440
Das ist halt, äh, wenn die Imports so lange dauern, dann dauert es halt so lange, dann kannst du nicht viel machen.

00:19:00.440 --> 00:19:02.500
Das ist natürlich schon bitter.

00:19:03.740 --> 00:19:09.060
Ja, aber, äh, das geht ja auch nicht.

00:19:09.060 --> 00:19:24.360
Äh, ja, hm, also, hoffentlich, äh, also, ja, muss man schon sagen, dass, äh, hm, ja, vielleicht dann doch irgendwie an der Zeit dann mal so den Monolith, äh, monolithischen Ansatz irgendwie, äh, was heißt das?

00:19:24.360 --> 00:19:27.120
Es gibt ja mehrere, mehrere Optionen, wie man sowas aus, ausmisten kann, ne?

00:19:27.120 --> 00:19:29.420
Irgendwo ab und zu mal ein paar Sachen abfackeln, gucken, was noch stehen bleibt.

00:19:29.420 --> 00:19:33.700
Oder, äh, mal wirklich mühevoll drangehen, alles neu umsortieren.

00:19:33.700 --> 00:19:34.640
Hm, das ist halt die Frage.

00:19:34.640 --> 00:19:37.380
Wie lange dauert so ein Refactoring, wenn du dann komplett auf...

00:19:37.380 --> 00:19:38.740
Ja, aber du kannst, du kannst nicht viel machen.

00:19:38.740 --> 00:19:40.240
Also, Refactoring hilft dir auch nicht.

00:19:40.240 --> 00:19:41.700
Ja, aber alle Features erstmal rausschmeißen.

00:19:41.700 --> 00:19:44.220
Ja, du kannst ja die ganzen Features streichen, aber das ist natürlich auch...

00:19:44.220 --> 00:19:48.180
Ja, aber du könntest ja zum Beispiel, kannst du nicht sowas machen wie Features nur dann laden, wenn du sie wirklich brauchst?

00:19:48.180 --> 00:19:51.740
Und dann dafür irgendwelche extra Requests machen, weil die ganzen Wartesachen vielleicht brauchen die gar nicht.

00:19:51.740 --> 00:20:01.500
Ja, also, bei, bei Django ist es so, da werden deine Installed-Apps, die werden alle importiert, da, äh, du kannst es, soweit ich weiß, auch später nicht ändern.

00:20:01.500 --> 00:20:03.660
Du kannst nicht sagen, jetzt irgendwas in der Installed-App sind.

00:20:03.660 --> 00:20:06.480
Dann zufügen, dynamisch, also, wahrscheinlich geht es schon, doch.

00:20:06.480 --> 00:20:09.920
Wenn man, wenn man sich da genug Mühe gibt, dann kriegt man das wahrscheinlich hin.

00:20:09.920 --> 00:20:12.800
Aber das ist so nicht, sondern das passiert beim Starten.

00:20:12.800 --> 00:20:19.300
Da wird, gehen, genau, wenn die ganzen Installed-Apps gehen, dann geht, geht man durch und importiert die ganzen Dinger.

00:20:19.300 --> 00:20:20.260
Hm.

00:20:20.260 --> 00:20:23.380
Ja, falls jetzt noch jemand zuhört, der neugierig ist, freut sich.

00:20:23.380 --> 00:20:24.240
Achso, ja, genau.

00:20:24.240 --> 00:20:29.120
Ey, Moment, wir sind noch nicht ganz, ganz durch mit den, äh, äh, Geschichten.

00:20:29.120 --> 00:20:33.120
Äh, was haben wir denn, äh, was haben wir denn noch, ähm...

00:20:33.620 --> 00:20:35.400
Nee, oder sind wir doch durch?

00:20:35.400 --> 00:20:36.100
Hattest du noch irgendwas?

00:20:36.100 --> 00:20:37.660
Nö, gerade für jetzt.

00:20:37.660 --> 00:20:39.680
Alles klar, okay, dann haben wir doch, sind wir doch mit dem News-Teil durch.

00:20:39.680 --> 00:20:40.040
Alles klar.

00:20:40.040 --> 00:20:41.060
Ja, ja, ja.

00:20:41.060 --> 00:20:41.700
Okay.

00:20:41.700 --> 00:20:42.460
Hm.

00:20:42.460 --> 00:20:51.100
Dann mache ich hier mal Kapitelmarke zu, äh, ähm, ja, zum eigentlichen Thema.

00:20:51.100 --> 00:20:53.180
Und, ähm...

00:20:53.180 --> 00:20:56.000
Ja, wir wollten natürlich jetzt erklären, was naiv-based denn ist.

00:20:56.000 --> 00:20:56.800
Was macht das denn?

00:20:56.800 --> 00:20:58.000
Wofür braucht man das denn?

00:20:58.000 --> 00:21:02.000
Und, äh, erst mal ist das, erst mal, glaube ich, so eine Beschreibung einfach nur für so ein statistisches...

00:21:02.000 --> 00:21:03.580
Ja, äh, also die...

00:21:03.580 --> 00:21:07.000
Base, Base-Riegel, äh, kennt man ja vielleicht, äh...

00:21:07.000 --> 00:21:08.420
Kennt man das?

00:21:08.420 --> 00:21:09.940
Ja, warte, lass mich nochmal...

00:21:09.940 --> 00:21:18.000
Ja, das geht ja, also bedingte Wahrscheinlichkeiten und, äh, bedingte Wahrscheinlichkeiten von Ereignissen berechnet, die in der Zukunft stattfinden.

00:21:18.000 --> 00:21:23.220
Oder anhand dessen von der Eintrittswahrscheinlichkeit, die in der Vergangenheit, die man schon kannte, von ähnlichen Dingen.

00:21:23.220 --> 00:21:26.000
Und, ja, dann kann man die miteinander kombinieren.

00:21:26.000 --> 00:21:29.940
Also, Base, Base-Theorem ist eigentlich einfach nur...

00:21:29.940 --> 00:21:32.620
Wir gucken jetzt nicht wirklich bei Wikipedia nach und lesen Wikipedia vor, oder?

00:21:32.620 --> 00:21:33.540
Nein.

00:21:33.540 --> 00:21:35.120
Wie das? So ein Kibitz.

00:21:35.120 --> 00:21:36.170
zu und das gefetzt ist.

00:21:36.170 --> 00:21:38.370
Naja,

00:21:38.370 --> 00:21:40.850
also ja, im Grunde ist das einfach nur eine

00:21:40.850 --> 00:21:41.970
Möglichkeit, wie man halt

00:21:41.970 --> 00:21:44.670
sozusagen, ja,

00:21:44.670 --> 00:21:47.090
die Wahrscheinlichkeiten umdrehen kann.

00:21:47.090 --> 00:21:49.110
Also man weiß

00:21:49.110 --> 00:21:50.190
halt die Wahrscheinlichkeit

00:21:50.190 --> 00:21:52.570
von B,

00:21:52.570 --> 00:21:54.790
wenn A, ja, und jetzt muss man das irgendwie umdrehen.

00:21:54.790 --> 00:21:56.890
Dafür gibt es halt diese Regel, die das dann sagt, wie das geht.

00:21:56.890 --> 00:21:58.830
Ja, nur mal als Beispiel, was kann man das denn?

00:21:58.830 --> 00:22:00.830
Also ihr habt jetzt ein Kartenspiel oder sowas,

00:22:00.830 --> 00:22:02.750
ja, die Wahrscheinlichkeit dafür, dass ihr einen König zieht,

00:22:02.750 --> 00:22:04.850
wie viel ist das denn? 4,52

00:22:04.850 --> 00:22:05.510
oder so, ne?

00:22:05.510 --> 00:22:08.690
Und dann willst du halt wissen, wie hoch die Wahrscheinlichkeit ist,

00:22:08.690 --> 00:22:10.570
dass du ein Bild ziehst und dann hast du wie viel?

00:22:10.570 --> 00:22:12.010
Dreimal,

00:22:12.010 --> 00:22:14.650
4,52 und dann kannst du dir überlegen,

00:22:14.650 --> 00:22:16.870
ja, die Wahrscheinlichkeit,

00:22:16.870 --> 00:22:18.290
dass du einen König ziehst und es ein Bild ist.

00:22:18.290 --> 00:22:20.350
Dann hast du die Wahrscheinlichkeit, dass es ein Bild ist

00:22:20.350 --> 00:22:21.750
und die Wahrscheinlichkeit, dass es ein König ist und andersrum.

00:22:21.750 --> 00:22:24.130
Ja.

00:22:24.130 --> 00:22:25.950
Aber die Wahrscheinlichkeit, dass es ein Bild ist

00:22:25.950 --> 00:22:28.170
und die Bedingung, dass es ein König ist, ist halt 1,

00:22:28.170 --> 00:22:30.730
weil jeder König ein Bild ist und andersrum kannst du dann halt

00:22:30.730 --> 00:22:31.930
ausrechnen, was kommt denn da raus.

00:22:32.430 --> 00:22:34.710
Ja, also verknüpfst du halt die beiden Wahrscheinlichkeiten

00:22:34.710 --> 00:22:36.370
mit den Ereignissen und so kann man ein bisschen

00:22:36.370 --> 00:22:38.550
in die Zukunft schauen. Das ist ja das, was die Statistiker

00:22:38.550 --> 00:22:39.050
so gerne tun.

00:22:39.050 --> 00:22:41.050
Darüber reibeln.

00:22:41.050 --> 00:22:44.470
Ja, wir haben eine Eintrittswahrscheinlichkeit, die würden wir gerne bestimmen

00:22:44.470 --> 00:22:46.070
anhand von, ja,

00:22:46.070 --> 00:22:48.350
Features und das ist ja das, was uns dann hinterher

00:22:48.350 --> 00:22:50.230
dann in diesem Machine Learning Ding, glaube ich, am meisten

00:22:50.230 --> 00:22:52.210
interessiert, wie man aus diesem einfachen

00:22:52.210 --> 00:22:53.990
Beispiel von

00:22:53.990 --> 00:22:56.250
Feature-Dingern, ich glaube, wir haben gesagt,

00:22:56.250 --> 00:22:58.350
wir machen das anhand diesem Spam-Beispiel, das heißt, es geht darum,

00:22:58.350 --> 00:23:00.170
glaube ich, welche Worte

00:23:00.170 --> 00:23:01.770
da kommen.

00:23:02.110 --> 00:23:03.350
Im Grunde sind halt die,

00:23:03.350 --> 00:23:05.430
was man halt weiß, ist

00:23:05.430 --> 00:23:08.350
sozusagen die Wahrscheinlichkeit,

00:23:08.350 --> 00:23:11.970
dass wenn man bestimmte Worte

00:23:11.970 --> 00:23:14.110
sieht, ob das jetzt Spam ist oder nicht, man möchte es halt umdrehen,

00:23:14.110 --> 00:23:15.250
man möchte halt sagen können,

00:23:15.250 --> 00:23:17.870
ja, wenn ich jetzt diese

00:23:17.870 --> 00:23:19.950
Nachricht mit den Worten gesehen habe, welche Wahrscheinlichkeit habe ich

00:23:19.950 --> 00:23:20.290
denn jetzt?

00:23:20.290 --> 00:23:23.710
Ja, das ist das Gute an, deswegen ist das ja auch naiv,

00:23:23.710 --> 00:23:25.490
weil man

00:23:25.490 --> 00:23:27.770
tut so, als wären die unabhängig voneinander, als wäre ein Wort

00:23:27.770 --> 00:23:29.850
entweder Spam oder nicht. Genau, und das ist

00:23:29.850 --> 00:23:31.790
natürlich nicht so richtig, das stimmt nicht

00:23:31.790 --> 00:23:33.670
und man darf das nicht einfach so alles aufmultiplizieren.

00:23:33.670 --> 00:23:35.790
Man kann auch Idiot-Base sagen oder so

00:23:35.790 --> 00:23:36.110
eine Scheiße.

00:23:36.110 --> 00:23:41.530
Ja, aber es funktioniert tatsächlich relativ gut.

00:23:41.530 --> 00:23:43.970
Genau, das ist ja auch

00:23:43.970 --> 00:23:45.990
irgendwie sozusagen der erste

00:23:45.990 --> 00:23:47.870
funktionierende Ansatz gewesen, um irgendwie mit

00:23:47.870 --> 00:23:49.130
diesem Spam-Ding fertig zu werden.

00:23:49.130 --> 00:23:52.110
2004, Programme, Plan for Spam.

00:23:52.110 --> 00:23:55.730
Ich habe das jetzt ehrlich gesagt gar nicht so

00:23:55.730 --> 00:23:57.770
deswegen gewählt, weil das für Machine Learning so eine

00:23:57.770 --> 00:23:59.570
interessante Geschichte ist, weil eigentlich ist es das nicht.

00:23:59.570 --> 00:24:01.550
Das verwendet man, ja,

00:24:01.630 --> 00:24:03.870
also Bildklassifikation,

00:24:03.870 --> 00:24:05.810
so einfache Dinge, ja, nein, bist du drauf,

00:24:05.810 --> 00:24:07.470
nicht? Nein. Ist mein Gesicht drauf, nicht?

00:24:07.470 --> 00:24:08.870
Kann ich nicht mit Base machen?

00:24:08.870 --> 00:24:11.450
Nee, da wird es wahrscheinlich eher, das wird schon nicht mehr gehen.

00:24:11.450 --> 00:24:14.870
Aber

00:24:14.870 --> 00:24:17.250
es ist trotzdem interessant, und zwar, also

00:24:17.250 --> 00:24:18.830
ich habe das vor allen Dingen deswegen

00:24:18.830 --> 00:24:21.410
mir jetzt nochmal angeguckt, beziehungsweise überlegt, dass das ein

00:24:21.410 --> 00:24:22.450
gutes Beispiel wäre, weil

00:24:22.450 --> 00:24:25.590
ich ein Beispiel haben wollte für

00:24:25.590 --> 00:24:26.490
etwas, was man in

00:24:26.490 --> 00:24:29.650
Pure Python sozusagen machen kann,

00:24:29.650 --> 00:24:31.370
wo man nur die simplen Daten,

00:24:31.470 --> 00:24:33.070
Strukturen irgendwie nimmt, die man

00:24:33.070 --> 00:24:35.050
halt irgendwie so dabei hat, also

00:24:35.050 --> 00:24:36.430
Skalare, Listen,

00:24:36.430 --> 00:24:38.470
ja, oder beziehungsweise

00:24:38.470 --> 00:24:41.050
Strings als eine Form von irgendwie

00:24:41.050 --> 00:24:43.110
Variablen, die jetzt halt einen bestimmten Wert haben,

00:24:43.110 --> 00:24:44.950
Listen,

00:24:44.950 --> 00:24:46.870
Dictionaries,

00:24:46.870 --> 00:24:48.670
und das war es eigentlich.

00:24:48.670 --> 00:24:49.990
Und mehr braucht man gar nicht.

00:24:49.990 --> 00:24:53.130
Und man hat halt dann noch Funktionen, die man

00:24:53.130 --> 00:24:55.310
irgendwie aufruft, und das war es.

00:24:55.310 --> 00:24:57.050
Und das ist halt...

00:24:57.050 --> 00:24:59.210
Ihr seht, wir sind bei einer brutalen Einstecker-Folge

00:24:59.210 --> 00:25:00.710
angekommen. Ja, eigentlich schon.

00:25:01.310 --> 00:25:02.990
Ja, also das ist halt das

00:25:02.990 --> 00:25:05.610
Interessante, dass man damit halt so wahnsinnig

00:25:05.610 --> 00:25:07.530
viel machen kann. Und das ist halt

00:25:07.530 --> 00:25:09.450
etwas, was ich gerne irgendwie vermitteln würde,

00:25:09.450 --> 00:25:11.670
weil das, also wenn man das hinkriegt,

00:25:11.670 --> 00:25:12.570
wenn man das versteht,

00:25:12.570 --> 00:25:14.690
dann hat man schon ganz viel,

00:25:14.690 --> 00:25:17.530
ja. Okay, das heißt, anhand Python lernen,

00:25:17.530 --> 00:25:19.290
ein bisschen anhand von Jochen's Beispiel,

00:25:19.290 --> 00:25:21.110
mit dem man auch Machine Learning machen kann,

00:25:21.110 --> 00:25:23.590
und zwar er hat ein Notebook, hast du auch

00:25:23.590 --> 00:25:25.570
auf deinem GitHub? Genau, das kann ich

00:25:25.570 --> 00:25:27.090
dann auch in den Show Notes verlinken, wo da halt

00:25:27.090 --> 00:25:29.170
dieses Notebook drin ist, und sich das mal angucken

00:25:29.170 --> 00:25:31.150
kann. Ich benutze

00:25:31.150 --> 00:25:32.770
einfach irgendwie, es gibt so ein SMS

00:25:32.770 --> 00:25:35.110
Spam-Dataset

00:25:35.110 --> 00:25:36.110
über Kekkel.

00:25:36.110 --> 00:25:38.950
Das habe ich mir runtergeladen, irgendwie auf meinen

00:25:38.950 --> 00:25:41.250
S3 gepackt, und das Notebook

00:25:41.250 --> 00:25:43.310
zieht sich das davon einfach und lädt das runter,

00:25:43.310 --> 00:25:45.070
und dann hat man das. Das ist nicht so viel, das sind

00:25:45.070 --> 00:25:46.870
irgendwie... Warte, lass mich mal grad gucken.

00:25:46.870 --> 00:25:49.030
Ich werde die Stadt, das ist dieses Ding hier auch einfach mal erstmal neu.

00:25:49.030 --> 00:25:50.610
Okay, grad...

00:25:50.610 --> 00:25:53.110
Okay, lad das mal

00:25:53.110 --> 00:25:54.590
runter, das sind irgendwie nur so 200 Kilobyte.

00:25:54.590 --> 00:25:57.090
Okay, so.

00:25:57.090 --> 00:25:58.910
Dann parseln wir das mal.

00:26:00.990 --> 00:26:02.750
So. Okay, wie

00:26:02.750 --> 00:26:04.230
viele Nachrichten haben wir denn da drin?

00:26:04.230 --> 00:26:08.830
5.500

00:26:08.830 --> 00:26:11.190
und

00:26:11.190 --> 00:26:13.210
davon sind

00:26:13.210 --> 00:26:15.050
ich weiß jetzt gar nicht genau, wie viele

00:26:15.050 --> 00:26:18.750
1.500 sind...

00:26:18.750 --> 00:26:20.770
Ah, nee, ich weiß nicht, ihr müsst ja nachgucken.

00:26:20.770 --> 00:26:21.990
Also es sind deutlich mehr

00:26:21.990 --> 00:26:24.950
Hemm als Spam, aber...

00:26:24.950 --> 00:26:26.930
Ein Schinken? Ja, genau.

00:26:30.830 --> 00:26:32.410
Und, ähm...

00:26:32.410 --> 00:26:34.170
Ja, aber es sind halt eigentlich nicht viele

00:26:34.170 --> 00:26:36.550
Datenpunkte oder Beobachtungen,

00:26:36.550 --> 00:26:38.350
sozusagen, wenn man jetzt so heutige Maßstäbe anlegt,

00:26:38.350 --> 00:26:40.410
aber es ist auf jeden Fall ein

00:26:40.410 --> 00:26:42.330
Datastat, wenn man schon so ein bisschen was machen kann, und

00:26:42.330 --> 00:26:44.410
ja, es tut halt auch nicht weh, wenn man es irgendwo hin runterlädt.

00:26:44.410 --> 00:26:46.370
Ja, du konntest ja auch erstmal so ein bisschen Handling

00:26:46.370 --> 00:26:48.390
dafür bekommen, wie funktioniert das denn mit der

00:26:48.390 --> 00:26:50.430
Klassifikation, wenn ich jetzt so zwei Dinge

00:26:50.430 --> 00:26:52.230
habe, die ich voneinander trennen möchte, ne? Genau.

00:26:52.230 --> 00:26:54.370
Dieses Ding, das Beispiel hier würde übrigens auch

00:26:54.370 --> 00:26:56.230
für, äh,

00:26:56.230 --> 00:26:58.330
sozusagen beliebig, also ganz beliebig vielleicht

00:26:58.330 --> 00:27:00.390
nicht, aber mehr als zwei auf jeden Fall auch

00:27:00.390 --> 00:27:02.350
funktionieren, also ganz genauso. Also aber

00:27:02.350 --> 00:27:04.750
es wäre Multiklass-Klassifikation,

00:27:04.750 --> 00:27:06.410
das heißt, man würde hinterher

00:27:06.410 --> 00:27:08.310
sozusagen die bestpassendste Klasse

00:27:08.310 --> 00:27:09.890
rausfallen, man würde nicht mehrere

00:27:09.890 --> 00:27:12.250
äh, äh, Klassen,

00:27:12.250 --> 00:27:14.410
zu denen jetzt irgendwas gehört, bekommen. Also man

00:27:14.410 --> 00:27:15.770
könnte sich ja vorstellen, es gibt jetzt nicht nur

00:27:15.770 --> 00:27:18.470
äh, Spam und Hemm, sondern es gibt auch noch

00:27:18.470 --> 00:27:19.750
irgendwie Newsletter oder

00:27:19.750 --> 00:27:22.730
irgendwie Notifikationen

00:27:22.730 --> 00:27:24.110
von irgendwelchen Social Networks oder sowas.

00:27:24.110 --> 00:27:26.090
Ah, das Spam. Ja,

00:27:26.090 --> 00:27:28.370
aber vielleicht möchte man das ja aus welchen Gründen auch

00:27:28.370 --> 00:27:30.290
immer irgendwie feiner unterteilen, und, ähm,

00:27:30.350 --> 00:27:32.410
die Notifikationen sehen, die dich irgendwie

00:27:32.410 --> 00:27:34.370
dahin latschen sollen, doch mal wieder ein bisschen Zeit

00:27:34.370 --> 00:27:36.070
irgendwie auf Facebook zu verbringen oder so.

00:27:36.070 --> 00:27:37.810
Ähm,

00:27:37.810 --> 00:27:39.710
und, äh,

00:27:39.710 --> 00:27:42.390
dann würde man jetzt mit dem Ansatz auch immer

00:27:42.390 --> 00:27:44.370
nur, äh, eine von den Klassen kriegen. Aber es

00:27:44.370 --> 00:27:46.490
könnte natürlich eben sein, dass es zum Beispiel eine Notifikation

00:27:46.490 --> 00:27:47.970
ist und Spam.

00:27:47.970 --> 00:27:50.630
Ja, also dann, weil das da rausfällt,

00:27:50.630 --> 00:27:52.310
ne? Weil Naive Base halt einfach sagt, nö,

00:27:52.310 --> 00:27:53.710
ich will jetzt nur eins haben.

00:27:53.710 --> 00:27:55.910
Also das wäre jetzt, also das, was wir,

00:27:55.910 --> 00:27:58.070
das, was in den Roadbooks drinsteht,

00:27:58.070 --> 00:28:00.230
da fällt halt hinterher eine Kategorie

00:28:00.230 --> 00:28:02.310
bei raus. Man könnte es auch so umbauen,

00:28:02.310 --> 00:28:04.250
dass es, dass es Multilabel kann,

00:28:04.250 --> 00:28:05.750
aber ist halt nicht so.

00:28:05.750 --> 00:28:07.890
Wir machen ja das eine Anfänger-Base. Wir machen jetzt eine

00:28:07.890 --> 00:28:09.010
einfache Spice-Base, genau.

00:28:09.010 --> 00:28:11.550
Also, genau, äh,

00:28:11.550 --> 00:28:14.230
so, was wir jetzt, was wir

00:28:14.230 --> 00:28:15.910
jetzt da zuerst machen, ist das halt

00:28:15.910 --> 00:28:17.870
in Training- und Test-Dinger aufzuteilen.

00:28:17.870 --> 00:28:19.290
Da habe ich das einfach zufällig getrennt nach,

00:28:19.290 --> 00:28:22.230
also 25% sind halt

00:28:22.230 --> 00:28:23.630
Test, äh, der Rest ist Training.

00:28:23.630 --> 00:28:25.930
Das ist 75, 75%.

00:28:25.930 --> 00:28:28.430
Und, ähm,

00:28:28.430 --> 00:28:30.210
ja, das, was ich jetzt eigentlich,

00:28:30.210 --> 00:28:31.710
sozusagen, äh,

00:28:31.710 --> 00:28:34.310
und das wäre natürlich

00:28:34.310 --> 00:28:36.290
schon schön, wenn man sich das irgendwie angucken würde,

00:28:36.290 --> 00:28:38.410
oder so, aber was ich jetzt eigentlich,

00:28:38.410 --> 00:28:39.910
äh, äh,

00:28:39.910 --> 00:28:42.130
zeigen wollen würde, ist,

00:28:42.130 --> 00:28:44.350
dass, äh, wie einfach das ist,

00:28:44.350 --> 00:28:45.710
äh,

00:28:45.710 --> 00:28:47.930
sozusagen ein Modell zu trainieren,

00:28:47.930 --> 00:28:50.490
das jetzt zwischen Spam und Nicht-Spam unterscheiden kann.

00:28:50.490 --> 00:28:51.950
Und zwar das schon relativ gut.

00:28:51.950 --> 00:28:53.970
Also dem ist einfach die bedingte Wahrscheinlichkeit

00:28:53.970 --> 00:28:56.150
vorhersagt, dass es, äh, Wörtern hält,

00:28:56.150 --> 00:28:58.290
die Spam sind, unter der Bindung, äh, könnte Spam

00:28:58.290 --> 00:28:59.710
sein. Ja. Ja.

00:29:00.210 --> 00:29:02.390
Äh, ich kann ja mal kurz versuchen, mit Worten

00:29:02.390 --> 00:29:04.370
zu beschreiben, wie dieser Trainingsprozess, äh,

00:29:04.370 --> 00:29:06.610
aussieht. Und der ist halt,

00:29:06.610 --> 00:29:08.290
man, äh, geht jetzt

00:29:08.290 --> 00:29:10.210
über alle, äh, Dokumente, die entweder

00:29:10.210 --> 00:29:12.210
Spam oder Ham sind, drüber. Die in den Trainingsdaten

00:29:12.210 --> 00:29:13.950
steht ja dran, ob es Spam ist oder nicht. Und guckt, ob Penis drinsteht.

00:29:13.950 --> 00:29:16.190
Ja, genau. Teilt, äh,

00:29:16.190 --> 00:29:18.790
das, äh, teilt, äh,

00:29:18.790 --> 00:29:20.410
irgendwie diese SMS halt auf

00:29:20.410 --> 00:29:21.970
in die Wörter, aus denen sie besteht.

00:29:21.970 --> 00:29:24.410
Äh. Und da guckt man in

00:29:24.410 --> 00:29:26.330
alle, also man hat ja Trainingsdaten, wo halt drinsteht,

00:29:26.330 --> 00:29:28.230
dass es Spam ist oder es nicht Spam ist. Genau. Und wenn

00:29:28.230 --> 00:29:30.190
man jetzt sagt, okay, in denen, wo es

00:29:30.190 --> 00:29:32.290
Spam ist, kommt 50 Mal Penis vor und

00:29:32.290 --> 00:29:34.270
in denen, wo nicht Spam ist, kommt nur einmal Penis

00:29:34.270 --> 00:29:35.970
vor, dann hat man so eine bedingte Wahrscheinlichkeit.

00:29:35.970 --> 00:29:38.210
Ah, die Wahrscheinlichkeit, dass Penis vorkommt und es

00:29:38.210 --> 00:29:40.090
kein Spam ist und die Wahrscheinlichkeit, dass Penis drin vorkommt, ist

00:29:40.090 --> 00:29:42.070
Spam ist. Und daraus hat man jetzt auch

00:29:42.070 --> 00:29:44.090
nach Base so eine kombinatorische

00:29:44.090 --> 00:29:45.530
Möglichkeit, sich das rauszurichten.

00:29:45.530 --> 00:29:48.410
Genau. Man hat jetzt für jedes einzelne

00:29:48.410 --> 00:29:49.910
Wort eine Wahrscheinlichkeit dafür,

00:29:49.910 --> 00:29:52.210
dass dieses

00:29:52.210 --> 00:29:54.030
Wort irgendwie in dieser Kategorie

00:29:54.030 --> 00:29:56.310
vorkommt. Genau. Sozusagen. Das ist einfach die Frequenz

00:29:56.310 --> 00:29:58.110
von dem Wort in der Kategorie. Also wenn

00:29:58.110 --> 00:30:00.170
halt, äh, äh,

00:30:00.170 --> 00:30:02.490
ähm, ja, ähm,

00:30:02.490 --> 00:30:04.250
also man muss das natürlich immer noch eben

00:30:04.250 --> 00:30:05.730
teilen durch die Anzahl der Worte, die überhaupt

00:30:05.730 --> 00:30:08.170
irgendwie in der Kategorie vorgekommen sind. Deswegen muss man sich das

00:30:08.170 --> 00:30:10.090
halt auch noch merken. Also was man tut, ist, man geht halt über

00:30:10.090 --> 00:30:12.010
alle Dokumente, merkt sich, okay,

00:30:12.010 --> 00:30:14.170
äh, wie viel, äh,

00:30:14.170 --> 00:30:15.970
Wörter habe ich denn jetzt

00:30:15.970 --> 00:30:18.170
bisher gesehen für die, ähm,

00:30:18.170 --> 00:30:20.070
Klasse Spam

00:30:20.070 --> 00:30:22.190
oder Ham und zählt das dann halt

00:30:22.190 --> 00:30:24.110
hoch. Je nachdem, ob das... Haben wir heute

00:30:24.110 --> 00:30:25.890
schon mal Penis gesagt? Entschuldige, bitte.

00:30:25.890 --> 00:30:28.150
Ich war halbart. Oh, wir fliegen bei

00:30:28.150 --> 00:30:28.930
iTunes raus, Mann.

00:30:30.170 --> 00:30:32.530
Ah, wo, wir sind auf iTunes?

00:30:32.530 --> 00:30:34.430
Na gut. Keine Ahnung.

00:30:34.430 --> 00:30:36.610
Nee, ich glaube nicht, aber...

00:30:36.610 --> 00:30:38.730
Das könnte

00:30:38.730 --> 00:30:40.390
eine sehr gefährliche Folge werden. Wir lesen

00:30:40.390 --> 00:30:42.530
keine Spam-Geschichten vor. Na gut.

00:30:42.530 --> 00:30:44.910
Auch wenn wir damit reich werden können.

00:30:44.910 --> 00:30:46.330
Reich werden?

00:30:46.330 --> 00:30:48.090
Nee, das ist ein altes, altes

00:30:48.090 --> 00:30:49.170
SMS-Spam.

00:30:49.170 --> 00:30:51.830
Okay, wir denken euch gerade ab davon.

00:30:51.830 --> 00:30:54.370
Also, das, was eigentlich,

00:30:54.370 --> 00:30:56.390
was man da eigentlich macht, ist, man geht halt über

00:30:56.390 --> 00:30:58.570
alle Wörter drüber und merkt sich halt sozusagen

00:30:58.570 --> 00:31:00.150
für das entsprechende

00:31:00.150 --> 00:31:01.910
Label, was man gerade gesehen hat, irgendwie

00:31:01.910 --> 00:31:04.210
ja, man hat jetzt,

00:31:04.210 --> 00:31:06.310
man zählt da halt hoch, wie viele Wörter

00:31:06.310 --> 00:31:07.490
hat man in dieser Kategorie überhaupt gesehen

00:31:07.490 --> 00:31:10.250
und man zählt jetzt sozusagen

00:31:10.250 --> 00:31:12.230
noch hoch quasi

00:31:12.230 --> 00:31:13.770
welche Worte man

00:31:13.770 --> 00:31:16.070
wie oft gesehen hat in dieser Kategorie. Und dann kann man

00:31:16.070 --> 00:31:18.150
hinterher sagen, okay, wenn ich jetzt

00:31:18.150 --> 00:31:20.470
eben

00:31:20.470 --> 00:31:22.190
in der Kategorie

00:31:22.190 --> 00:31:24.290
Spam 10 Mal Penis

00:31:24.290 --> 00:31:26.310
gesehen habe und ich habe insgesamt 1000

00:31:26.310 --> 00:31:27.810
Wörter gesehen,

00:31:27.810 --> 00:31:29.230
unterschiedliche Wörter, dann

00:31:29.230 --> 00:31:30.130
ist...

00:31:30.150 --> 00:31:32.050
ist die Wahrscheinlichkeit, dass es Spam ist,

00:31:32.050 --> 00:31:32.670
wenn ich jetzt

00:31:32.670 --> 00:31:36.090
das Wort Penis sehe,

00:31:36.090 --> 00:31:38.110
ist es halt, was ist das dann?

00:31:38.110 --> 00:31:39.590
Ein Prozent oder sowas.

00:31:39.590 --> 00:31:42.070
Ich habe jetzt nicht genau mitgerechnet,

00:31:42.070 --> 00:31:42.950
aber...

00:31:42.950 --> 00:31:44.770
Ja, es ist immer blöd sowas.

00:31:44.770 --> 00:31:47.310
Also, genau.

00:31:47.310 --> 00:31:49.850
Und das macht man jetzt, also

00:31:49.850 --> 00:31:51.370
nochmal, ich gehe einfach jetzt...

00:31:51.370 --> 00:31:52.530
Verdammt, das ist gar nicht so einfach.

00:31:52.530 --> 00:31:55.710
Also, die Trainingsfunktion ist einfach nur,

00:31:55.710 --> 00:31:58.090
ja, man geht über

00:31:58.090 --> 00:31:59.470
alle Dokumente drüber, zählt

00:31:59.470 --> 00:32:01.790
für das Label halt

00:32:01.790 --> 00:32:03.990
hoch, wie viele Dokumente man...

00:32:03.990 --> 00:32:06.170
Ach, Quatsch,

00:32:06.170 --> 00:32:07.330
jetzt habe ich das auch noch falsch erklärt.

00:32:07.330 --> 00:32:09.970
Ja, da musst du nochmal von vorne anfangen.

00:32:09.970 --> 00:32:10.650
Ja.

00:32:10.650 --> 00:32:14.050
Was man

00:32:14.050 --> 00:32:15.730
eigentlich...

00:32:15.730 --> 00:32:17.030
Du wusstest, dass du Landfahrer warst?

00:32:17.030 --> 00:32:19.370
Ja, ja, natürlich. Landfahrer.

00:32:19.370 --> 00:32:21.970
Dazu kann ich was erzählen.

00:32:21.970 --> 00:32:23.590
Mit

00:32:23.590 --> 00:32:25.310
Diveways habe ich offenbar keine Ahnung von,

00:32:25.310 --> 00:32:27.170
aber, nee, das ist eine

00:32:27.170 --> 00:32:29.310
ganz, ganz, das ist eine ultrainteressante

00:32:29.470 --> 00:32:29.810
Geschichte,

00:32:29.810 --> 00:32:32.490
dass in,

00:32:32.490 --> 00:32:33.990
also im

00:32:33.990 --> 00:32:36.790
in England

00:32:36.790 --> 00:32:39.490
gab es halt diese Kaste der Landfahrer, die waren reich.

00:32:39.490 --> 00:32:41.770
Das, wenn man

00:32:41.770 --> 00:32:43.430
zum Beispiel, na, wie heißt das?

00:32:43.430 --> 00:32:45.610
Eine Abtei,

00:32:45.610 --> 00:32:46.370
ein Gutshof.

00:32:46.370 --> 00:32:49.190
Priorei,

00:32:49.190 --> 00:32:49.830
wenn es darum geht.

00:32:49.830 --> 00:32:50.550
Wie hieß

00:32:50.550 --> 00:32:53.890
dieses Buch nochmal?

00:32:53.890 --> 00:32:56.190
Pride and Prejudice.

00:32:56.190 --> 00:32:56.970
Genau.

00:32:56.970 --> 00:32:58.550
Also, ich frage so, irgendwie, ja,

00:32:58.550 --> 00:32:59.450
das spielt ja so ein bisschen,

00:32:59.470 --> 00:33:02.570
ja, eigentlich

00:33:02.570 --> 00:33:03.650
ein gutes Buch, kann ich empfehlen.

00:33:03.650 --> 00:33:06.690
Und dann kommt da plötzlich

00:33:06.690 --> 00:33:08.710
dieser Pfarrer, wie kann das sein?

00:33:08.710 --> 00:33:09.590
Das gehört doch eigentlich gar nicht dazu.

00:33:09.590 --> 00:33:12.550
Die spielten da mit.

00:33:12.550 --> 00:33:14.610
Das war eine Klasse von Leuten, die relativ

00:33:14.610 --> 00:33:16.290
viel verdient haben

00:33:16.290 --> 00:33:18.550
für die damaligen Verhältnisse, oder

00:33:18.550 --> 00:33:20.210
waren halt so uns.

00:33:20.210 --> 00:33:21.790
Sie mussten praktisch nichts tun dafür.

00:33:21.790 --> 00:33:23.650
Voll gut.

00:33:23.650 --> 00:33:25.350
Ab und zu mal vor der Kanzel, Herr Wunter.

00:33:25.350 --> 00:33:26.270
Und es gab sehr viele davon.

00:33:26.270 --> 00:33:29.450
Und das gab denen Zeit, sich mit allen möglichen,

00:33:29.470 --> 00:33:30.310
abseitigen,

00:33:30.310 --> 00:33:33.550
in allen möglichen

00:33:33.550 --> 00:33:35.290
Richtungen ihren Interessen nachzugehen.

00:33:35.290 --> 00:33:36.710
Das war schon ein bisschen Nachbrudertakt, oder?

00:33:36.710 --> 00:33:38.970
Ich stelle mir gerade so, wie jemand aussieht wie ich,

00:33:38.970 --> 00:33:40.490
mit so einem großen Fass am Bauch.

00:33:40.490 --> 00:33:43.170
Deutlich später.

00:33:43.170 --> 00:33:45.930
Aber es gibt Leute,

00:33:45.930 --> 00:33:47.830
die tatsächlich ernsthaft behaupten,

00:33:47.830 --> 00:33:49.250
dass das einer der Gründe dafür ist,

00:33:49.250 --> 00:33:51.970
warum die Industrialisierung irgendwie so abgehoben hat

00:33:51.970 --> 00:33:52.870
und warum so viele

00:33:52.870 --> 00:33:55.470
coole neue Sachen da irgendwie rausgekommen sind.

00:33:55.470 --> 00:33:57.150
Weil es gab halt eine Menge Leute, die hatten viel Zeit,

00:33:57.150 --> 00:33:58.970
viel Geld und echt nichts zu tun.

00:33:59.470 --> 00:34:02.230
Und dann haben die halt irgendwie sich einfach da so interessiert,

00:34:02.230 --> 00:34:04.610
wie baut man eine Dampfmaschine?

00:34:04.610 --> 00:34:06.050
Oder ich meine, Darwin war auch so jemand, ne?

00:34:06.050 --> 00:34:08.310
Also, ähm, ja.

00:34:08.310 --> 00:34:10.310
Bayes war so jemand.

00:34:10.310 --> 00:34:12.810
Mir fällt das jetzt nicht ein, aber es gab eine ganze Menge,

00:34:12.810 --> 00:34:14.690
eine ganze Menge der Leute, die jetzt so total bekannt sind,

00:34:14.690 --> 00:34:16.950
wo man sich denkt so, wow, die haben großartige Sachen gemacht.

00:34:16.950 --> 00:34:19.250
Waren Landfahrer in England.

00:34:19.250 --> 00:34:20.450
Ja, war gut.

00:34:20.450 --> 00:34:23.370
Ja, dritte rückwärts Induktion.

00:34:23.370 --> 00:34:25.790
Ja, äh, genau.

00:34:25.790 --> 00:34:29.190
Also, was ich jetzt gerade blödsinnigerweise falsch erzählt habe,

00:34:29.190 --> 00:34:30.630
ist, dass man sich nicht merkt,

00:34:30.630 --> 00:34:32.090
wie viele Worte jetzt in der Kategorie vorkommen,

00:34:32.090 --> 00:34:34.810
sondern merkt sich halt, wie viele Dokumente kommen jetzt

00:34:34.810 --> 00:34:35.930
pro Kategorie eigentlich vor.

00:34:35.930 --> 00:34:39.410
Und, äh,

00:34:39.410 --> 00:34:41.830
genau. Also, was man sich eigentlich merkt,

00:34:41.830 --> 00:34:42.670
ist, ähm,

00:34:42.670 --> 00:34:45.810
wie viele Dokumente hat man jetzt

00:34:45.810 --> 00:34:46.570
pro Kategorie gesehen?

00:34:46.570 --> 00:34:49.230
Und dann halt noch für jedes Wort da drin,

00:34:49.230 --> 00:34:51.750
sozusagen, wie oft kam denn dieses Wort in der Kategorie vor?

00:34:51.750 --> 00:34:54.050
Und dann hat man die Wahrscheinlichkeit,

00:34:54.050 --> 00:34:55.350
dass ein Wort vorgekommen ist,

00:34:55.350 --> 00:34:56.730
wie zum Beispiel ein Piep,

00:34:56.730 --> 00:34:58.510
unter der Bedingung, dass es Spam ist.

00:34:58.510 --> 00:34:58.810
Ja.

00:34:58.910 --> 00:35:01.810
Oder das Wort Piep, unter der Bedingung, dass es kein Spam ist.

00:35:01.810 --> 00:35:03.490
Und das hat man zwei bedingte Wahrscheinlichkeiten.

00:35:03.490 --> 00:35:05.710
Und daraus kann man jetzt mit der allgemeinen Wahrscheinlichkeit

00:35:05.710 --> 00:35:07.030
für das Vorkommen dieses Wortes

00:35:07.030 --> 00:35:10.090
rausrechnen, wie hoch die Wahrscheinlichkeit denn sein könnte.

00:35:10.090 --> 00:35:12.090
Genau. Aber das klingt halt alles

00:35:12.090 --> 00:35:14.090
irgendwie so relativ kompliziert, wenn man es so erklärt.

00:35:14.090 --> 00:35:15.450
In Code ist das sehr wenig Zeilen.

00:35:15.450 --> 00:35:17.050
Ja, das ist so ein bisschen Brain hin und her.

00:35:17.050 --> 00:35:19.550
Also, diese Train-Funktion, die hat halt,

00:35:19.550 --> 00:35:20.510
lass mich nicht lügen,

00:35:20.510 --> 00:35:24.090
eins, zwei, drei, vier, fünf, sechs, sieben Zeilen.

00:35:24.090 --> 00:35:25.450
Das ist alles.

00:35:25.450 --> 00:35:28.590
Und die sind alle relativ kurz.

00:35:28.630 --> 00:35:30.350
Also, keine von diesen Zeilen

00:35:30.350 --> 00:35:32.890
hat mehr als

00:35:32.890 --> 00:35:35.110
30 Characters oder sowas.

00:35:35.110 --> 00:35:36.770
Also, es ist wirklich sehr, sehr

00:35:36.770 --> 00:35:37.090
einfach.

00:35:37.090 --> 00:35:40.430
Und, ja, man kommt mit

00:35:40.430 --> 00:35:42.710
den ganz simplen Datenstrukturen.

00:35:42.710 --> 00:35:44.670
Ich habe jetzt an der Stelle Default-Stick genommen,

00:35:44.670 --> 00:35:46.690
weil das in Zellen halt schöner ist, als

00:35:46.690 --> 00:35:48.510
wenn man das normale Dick nimmt. Da muss man so oft Get schreiben.

00:35:48.510 --> 00:35:49.870
Aber was ist Default-Stick?

00:35:49.870 --> 00:35:52.310
Ach, das ist eine Bibliothek aus der Standardbibliothek.

00:35:52.310 --> 00:35:54.450
Nee, ja, es ist eine Standardbibliothek.

00:35:54.450 --> 00:35:56.430
Genau, und zwar aus dem

00:35:56.430 --> 00:35:57.390
Collections-Modul.

00:35:58.350 --> 00:36:00.070
Und was das macht, ist, dass man,

00:36:00.070 --> 00:36:02.190
also, das sollte man vielleicht schon kennen,

00:36:02.190 --> 00:36:03.750
beim Dict kann man sagen,

00:36:03.750 --> 00:36:06.510
irgendwie Dict.setDefault,

00:36:06.510 --> 00:36:08.230
dann gibt man

00:36:08.230 --> 00:36:10.050
einen Key an, dann halt der,

00:36:10.050 --> 00:36:12.310
ja, dann den Wert

00:36:12.310 --> 00:36:13.890
oder halt eine Datenstruktur,

00:36:13.890 --> 00:36:16.350
also ganz oft, was man halt macht

00:36:16.350 --> 00:36:18.070
oder früher gemacht hat, heute nimmt man wahrscheinlich

00:36:18.070 --> 00:36:20.190
Default-Stick, ist halt irgendwie, du hast

00:36:20.190 --> 00:36:20.630
halt

00:36:20.630 --> 00:36:24.290
irgendeinen Dict, einen Key

00:36:24.290 --> 00:36:26.250
und dann eine Liste von Sachen, die da dranhängen

00:36:26.250 --> 00:36:27.590
und dann sagst du irgendwie,

00:36:28.070 --> 00:36:30.110
dieses Dict.setDefault, irgendwie

00:36:30.110 --> 00:36:31.890
dein Key, Komma,

00:36:31.890 --> 00:36:33.950
ja, Ecke-Klammer auf, Ecke-Klammer zu,

00:36:33.950 --> 00:36:35.590
also Liste, Klammer zu, Punkt, Append,

00:36:35.590 --> 00:36:37.710
irgendwie da einen Wert rein.

00:36:37.710 --> 00:36:41.750
Das kann man auch machen, man kann

00:36:41.750 --> 00:36:44.090
das auch mit

00:36:44.090 --> 00:36:45.770
SetDefault machen, aber dann ist die Zeile

00:36:45.770 --> 00:36:47.990
relativ lang und dann wird es so ein bisschen eklig.

00:36:47.990 --> 00:36:49.090
Ich hoffe, ihr habt mitgeschrieben.

00:36:49.090 --> 00:36:51.990
Da halt ein Default-Dict

00:36:51.990 --> 00:36:53.810
macht das halt alles sehr viel einfacher und

00:36:53.810 --> 00:36:55.810
standardisiert das sozusagen, sagt man halt irgendwie,

00:36:55.810 --> 00:36:57.870
okay, wenn ich jetzt ein Default-Dict

00:36:57.870 --> 00:36:59.890
habe von List, dann macht

00:36:59.890 --> 00:37:01.850
es genau das und dann muss man nicht SetDefault die ganze Zeit

00:37:01.850 --> 00:37:03.730
sagen, sondern normalerweise würde

00:37:03.730 --> 00:37:05.850
ja, wenn ich ein Dict nehme und

00:37:05.850 --> 00:37:07.770
da einfach irgendwie ein Key reinsetze und

00:37:07.770 --> 00:37:09.650
dann dem irgendwie, dann sage Append

00:37:09.650 --> 00:37:11.830
irgendwas oder so oder dem Wertzuweiser,

00:37:11.830 --> 00:37:13.670
dann kracht es halt, weil das sagt dann halt Key-Error,

00:37:13.670 --> 00:37:14.830
die Key gibt es da gar nicht.

00:37:14.830 --> 00:37:19.910
Und wenn man ein Default-Dict nimmt, dann passiert das nicht.

00:37:19.910 --> 00:37:21.850
Also, weil er dann immer die leere Liste

00:37:21.850 --> 00:37:23.790
drin hat. Wenn es das noch nicht

00:37:23.790 --> 00:37:25.570
gibt, dann erzeugt er halt in dem Moment halt

00:37:25.570 --> 00:37:27.750
entsprechend eben eine Liste oder halt ein Integer,

00:37:27.750 --> 00:37:29.170
oder wenn man sagt Default-Dict von Int,

00:37:29.170 --> 00:37:31.410
dann wird halt, kann man halt sagen,

00:37:31.410 --> 00:37:31.890
irgendwie

00:37:31.890 --> 00:37:35.610
Dict, Ecke-Klammer auf, Key, Ecke-Klammer

00:37:35.610 --> 00:37:37.070
zu, plus gleich irgendwas,

00:37:37.070 --> 00:37:39.610
plus gleich eins zum Beispiel und zählt

00:37:39.610 --> 00:37:41.630
damit halt hoch, ohne dass es ein Key-Error

00:37:41.630 --> 00:37:43.630
gibt, auch wenn es den Key darin noch nicht gab, weil

00:37:43.630 --> 00:37:45.690
wenn es den Key nicht gibt,

00:37:45.690 --> 00:37:47.450
dann wird das halt erzeugt.

00:37:47.450 --> 00:37:49.650
Und zwar, ja.

00:37:49.650 --> 00:37:51.010
Schön, Default-Keys direkt mit den Keys.

00:37:51.010 --> 00:37:53.730
Hatte ich ja schon mal, dass ihr irgendwie auf einen Key zugreifen

00:37:53.730 --> 00:37:55.470
wolltet, in dessen ein Error gab und euer Programm

00:37:55.470 --> 00:37:57.010
durchgeflogen ist mit SetDefault.

00:37:57.630 --> 00:37:59.570
Das ist nicht passiert. Genau, also

00:37:59.570 --> 00:38:01.930
SetDefault hat man dann früher gemacht und heute

00:38:01.930 --> 00:38:03.990
denke ich, machen die meisten Leute tatsächlich, oder ich weiß es nicht,

00:38:03.990 --> 00:38:05.250
es ist ja interessant, Default-Dict

00:38:05.250 --> 00:38:08.050
und man kann das dann auch noch ineinander schachteln, also für die Counts

00:38:08.050 --> 00:38:09.830
der Wörter in den einzelnen Kategorien habe ich

00:38:09.830 --> 00:38:12.110
jetzt ein... Ah, das ist ja so unheimlich kompliziert,

00:38:12.110 --> 00:38:13.790
wenn man in Statistik irgendwie die ganzen bedingten

00:38:13.790 --> 00:38:15.870
Wahrscheinlichkeiten immer gegenseitig umdreht, aber hey, wir können

00:38:15.870 --> 00:38:17.090
Dicts ineinander schachteln, das ist doch schön.

00:38:17.090 --> 00:38:19.710
Ja. Jason hört sich das an, wie Jason.

00:38:19.710 --> 00:38:21.890
Ja, Dicts und Jason

00:38:21.890 --> 00:38:23.690
haben ja auch viel miteinander zu tun, also das ist ja sowas ganz

00:38:23.690 --> 00:38:25.670
ähnliches, es ist halt, könnte es Dicts

00:38:25.670 --> 00:38:27.490
als Jason rausrealisieren,

00:38:27.510 --> 00:38:29.430
also na gut, wenn es halt, du hast halt Objekte,

00:38:29.430 --> 00:38:31.790
die sich nicht in Jason rausrealisieren lassen,

00:38:31.790 --> 00:38:33.830
was natürlich auch sein kann, wie...

00:38:33.830 --> 00:38:35.370
Ja, und was ich total nett finde, ist, dass

00:38:35.370 --> 00:38:37.450
bei Jason, wenn ich das richtig im Kopf habe, dass

00:38:37.450 --> 00:38:39.390
immer bei den letzten Elementen das

00:38:39.390 --> 00:38:41.210
Komma nicht dastehen darf. Ach ja,

00:38:41.210 --> 00:38:43.410
das ist anders. Ja, Jason hat so ein paar so hässliche

00:38:43.410 --> 00:38:44.590
Seiten, ja, das ist so ein bisschen,

00:38:44.590 --> 00:38:47.670
genau, Jason zu parsen ist so ein bisschen

00:38:47.670 --> 00:38:48.190
ätzend.

00:38:48.190 --> 00:38:53.250
Aber genau, also das

00:38:53.250 --> 00:38:55.410
ist wirklich, wirklich wenig,

00:38:55.410 --> 00:38:57.390
wirklich wenig

00:38:57.390 --> 00:38:59.310
Zeilen und trotzdem hat man damit

00:38:59.310 --> 00:39:01.330
ein Modell gebaut, das dann ganz

00:39:01.330 --> 00:39:02.890
ganz ordentlich funktioniert.

00:39:02.890 --> 00:39:05.410
Die Klassifikation ist jetzt ein bisschen

00:39:05.410 --> 00:39:06.630
schwieriger.

00:39:06.630 --> 00:39:09.390
Ja, wir möchten gerne

00:39:09.390 --> 00:39:10.450
jetzt klassifizieren.

00:39:10.450 --> 00:39:13.230
Das beschreibe ich jetzt nicht, das hat schon beim Trainieren, das ist

00:39:13.230 --> 00:39:15.350
total einfach, hat das nicht gut funktioniert und jetzt beim

00:39:15.350 --> 00:39:17.190
Klassifizieren, also da kann man sich angucken, wenn einem das

00:39:17.190 --> 00:39:19.390
interessiert. Im Grunde, was passiert ist

00:39:19.390 --> 00:39:21.290
eigentlich nur, dass man

00:39:21.290 --> 00:39:22.870
halt bei einer neuen Nachricht, bei der man nicht weiß,

00:39:22.870 --> 00:39:25.130
ist das jetzt bei mir oder nicht, das legt man auch

00:39:25.130 --> 00:39:26.390
wieder in Worte und

00:39:27.270 --> 00:39:29.430
ziert dann halt in, für jede Kategorie

00:39:29.430 --> 00:39:31.610
halt sozusagen die Kategoriefrequenz

00:39:31.610 --> 00:39:32.730
dieses Wortes auf.

00:39:32.730 --> 00:39:35.030
Ja, also, um das erstmal nochmal zu simplifizieren,

00:39:35.030 --> 00:39:37.190
zu sagen, ohne dass das technisch vielleicht ganz korrekt ist, man nimmt

00:39:37.190 --> 00:39:39.430
einfach die Wahrscheinlichkeit jedes einzelnen

00:39:39.430 --> 00:39:41.370
Wortes, ob es Spam ist oder nicht Spam

00:39:41.370 --> 00:39:42.710
ist, also bei Viagra oder

00:39:42.710 --> 00:39:44.830
Peep, ist es vielleicht relativ hoch, dass

00:39:44.830 --> 00:39:46.790
dann die Mail Spam ist und multipliziert die miteinander

00:39:46.790 --> 00:39:49.190
und bekommt dann einen Gesamtwert raus, ob es

00:39:49.190 --> 00:39:51.150
jetzt nur Spam sein könnte oder nicht.

00:39:51.150 --> 00:39:52.310
Genau.

00:39:52.310 --> 00:39:55.130
Diese Zahlen sind dann halt

00:39:55.130 --> 00:39:56.610
sehr niedrig oft, weil

00:39:56.610 --> 00:39:58.610
entsprechend halt, ja, Worte auch nicht

00:39:58.610 --> 00:40:00.690
jetzt so, meistens gibt es...

00:40:00.690 --> 00:40:02.630
Hier muss man natürlich noch mit der Anzahl normalisieren oder sowas.

00:40:02.630 --> 00:40:04.690
Genau, also normalerweise

00:40:04.690 --> 00:40:06.790
man muss auch ein bisschen aufpassen, man muss ein bisschen tricksen,

00:40:06.790 --> 00:40:08.690
damit man da nicht irgendwie so in,

00:40:08.690 --> 00:40:10.830
es wird halt null irgendwie

00:40:10.830 --> 00:40:12.770
dadurch, dass man zu oft kleine Zahlen

00:40:12.770 --> 00:40:14.030
miteinander multipliziert hat.

00:40:14.030 --> 00:40:16.190
Ja, also ich glaube auch, wenn du größere Zahlen miteinander multiplizierst,

00:40:16.190 --> 00:40:17.770
die unter 1 sind, wird es irgendwann null.

00:40:17.770 --> 00:40:20.510
Eben, genau, genau. Und das ist halt, also

00:40:20.510 --> 00:40:22.250
muss man halt gucken, wenn die Texte lang werden,

00:40:22.250 --> 00:40:24.430
jetzt bei Essen auch praktisch sind sie nicht so lang, aber

00:40:24.430 --> 00:40:26.450
da muss man halt Maßnahmen ergreifen, ich weiß nicht,

00:40:26.490 --> 00:40:28.330
ob ich das hier getan habe, dass das

00:40:28.330 --> 00:40:30.370
nicht null wird. Es ist aber auch

00:40:30.370 --> 00:40:31.970
im Grunde egal, es geht ja nicht darum,

00:40:31.970 --> 00:40:34.230
eine exakte Wahrscheinlichkeit auszurechnen,

00:40:34.230 --> 00:40:36.430
sondern das irgendwie klassifizieren

00:40:36.430 --> 00:40:38.010
zu können. Du könntest einfach den Logarithmus davon nehmen.

00:40:38.010 --> 00:40:40.170
Ja, genau, das könnte man zum Beispiel machen, ja.

00:40:40.170 --> 00:40:41.870
Und

00:40:41.870 --> 00:40:44.270
was ich jetzt da gemacht habe, ist

00:40:44.270 --> 00:40:46.650
es einfach so zu normalisieren,

00:40:46.650 --> 00:40:48.190
dass halt hinterher die Summe der

00:40:48.190 --> 00:40:48.670
beiden

00:40:48.670 --> 00:40:51.830
Zahlen, die aber rauskommen, halt wieder 1 ist,

00:40:51.830 --> 00:40:54.350
sodass man das halt als Wahrscheinlichkeit interpretieren kann.

00:40:54.350 --> 00:40:56.150
Ja,

00:40:56.370 --> 00:40:56.910
und

00:40:56.910 --> 00:41:00.150
dann wisst ihr halt, ne, das ist tatsächlich so,

00:41:00.150 --> 00:41:02.310
der Quotient ist Spam, ist kein Spam

00:41:02.310 --> 00:41:04.210
und dann habt ihr tatsächlich daraus

00:41:04.210 --> 00:41:06.190
logischerweise eure Wahrscheinlichkeit.

00:41:06.190 --> 00:41:08.170
Genau, und das funktioniert

00:41:08.170 --> 00:41:10.330
halt jetzt, also bei dem Dataset war das so...

00:41:10.330 --> 00:41:12.170
Und das wäre das Coole an der E-Face, dass es funktioniert mit relativ

00:41:12.170 --> 00:41:13.750
wenig Daten, wie ihr gerade gehört habt und

00:41:13.750 --> 00:41:16.270
schnell sogar. Es ist sau schnell,

00:41:16.270 --> 00:41:18.050
es ist, also das ist wahrscheinlich

00:41:18.050 --> 00:41:20.250
schneller als so ziemlich alles andere, auch deswegen,

00:41:20.250 --> 00:41:22.090
weil das halt kaum was macht, ne,

00:41:22.090 --> 00:41:23.130
das ist halt irgendwie

00:41:23.130 --> 00:41:26.330
und, oder ich

00:41:26.330 --> 00:41:28.150
bin mir ziemlich sicher, dass es wahrscheinlich schneller ist

00:41:28.150 --> 00:41:28.910
als die meisten anderen

00:41:28.910 --> 00:41:30.650
Machine Learning Verfahren.

00:41:30.650 --> 00:41:33.970
Es ist sau schnell, man braucht keine

00:41:33.970 --> 00:41:36.130
Spezialbibliotheken wie NumPy oder sowas.

00:41:36.130 --> 00:41:38.030
Aber ist das schon richtiges Machine Learning,

00:41:38.030 --> 00:41:40.130
weil im Prinzip berechnest du ja nur die einzelnen Wahrscheinlichkeiten

00:41:40.130 --> 00:41:42.330
von den einzelnen Kategorien? Ja, aber ist es, ja.

00:41:42.330 --> 00:41:44.250
Na gut, jetzt wissen wir, warum

00:41:44.250 --> 00:41:45.290
Statistiker sagen Haha.

00:41:45.290 --> 00:41:48.110
Ja, ja, natürlich, also sie haben ja auch so ein bisschen

00:41:48.110 --> 00:41:50.010
Recht, das ist schon so, aber

00:41:50.010 --> 00:41:52.170
trotzdem,

00:41:52.170 --> 00:41:53.630
ich meine, du kannst damit halt Sachen machen,

00:41:53.630 --> 00:41:56.210
wo Statistiker

00:41:56.210 --> 00:41:57.650
halt Schwierigkeiten mit hätte.

00:41:57.650 --> 00:41:59.550
Also wenn man das jetzt auf Papier

00:41:59.550 --> 00:42:01.530
machen wollen würde.

00:42:01.530 --> 00:42:04.290
Der Unterschied zwischen Statistik und Machine Learning ist, man schreibt es in einen Computer.

00:42:04.290 --> 00:42:06.130
Ja, ich würde tatsächlich sagen,

00:42:06.130 --> 00:42:08.130
das ist einer der Hauptunterschiede, dass du es halt mit Computern

00:42:08.130 --> 00:42:10.350
machst und auch damit rumspielen kannst

00:42:10.350 --> 00:42:11.910
und während du auf, weil

00:42:11.910 --> 00:42:13.930
ja, klassischer

00:42:13.930 --> 00:42:15.090
Statistik irgendwie

00:42:15.090 --> 00:42:17.810
die Formeln ausschreiben musst. Genau,

00:42:17.810 --> 00:42:20.110
dann machst du es auf Papier alles und guckst halt,

00:42:20.110 --> 00:42:21.950
was ja auch viel oft dann genauer geht, ja,

00:42:21.950 --> 00:42:24.130
du kannst dann halt dein Modell viel besser

00:42:24.130 --> 00:42:25.490
irgendwie

00:42:25.490 --> 00:42:25.850
äh,

00:42:26.090 --> 00:42:27.170
bauen und so, aber

00:42:27.170 --> 00:42:29.030
und du hast halt nur wenige

00:42:29.030 --> 00:42:31.650
Beispiele oft, während bei

00:42:31.650 --> 00:42:33.730
Machine Learning ist es so oft, ob das

00:42:33.730 --> 00:42:35.630
jetzt alles so genau passt oder so, das interessiert dich

00:42:35.630 --> 00:42:37.310
gar nicht, sondern es muss halt hinterher ein gutes Ergebnis

00:42:37.310 --> 00:42:38.570
rauskommen, das kannst du evaluieren

00:42:38.570 --> 00:42:40.730
und warum das jetzt nicht funktioniert.

00:42:40.730 --> 00:42:42.190
Man kann auch mal statistische Fehlerchen machen.

00:42:42.190 --> 00:42:43.470
Ja, das kann man natürlich auch.

00:42:43.470 --> 00:42:47.490
Es geht ja nur darum, ob morgen Wetter, Sonne

00:42:47.490 --> 00:42:48.790
scheint oder nicht.

00:42:48.790 --> 00:42:51.330
Ja, ja, also sagen wir mal so,

00:42:51.330 --> 00:42:53.330
die Kritik ist teilweise schon prächtig, aber

00:42:53.330 --> 00:42:55.790
man muss halt immer mit seinen Daten auch ein bisschen

00:42:55.790 --> 00:42:57.750
aufpassen, ne, stimmen die denn? Und das Problem bei solchen Dingen

00:42:57.750 --> 00:42:59.930
ist halt, ihr habt halt meistens Abhängigkeit

00:42:59.930 --> 00:43:01.610
zwischen einzelnen Merkmalen irgendwie dann doch

00:43:01.610 --> 00:43:04.010
und, ähm, ja, also nur eine Mail

00:43:04.010 --> 00:43:05.990
in den Müll zu schmeißen, weil jetzt Piep drin vorkommt,

00:43:05.990 --> 00:43:07.930
äh, ist vielleicht blöd, vielleicht habt ihr auch eine nette

00:43:07.930 --> 00:43:10.230
Mail geschrieben von eurer, äh,

00:43:10.230 --> 00:43:15.950
oder eurem zukünftigen Geliebten, der wollte euch irgendwas Nettes schreiben und dann ist er im Spam-Ordner gelandet oder sowas.

00:43:15.950 --> 00:43:21.390
Ja, genau. Aber wenn man das jetzt evaluiert, also was dabei rauskommt, ist schon ganz gut.

00:43:21.390 --> 00:43:30.890
Genauigkeit ist ein bisschen irreführend, gerade wenn die Klassen nicht so viel, wenn das halt nicht gleich verteilt ist, sondern sehr unterschiedlich.

00:43:30.890 --> 00:43:36.730
Da gibt es auch immer ein schönes Beispiel bei Spam, wenn halt irgendwie die Wahrscheinlichkeit, und das ist tatsächlich so,

00:43:37.050 --> 00:43:42.910
ich glaube mittlerweile, es kann sein, dass mehr als 99% aller verschickten Mail irgendwie Spam ist.

00:43:42.910 --> 00:43:50.030
Und wenn man dann einen Klassifikator macht, der einfach immer sagt, es ist Spam, dann hat er eine Accuracy von 99%.

00:43:50.030 --> 00:43:51.850
Tja, verdammt.

00:43:51.850 --> 00:43:57.030
Sieht gut aus, ist aber nicht wirklich sinnvoll, weil das Problem ist, man bekommt keine...

00:43:57.030 --> 00:43:58.850
Keine tiefere Erkenntnis.

00:43:58.850 --> 00:44:05.690
Ja, der guten Mail kommt noch durch, das heißt, man kriegt gar keine Mail mehr, was so ein bisschen vielleicht nicht der Sinn von Mail ist.

00:44:05.690 --> 00:44:06.930
Ja, wäre kontraproduktiv tatsächlich.

00:44:07.050 --> 00:44:10.490
Ja, aber sehr halt in dieser...

00:44:10.490 --> 00:44:11.150
Kommst du auf viel Spam?

00:44:11.150 --> 00:44:15.250
Ich weiß es ehrlich gesagt nicht, es kommt kaum was durch.

00:44:15.250 --> 00:44:19.010
Ich habe letztens eine gekommen, die kam super durch, das war sehr spannend.

00:44:19.010 --> 00:44:19.470
Ja?

00:44:19.470 --> 00:44:25.970
Ich habe gefragt, ob ich mich nicht sofort für schnellen Text treffen möchte und noch heute und ich müsste auch einfach nur hier draufklicken.

00:44:25.970 --> 00:44:32.250
Wirklich, also sowas habe ich noch nie bekommen, das war das erste Mal seit bestimmt acht Jahren oder sowas, dass sowas in meinem Postfach landete einfach.

00:44:32.250 --> 00:44:35.170
Okay, ist interessant, wie Sie das geschafft haben, durch die Spamfilter durchzukommen.

00:44:35.170 --> 00:44:35.830
Ich habe keine Ahnung.

00:44:37.050 --> 00:44:51.110
Ja, Werbung, genau, ich weiß es nicht genau, ich gucke jetzt hier gerade mal in meinen Spamfilter, doch, es kommt jeden Tag, ich weiß es jetzt nicht, allein heute sehe ich also wahrscheinlich schon so 40, 50 Spam-Mails oder sowas.

00:44:51.110 --> 00:44:54.750
Wie viele E-Mails bekommst du eigentlich jeden Tag? Ich habe das irgendwann mal komplett raus sortiert und...

00:44:54.750 --> 00:44:59.170
Ich weiß es nicht, meine Inbox hier hat gerade so 5.600 ungelesene Mails.

00:44:59.170 --> 00:45:06.710
Von 10.000 reduziert, ich bekomme relativ schnell voll, aber so 100, 200 Stück bleibt da.

00:45:07.050 --> 00:45:12.190
Die ganzen Mails, alle deabonniert, alles rausgekickt, alles gelöscht, wollte ich alles nicht mehr haben, meine Dokus, nö.

00:45:12.190 --> 00:45:16.810
Ja, also dieses, ja, also, ja, Mail ist problematisch.

00:45:16.810 --> 00:45:21.530
Ich bekomme natürlich jeden Tag immer zehnmal Fanpost von Hörern von diesem wunderschönen Podcast.

00:45:21.530 --> 00:45:26.610
Ja, da geht es gerade noch so, da könnte, das ist okay.

00:45:26.610 --> 00:45:30.110
Also, wenn ihr möchtet, schreibt uns dann, hallo.

00:45:30.110 --> 00:45:31.050
Ja, das ist schon okay.

00:45:31.050 --> 00:45:35.490
Es gibt ja auch keine, das Blöde ist halt irgendwie, es gibt ja auch keine Lösung.

00:45:35.490 --> 00:45:36.890
Natürlich kann man sagen...

00:45:36.890 --> 00:45:40.110
Man nimmt einfach keine Mail mehr an oder man liest das nicht oder so, das ist auch...

00:45:40.110 --> 00:45:45.330
Also, ihr könntet mal einen Test machen, ihr könntet ein Piep in das nächste E-Mail, Fan-E-Mail dann uns schreiben.

00:45:45.330 --> 00:45:47.690
Also, einmal das Wort und mal gucken, ob es bei uns im Filter landet.

00:45:47.690 --> 00:45:50.910
Also, wir sehen das auch, also, ich gucke zumindest in den Filter, ab und zu mal rein, liest du auch?

00:45:50.910 --> 00:45:51.350
Ja.

00:45:51.350 --> 00:45:52.870
Also, ich schon, ich kann...

00:45:52.870 --> 00:45:54.390
Ich verlasse mich darauf, dass das irgendwie funktioniert.

00:45:54.390 --> 00:45:55.130
Okay.

00:45:55.130 --> 00:45:58.790
Und dass Leute, wenn es irgendwas Wichtiges war, dann halt andere Wege versuchen, mich zu erreichen.

00:45:58.790 --> 00:46:01.750
Naja, also, glaubt ihr wirklich an einen Hörer, wenn er uns...

00:46:01.750 --> 00:46:02.530
Nee, das kann sein.

00:46:02.530 --> 00:46:04.510
Ich versuche eine Liebeserklärung zu...

00:46:04.510 --> 00:46:04.950
Ja, das...

00:46:04.950 --> 00:46:06.110
Das funktioniert leider nicht, ne?

00:46:06.110 --> 00:46:06.490
Ja.

00:46:06.490 --> 00:46:07.770
Ja, ja, ja.

00:46:07.770 --> 00:46:21.910
Aber, genau, also, was ich halt an dieser Geschichte schick finde, ist, also, man kann halt mit wenigen Zeilen Pipen, kann man halt einen Arc-Base-Classifier schreiben, der schnell ist, der relativ genau funktioniert.

00:46:21.910 --> 00:46:26.650
Man würde das jetzt nicht wirklich verwenden, wenn man tatsächlich in den Spam...

00:46:26.650 --> 00:46:27.950
Wie groß war jetzt nochmal der Trainingsdatensatz?

00:46:27.950 --> 00:46:29.090
5.000, hast du gesagt?

00:46:29.090 --> 00:46:29.850
5.500.

00:46:29.850 --> 00:46:32.550
Vorpräsentierte Nachrichten.

00:46:32.550 --> 00:46:34.790
Könnte man noch zusammentragen, wenn man...

00:46:34.790 --> 00:46:37.590
Wenn man so ein Classifier-Problem selber lösen wollen würde.

00:46:37.590 --> 00:46:38.970
Ja, ja, nein.

00:46:38.970 --> 00:46:46.170
Also, ich meine, man würde das jetzt nicht, wenn man jetzt irgendwie einen Spam-Fühler tatsächlich verwendet in einem Mail-Client oder so, da würde man jetzt diesen Ansatz nicht nehmen.

00:46:46.170 --> 00:46:47.910
Aber...

00:46:47.910 --> 00:46:48.970
Also, weil das halt nicht so genau ist.

00:46:48.970 --> 00:46:52.350
Ich hab das jetzt mal verglichen, da drunter sind noch so irgendwie zwei andere Dinge.

00:46:52.350 --> 00:46:57.430
Ich hab einmal einfach nur eine lineare Support-Factor-Maschine genommen, die ist halt ein Stückchen besser.

00:46:57.430 --> 00:47:02.890
Und auch nicht viel lang, also die ist auch sehr schnell.

00:47:02.890 --> 00:47:04.750
Und dann hab ich auch nochmal Spacey genommen.

00:47:04.790 --> 00:47:07.990
Mit so einem 1D-Convolutional-Netz.

00:47:07.990 --> 00:47:09.950
Und das ist unfassbar viel langsamer.

00:47:09.950 --> 00:47:11.590
Alle wieder abgehängt.

00:47:11.590 --> 00:47:13.950
Ja, also, der Witz ist...

00:47:13.950 --> 00:47:16.570
Also, eigentlich natürlich nimmt man nicht NaiveBase.

00:47:16.570 --> 00:47:20.290
Aber es könnte Situationen geben, in denen das total sinnvoll ist, sowas zu benutzen.

00:47:20.290 --> 00:47:21.590
Wie zum Beispiel...

00:47:21.590 --> 00:47:25.350
Also, ein Szenario wäre, du möchtest Trainingsdaten generieren.

00:47:25.350 --> 00:47:26.470
Ja.

00:47:26.470 --> 00:47:29.170
Und du hast jetzt...

00:47:29.170 --> 00:47:33.790
Möchtest das aber im Frontend machen, sodass das halt sich für denjenigen, der das editiert, halt irgendwie...

00:47:33.790 --> 00:47:34.150
Ja.

00:47:34.150 --> 00:47:34.630
Ja.

00:47:34.630 --> 00:47:34.750
Ja.

00:47:34.750 --> 00:47:34.770
Ja.

00:47:34.790 --> 00:47:34.830
Ja.

00:47:34.830 --> 00:47:40.310
Schnell und so anfühlt es, dass er damit irgendwie gut arbeiten kann.

00:47:40.310 --> 00:47:41.790
Und jetzt...

00:47:41.790 --> 00:47:52.630
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.

00:47:52.630 --> 00:47:55.090
Sondern dir ist wichtiger, dass es schnell ist.

00:47:55.090 --> 00:47:57.550
Und das letzte Prozent Genauigkeit interessiert dich nicht.

00:47:57.550 --> 00:47:59.990
Oder das letzte Prozent F1-Wert oder so.

00:47:59.990 --> 00:48:03.550
Weil es einfach nur darum geht, möglichst schnell viele Trainingsdaten zu erzeugen.

00:48:03.550 --> 00:48:04.630
Und dich interessiert vielleicht noch...

00:48:04.630 --> 00:48:07.190
Ob ein Ding schwer oder leicht zu klassifizieren ist.

00:48:07.190 --> 00:48:09.690
Aber nicht, ob das jetzt ganz genau stimmt oder nicht.

00:48:09.690 --> 00:48:10.970
Weil es guckt ja eh jemand auch mal drauf.

00:48:10.970 --> 00:48:14.530
Und da kann halt das...

00:48:14.530 --> 00:48:17.730
Dieses Naiv-Based-Ding könntest du auch in JavaScript problemlos implementieren.

00:48:17.730 --> 00:48:19.870
Es wären ein paar Zahlen mehr, nicht viel mehr Zahlen.

00:48:19.870 --> 00:48:21.930
Und es wäre auch sauschnell in JavaScript.

00:48:21.930 --> 00:48:26.550
Und du könntest das halt im Frontend verwenden, um halt basierend...

00:48:26.550 --> 00:48:28.110
Also jemand sagt, das ist Spam, das ist Spam.

00:48:28.110 --> 00:48:32.330
Okay, sortier mir nochmal um, sodass die uneindeutigen Fälle oben sind halt.

00:48:32.330 --> 00:48:34.270
Äh...

00:48:34.270 --> 00:48:36.050
Und dann sortierst du nochmal.

00:48:36.050 --> 00:48:38.430
Machst nochmal 20 Beispiele für die, 20 Beispiele für die Gruppe.

00:48:38.430 --> 00:48:39.190
Sortierst nochmal um.

00:48:39.190 --> 00:48:43.930
Dann kannst du halt wahrscheinlich tausende von Dingen in relativ wenig Zeit irgendwie labeln.

00:48:43.930 --> 00:48:51.450
Und benutzt halt zum Sortieren einen Classifier, der halt im Frontend-Code in JavaScript so läuft.

00:48:51.450 --> 00:48:53.930
Und für den Fall...

00:48:53.930 --> 00:48:56.190
Aber wir sind doch hier beim Python-Podcast.

00:48:56.190 --> 00:48:57.050
Ja, natürlich.

00:48:57.050 --> 00:48:58.930
Also du kannst das halt auch in Python machen.

00:48:58.930 --> 00:49:00.910
TypeScript ist ja auch relativ nah dran, tatsächlich.

00:49:00.910 --> 00:49:03.190
Ja, äh...

00:49:03.190 --> 00:49:03.930
Aber, ähm...

00:49:04.270 --> 00:49:10.290
Also, sagen wir mal so, das ist halt ein Vorteil, den fast alle diese sogenannten Skript-Sprachen halt haben.

00:49:10.290 --> 00:49:12.630
Also ich finde das immer so ein bisschen, ähm...

00:49:12.630 --> 00:49:14.410
Ja, man könnte das auch direkt wieder rausrennen dann, ne?

00:49:14.410 --> 00:49:15.490
Und irgendeine Datenbank, kleine...

00:49:15.490 --> 00:49:16.870
Äh, äh, äh...

00:49:16.870 --> 00:49:18.370
Irreführend, wenn die dann halt so abwehren als Skript-Sprachen.

00:49:18.370 --> 00:49:19.910
Weil das ist halt, das ist eine große Stärke.

00:49:19.910 --> 00:49:22.190
Also du kannst halt wirklich solche Sachen...

00:49:22.190 --> 00:49:32.710
Du brauchst im Grunde nur diese drei Grund-Datentypen, wie eben, ja, Zahlen, Strings, äh, also Variablen, wo halt ein Ding irgendwie drin ist, äh, Listen und Dicks.

00:49:32.710 --> 00:49:34.110
Und kannst damit halt schon...

00:49:34.110 --> 00:49:35.070
Und kannst damit halt schon sehr, sehr viel bauen.

00:49:35.070 --> 00:49:38.110
Und, ähm...

00:49:38.110 --> 00:49:46.370
Äh, ja, musst da nicht irgendwie großartig, äh, irgendwie Boilerplate schreiben und irgendwie eine Klassenhierarchie, äh, aufbauen, äh, und irgendwie UML-Diagramme malen.

00:49:46.370 --> 00:49:54.690
Sondern du kannst das halt einfach mal so kurz runterschreiben und kommst damit, äh, wenn du es richtig machst, halt, äh, in Performance-Regionen, die sonst schwer zu erreichen sind.

00:49:54.690 --> 00:50:01.110
Also wenn du jetzt zum Beispiel einen C++ machen wolltest und versuchst, schneller zu sein als diese Python-Implementation, wird das, das wird schwer.

00:50:01.110 --> 00:50:03.950
Weil die Dict-Implementation ist in Python...

00:50:03.950 --> 00:50:05.790
In Python relativ, relativ stark optimiert.

00:50:05.790 --> 00:50:07.410
Da geht dann so viel Zeit rein, um das zu entwickeln.

00:50:07.410 --> 00:50:09.350
In der Zeit hätte man einen Algorithmus.

00:50:09.350 --> 00:50:13.090
Ja, es ist wirklich, äh, ja, ich meine, ich hab das ja dann auch schon häufig...

00:50:13.090 --> 00:50:18.130
Also wenn du das dann in C++ machst und ansonsten die Hashmap aus der Standardbibliothek oder so, kann es gut sein, dass du langsamer bist als Python.

00:50:18.130 --> 00:50:20.930
Weil, ja, die Implementation nicht so optimiert ist.

00:50:20.930 --> 00:50:23.470
Und du kannst es mit C++ viel schneller hinkriegen.

00:50:23.470 --> 00:50:27.990
Aber du würdest halt, äh, ja, derartig viel mehr Zeit dafür brauchen.

00:50:27.990 --> 00:50:30.270
Und die Frage ist, brauchst du es halt so genau und so schnell?

00:50:30.270 --> 00:50:33.510
Äh, bist du bereit dafür, so viel Zeit zu investieren?

00:50:33.790 --> 00:50:34.450
Die Antwort ist oft, nein.

00:50:34.450 --> 00:50:37.750
Es ist viel besser, irgendwie weniger Zeit zu brauchen.

00:50:37.750 --> 00:50:43.450
Und, äh, etwas zu haben, das vielleicht nicht total super optimal ist, aber halt auch schon sehr gut.

00:50:43.450 --> 00:50:44.370
Und das geht.

00:50:44.370 --> 00:50:46.690
Und das ist halt, das ist das, was ich eigentlich damit sagen wollte.

00:50:46.690 --> 00:50:48.410
Pre-Labeling von Trainingsdaten.

00:50:48.410 --> 00:50:48.850
Ja.

00:50:48.850 --> 00:50:50.790
Ja, wenn du, genau.

00:50:50.790 --> 00:50:53.550
Oder halt auch, um zu verstehen, wie das funktioniert.

00:50:53.550 --> 00:50:57.150
Um wirklich sagen zu können, okay, ich kann mich jetzt darauf verlassen, dass das halt wirklich klappt.

00:50:57.150 --> 00:51:01.050
Weil das Problem ist ja immer an den, also Blackbox-neuronalen Netzgeschichten oder so auch.

00:51:01.050 --> 00:51:03.630
Äh, du kannst da nicht so richtig gut...

00:51:03.630 --> 00:51:07.310
Gut reingucken, natürlich kann man irgendwie, äh, das alles evaluieren oder so.

00:51:07.310 --> 00:51:09.310
Aber du verstehst halt auch nicht so wirklich, was das tut.

00:51:09.310 --> 00:51:14.170
Und es ist immer gut, so ein paar Sachen da zu haben, bei denen man wirklich auch das insofern verstanden hat,

00:51:14.170 --> 00:51:15.530
dass man es einfach mal selber implementiert hat.

00:51:15.530 --> 00:51:18.410
Weil man dann beurteilen kann, was da passiert.

00:51:18.410 --> 00:51:20.310
Und wenn das halt ganz andere Ergebnisse liefert oder so,

00:51:20.310 --> 00:51:25.510
dann hat man auch einen interessanten Ansatzpunkt, äh, wo man nachfragen kann, was ist denn da jetzt eigentlich passiert.

00:51:25.510 --> 00:51:28.430
Und, ähm, genau.

00:51:28.430 --> 00:51:32.390
Daher finde ich das super sinnvoll, ab und zu mal so ein Verfahren auch selber zu implementieren oder in NaiveBase.

00:51:33.470 --> 00:51:36.590
War super, weil es halt so super einfach ist.

00:51:36.590 --> 00:51:37.390
Ähm, genau.

00:51:37.390 --> 00:51:39.210
Und, ähm...

00:51:39.210 --> 00:51:43.310
Ja, also in Notebook hast du dann tatsächlich das nochmal verglichen von der Geschwindigkeit her zu den ganzen anderen Verfahren.

00:51:43.310 --> 00:51:45.530
Von der Geschwindigkeit nicht, das sind einfach nur die, äh, die, die...

00:51:45.530 --> 00:51:46.490
Äh, Präzisionsgrade, Entschuldigung.

00:51:46.490 --> 00:51:47.170
Ähm, ja, ja.

00:51:47.170 --> 00:51:50.310
Also eigentlich, eben Genauigkeit sollte man sich nicht angucken, sondern Präzision Recall.

00:51:50.310 --> 00:51:55.750
Und, äh, ja, da ist halt irgendwie, äh, so lineare Support-Weck von Maschinen sind halt schon so ein bisschen besser.

00:51:55.750 --> 00:51:57.850
Jetzt kurz, was ist Präzision Recall?

00:51:57.850 --> 00:52:00.670
Ja, das ist halt Genauigkeit eben.

00:52:00.670 --> 00:52:03.310
Ähm, Argument von eben ist halt, äh, äh...

00:52:03.310 --> 00:52:10.590
Äh, wenn, wenn mehr als 99% der Mails, die man halt so sieht, Spam sind, dann, äh, ist Genauigkeit von 99% sagt halt nichts aus.

00:52:10.590 --> 00:52:11.650
Weil...

00:52:11.650 --> 00:52:13.370
Und dann benutzt man den Recall-Wert und...

00:52:13.370 --> 00:52:14.770
Benutzt dann Präzision und Recall.

00:52:14.770 --> 00:52:25.830
Und, äh, äh, Präzision ist halt, äh, sozusagen die, also man kann, es gibt vier Fälle, die auftreten können, wenn du jetzt, äh, irgendwie Spam klassifizierst.

00:52:25.830 --> 00:52:28.190
Es kann halt sein...

00:52:28.190 --> 00:52:29.630
Alpha-Fehler, Beta-Fehler, ja und nein.

00:52:29.630 --> 00:52:30.870
Genau, genau.

00:52:30.870 --> 00:52:33.150
Oder bei Machine Learning nennt man das oft, äh, True-Positive.

00:52:33.150 --> 00:52:35.390
False-Positive, False-Negative und True-Negative.

00:52:35.390 --> 00:52:37.510
Also sozusagen ist es...

00:52:37.510 --> 00:52:39.070
Es ist Spam und du hast es als Spam erkannt.

00:52:39.070 --> 00:52:39.650
Genau, das wäre True-Positive.

00:52:39.650 --> 00:52:41.750
Es ist Spam und es ist bei deinem Impost-Eingang gelandet.

00:52:41.750 --> 00:52:45.370
Das wäre, äh, äh, äh, äh, äh, False-Negative, ja.

00:52:45.370 --> 00:52:49.690
Ja, oder es ist kein Spam und du hast es als Spam erkannt und es ist False-Positive.

00:52:49.690 --> 00:52:50.690
Oder...

00:52:50.690 --> 00:52:53.190
Es ist kein Spam und du hast es als Impost-Eingang, was genau das ist.

00:52:53.190 --> 00:52:59.930
Ja, bei der, 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.

00:53:02.990 --> 00:53:05.870
Äh, wenn du jetzt mehrere Klassen hättest, müsstest du das halt dann auch nochmal unterscheiden.

00:53:05.870 --> 00:53:07.550
Oder bei Multilabel musst du das unterscheiden.

00:53:07.550 --> 00:53:10.490
Weil es dann ja auch sein kann, dass etwas in keiner Klasse liegt oder so.

00:53:10.490 --> 00:53:13.070
Aber das, den Fall haben wir ja gar nicht, wir haben ja nur, äh, irgendwie Spam oder Ham.

00:53:13.070 --> 00:53:13.870
Wir binär, genau.

00:53:13.870 --> 00:53:26.250
Ähm, und, äh, genau, dann ist Precision, ist einfach True-Positive, Anzahl der Dinge, äh, Anzahl der True-Positives geteilt durch, äh, äh, äh, True-Positive plus False-Positive.

00:53:26.250 --> 00:53:32.390
Also nochmal, äh, True-Positive ist ein, äh, Mail, die kein Spam ist und die im Post-Eingang landet.

00:53:32.830 --> 00:53:38.330
Nee, True-Positive ist, äh, es ist, es ist kein Spam und es ist im Post-Eingang gelandet.

00:53:38.330 --> 00:53:39.370
Also, und es wurde richtig gelaufen.

00:53:39.370 --> 00:53:39.910
Habe ich das nicht gesagt?

00:53:39.910 --> 00:53:40.690
Oder hast du das gesagt?

00:53:40.690 --> 00:53:41.090
Ja, damit.

00:53:41.090 --> 00:53:41.350
Ja, damit.

00:53:41.350 --> 00:53:42.810
Okay, dann habe ich es nur falsch verstanden.

00:53:42.810 --> 00:53:44.490
Musst du mal zurückspulen, nochmal neu hören.

00:53:44.490 --> 00:53:44.690
Ja.

00:53:44.690 --> 00:53:47.710
Genau, also es ist alles richtig gelaufen, das True-Positive.

00:53:47.710 --> 00:53:52.290
False-Positive wäre halt, äh, irgendwie, es wurde als Spam erkannt, es war aber kein Spam.

00:53:52.290 --> 00:53:56.530
Und jetzt, äh, addiert man halt die False-Positives auf die True-Positives.

00:53:56.530 --> 00:54:01.730
Und, äh, wenn man jetzt sozusagen die True-Positives teilt dadurch, durch die größere Zahl,

00:54:02.670 --> 00:54:09.330
dann die Quote der, äh, ja, wie kann man das sagen, die, die Quote der, äh.

00:54:09.330 --> 00:54:10.050
Die man recht hat.

00:54:10.050 --> 00:54:12.190
Weil jetzt, bei denen es richtig gelaufen ist, sozusagen.

00:54:12.190 --> 00:54:17.290
Aber das ist jetzt nicht so wie bei der Genauigkeit, äh, sondern es ist halt, da wäre halt,

00:54:17.290 --> 00:54:24.450
wenn man jetzt, äh, äh, sozusagen einen Classifier hätte, der immer sagt, ähm, Spam.

00:54:24.450 --> 00:54:27.330
Ja, der hätte halt eine irre hohe Anzahl von False-Positives.

00:54:27.330 --> 00:54:30.830
Und der hätte dann halt eine Precision von Null, mehr oder weniger.

00:54:30.830 --> 00:54:32.510
Ja, und das heißt, er hätte, äh.

00:54:32.510 --> 00:54:33.410
Da taugt jetzt nicht viel.

00:54:33.410 --> 00:54:34.190
Ja, genau.

00:54:34.190 --> 00:54:35.690
Ähm.

00:54:35.690 --> 00:54:36.310
Okay, Recall.

00:54:36.310 --> 00:54:43.030
Und Recall ist halt sozusagen das Gleiche, bloß, äh, irgendwie mit, äh, äh, False-Negatives statt True-Positives.

00:54:43.030 --> 00:54:47.070
Und das beschreibt im Grunde, wie viel von denen, die ich hätte erkennen sollen, habe ich tatsächlich erkannt.

00:54:48.210 --> 00:55:07.390
Ja, äh, äh, gibt's ja auch, man, man kann halt einfach auf Precision optimieren, indem man sagt, äh, irgendwie, äh, ja, man, man, äh, klassifiziert nur das Ding, wo man sich super sicher ist, als, äh, nur eins als super sicher, äh, äh, äh, als, als das, was man, wovon man es hält, ja, dann hat man wahrscheinlich eine Precision von eins.

00:55:07.390 --> 00:55:13.950
Aber wenn man jetzt nicht alle findet, sondern, äh, irgendwie, äh, viele, äh, Spams halt durchgehen.

00:55:13.950 --> 00:55:17.050
Es gibt so ein paar Machine Learning-Beispiele, für die das vielleicht gar nicht so irrelevant ist.

00:55:17.050 --> 00:55:18.050
Also, wenn man jetzt zum Beispiel, äh.

00:55:18.050 --> 00:55:20.890
Entscheidet, ob man jetzt einen Laser auf einen Insekt richtet und das dann abzuschießen oder nicht.

00:55:20.890 --> 00:55:22.810
Und das ist aus Versehen dann die Katze oder der Hund.

00:55:22.810 --> 00:55:25.590
Das wäre dann vielleicht nicht ganz so gut, wenn man dann so ein paar False-Positives.

00:55:25.590 --> 00:55:26.870
Das sind False-Positives, genau.

00:55:26.870 --> 00:55:33.730
Das wäre auch, das ist auch, aber es ist je nach Problem, ist es halt, äh, unterschiedlich schlimm, ob jetzt False-Positives oder False-Negatives auftreten.

00:55:33.730 --> 00:55:36.230
Äh, ist aber beides natürlich blöd.

00:55:36.230 --> 00:55:37.490
Das sind halt einfach unterschiedliche Arten.

00:55:37.490 --> 00:55:40.190
Also, im einen Fall kommt einfach die Mücke dann trotzdem rein und sticht dich.

00:55:40.190 --> 00:55:42.330
Und im anderen Fall ist vielleicht deine Katze, äh.

00:55:42.330 --> 00:55:45.330
Genau, in dem Fall würde man wahrscheinlich eher False-Positives versuchen wollen zu vermeiden.

00:55:45.330 --> 00:55:47.810
Aber, ja.

00:55:47.890 --> 00:55:52.470
Es hängt halt von dem Problem ab und man kann sich sozusagen meistens aussuchen, was man jetzt lieber hätte.

00:55:52.470 --> 00:55:53.510
Man kann halt darauf optimieren.

00:55:53.510 --> 00:55:58.730
Das heißt, du definierst quasi die Irrtumswahrscheinlichkeit, die du nicht unterschreiten willst und darauf optimierst du dann dein, der Modell.

00:55:58.730 --> 00:55:59.190
Genau.

00:55:59.190 --> 00:55:59.810
Genau.

00:55:59.810 --> 00:56:04.870
Man kann sagen, also ich möchte nicht, äh, dass mir so und so viel, ähm, echte Mails verloren gehen.

00:56:04.870 --> 00:56:07.210
Äh, das wäre wahrscheinlich das, ähm, Seven-Class-Fact.

00:56:07.210 --> 00:56:09.890
Drei klassische Grenzen, ein Prozent, zwei Prozent, fünf Prozent oder sowas, ja.

00:56:09.890 --> 00:56:13.510
Ja, also die aktuellen Geschichten sind wahrscheinlich alle noch deutlich drunter.

00:56:13.510 --> 00:56:15.510
Aber, ähm, genau.

00:56:15.510 --> 00:56:17.610
Und dann, ähm, äh, sagt man, okay.

00:56:17.730 --> 00:56:19.330
Dann mit dem anderen Fehler lebt man dann halt, ja.

00:56:19.330 --> 00:56:23.310
Also in dem Fall von Spam-Classifier würde man halt eher damit leben, dass halt ein bisschen Spam durchkommt.

00:56:23.310 --> 00:56:28.290
Aber man möchte eigentlich nicht, dass echte Mail irgendwie, äh, weglottiert wird.

00:56:28.290 --> 00:56:29.410
Ja, das wäre nicht so gut.

00:56:29.410 --> 00:56:32.410
Ähm, aber wie gesagt, je nach Anwendung kann das halt unterschiedlich sein.

00:56:32.410 --> 00:56:33.950
Es gibt auch Anwendungen, bei denen es andersrum ist.

00:56:33.950 --> 00:56:40.990
Ähm, also medizinische Anwendungen sind oft dann zum Beispiel dann eher darauf optimiert, dass das Recall, Recall hoch ist und False-Positives sind egal.

00:56:40.990 --> 00:56:43.650
Aber man möchte halt nicht, dass man jemanden undiagnostiziert lässt.

00:56:43.650 --> 00:56:43.990
Ja, ja.

00:56:43.990 --> 00:56:45.190
Vielleicht, je nachdem, was es für eine Klarheit ist.

00:56:45.190 --> 00:56:45.750
Ja.

00:56:45.750 --> 00:56:47.210
Also, ja.

00:56:47.570 --> 00:56:47.910
Äh, kommt.

00:56:47.910 --> 00:56:49.390
Tatsächlich ist Spam-Fall noch ganz interessant.

00:56:49.390 --> 00:56:56.770
Also, um jetzt mal auf das echte Beispiel zurückzukommen, ähm, würde man dann vielleicht hingehen und, äh, bestimmte Ausnahmekriterien noch hinterher filtern?

00:56:56.770 --> 00:57:06.550
Beispielsweise, wenn du jetzt von mir eine Mail bekommst und ich bin ja wahrscheinlich irgendwie in deinem Adressbuch drin, äh, dass du mich dann trotzdem kriegst, obwohl, äh, ich jetzt dir ganz viele Schimpfworte schreibe, oder?

00:57:06.550 --> 00:57:07.610
Genau.

00:57:07.610 --> 00:57:12.610
Also, natürlich, das ist jetzt nicht ein echtes System oder so, sondern das ist einfach nur, äh, zum Beispiel.

00:57:12.610 --> 00:57:17.410
Aber, ja, natürlich diese ganzen Signale oder Features oder so, das, das würde man alles mit rein...

00:57:17.410 --> 00:57:18.690
Äh, mitziehen eigentlich.

00:57:18.690 --> 00:57:20.450
Ich weiß schon, was ich jetzt ausprobieren werde.

00:57:20.450 --> 00:57:22.430
Ja, ja.

00:57:22.430 --> 00:57:27.530
Und, äh, ich glaube, also mittlerweile, ich, ich weiß jetzt nicht, ich weiß nicht mal, was, äh, was da verwendet wird.

00:57:27.530 --> 00:57:33.590
Also, bei Google habe ich jetzt noch, also, die, die gerade, die Verfahren, die heutzutage verwendet werden, sind alle sehr, sehr schlau mittlerweile.

00:57:33.590 --> 00:57:34.430
Also...

00:57:34.430 --> 00:57:36.690
Sie hätten ja schon genug Trainingsdaten, um das noch ein bisschen mehr zu trainieren.

00:57:36.690 --> 00:57:40.110
Ja, irgendwie, die, da gibt es ja einen globalen Anteil, zum Beispiel bei Google.

00:57:40.110 --> 00:57:46.690
Ich weiß nicht genau, wann ich das letzte Mal ein Paper darüber gelesen habe, was sie machen, aber sie haben dann halt, äh, irgendwie, ihr Modell besteht teilweise halt aus so globalen...

00:57:47.250 --> 00:57:53.370
Spam-Geschichten, weil sie halt sehr viel Spam und Nicht-Spam haben, sozusagen, dass sie, die sie als Trainingsdaten verwenden können.

00:57:53.370 --> 00:58:07.230
Und dann hast, ist, äh, ist das Modell auch immer noch teilweise personalisiert auf dich, weil es gibt halt vielleicht auch Leute, die, äh, wenn ich jetzt irgendwie, keine Ahnung, ein, äh, äh, jemand bin, der sich professionell damit beschäftigt, Spam von Nicht-Spam zu unterscheiden.

00:58:07.230 --> 00:58:17.090
Ja, und dann, äh, mir die Leute Spam schicken als Beispiele und ich das nicht, äh, kriege, weil, äh, das heißt, es muss auch ein, äh, manche Leute, bei manchen Leuten ist das ja vielleicht okay, ja, oder, äh, weil, wenn ich jetzt,

00:58:17.090 --> 00:58:22.610
zum Beispiel, äh, ein nigerianischer Prinz bin, der irgendwie ein Bankkonto in der Schweiz hat, dann, äh, ja.

00:58:22.610 --> 00:58:27.930
Ich wäre schon froh, wenn die ganzen Leute, äh, meine Hilfe versuchen, ich will den Geld trinken und keiner will es haben, also, so, haha, ja.

00:58:27.930 --> 00:58:38.210
Ja, also, äh, ja, die, die bestehen halt aus so einer, äh, globalen, äh, so einem globalen, äh, Teil und halt aus so einem personalisierten Teil.

00:58:38.210 --> 00:58:41.050
Mir passiert das immer mit meinem Nachnamen, Leute sagen immer, haha, verarsch mich nicht.

00:58:41.050 --> 00:58:41.870
Ja.

00:58:41.870 --> 00:58:45.810
Ja, ist so, voice positive, ja, oder, was sagst du, ja?

00:58:46.930 --> 00:58:51.790
Äh, äh, werden voice positive, ja, das wird als Spam erkannt, weil man eigentlich was, alles in Ordnung, ja.

00:58:51.790 --> 00:58:58.330
Ähm, genau, und, ja, ähm, ja.

00:58:58.330 --> 00:59:00.330
Ich denke halt immer, ich mache mich lustig und finde meinen Humor doof.

00:59:00.330 --> 00:59:03.070
Ja.

00:59:03.070 --> 00:59:16.770
Ja, äh, äh, ja, also, die, die Dinger funktionieren so, also, ich habe, äh, es, weder das Spam durchgekommen ist, noch, dass ich, okay, vielleicht kriege ich einfach nicht mit, dass, äh, bei mir eine normale Mail verschwindet, aber, also, früher war das tatsächlich immer noch so ein Problem und mittlerweile,

00:59:16.770 --> 00:59:19.990
ist das alles so gut, ich würde immer einfach sagen, es funktioniert.

00:59:19.990 --> 00:59:46.610
Ja, ähm, genau, ja, ich habe dann halt noch so ein paar Sachen probiert und, äh, eben zum Beispiel, äh, jetzt hier die, äh, also, äh, irgendwie State of the Art, äh, irgendwie, äh, Textklassifikationsgeschichte ist schon besser als, äh, äh, äh, als Nike Base, aber nicht so wahnsinnig, also, in dem Fall halt gar nicht so wahnsinnig viel, halt irgendwie, ja, bisschen mehr F1,

00:59:46.610 --> 00:59:50.310
irgendwie, äh, Prozent oder anderthalb oder sowas, aber viel mehr auch nicht.

00:59:50.310 --> 00:59:53.590
Also, ach so, F1, äh, harmonische Mittel zwischen Precision und Tricor.

00:59:53.590 --> 00:59:56.590
Wir haben das, glaube ich, bei der Textklassifikationsfolge auch schon nochmal alles erzählt.

00:59:56.590 --> 01:00:01.210
Ja, aber wir wollten jetzt auch nicht, dass alle das alles nochmal, wir müssen gerade die auch gerade einschalten oder nur von der F-Base zuhören.

01:00:01.210 --> 01:00:05.330
Also, ähm, du musst vielleicht nochmal deswegen kurz erwähnen, was eine Support-Weck-Maschine ist und was Base hier ist.

01:00:05.330 --> 01:00:16.130
Ja, äh, richtig, also, Support-Weck-Maschinen, äh, sind, äh, auch eine Art von, äh, ja, Machine Learning.

01:00:16.450 --> 01:00:16.690
Motor.

01:00:16.690 --> 01:00:24.190
Verfahren, Modellen, ähm, 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.

01:00:24.190 --> 01:00:27.430
Was das, äh, eigentlich tut, ist, äh.

01:00:27.430 --> 01:00:29.490
Protagonale Vektoren auf irgendwelchen Ebenen erzeugen.

01:00:29.490 --> 01:00:38.410
Ja, es ist ein diskriminatives, äh, Machine Learning-Modell, das halt lernt, äh, sozusagen zwischen, wenn man jetzt ein paar Spam und Nicht-Spam nimmt, äh, zwischen diesen beiden Klassen.

01:00:38.410 --> 01:00:45.990
Das interpretiert halt auch, wie eigentlich fast alle Machine Learning-Modelle jetzt außerdem, na, die F-Base jetzt, das hat, das macht das nicht so, aber, äh, interpretiert halt,

01:00:46.290 --> 01:01:13.230
äh, Texte als Vektoren in einem, äh, dimensionalen Vektorraum, ja, wobei halt, also, das wäre ja auch, also, klassischer Back-of-Words-Ansatz, dass halt jedes Wort ist sozusagen eine Dimension und, äh, der Text ist halt einfach, äh, ja, der Vektor, der dann entsteht, wenn du, äh, sozusagen bei allen Wörtern, du gesehen hast, diese Dimensionen, denen ein Gewicht gibt, also, du kannst auch einfach eins setzen, dann wäre es halt binär, aber du kannst, äh, also, eins, du hast ein Wort, das Wort gesehen oder null, du hast das Wort halt nicht gesehen.

01:01:16.130 --> 01:01:19.750
Also, was kannst du dir so vorstellen vor deinem inneren Auge, wenn du versuchst, sie zu visualisieren?

01:01:19.750 --> 01:01:22.570
Das ist nicht, das ist nicht schlimm, das muss man sich nicht, äh, großartig vorstellen.

01:01:22.570 --> 01:01:23.570
Das muss man sich gar nicht vorstellen.

01:01:23.570 --> 01:01:36.110
Nee, also, ich, was ich mir vorstelle, ist halt irgendwas Dreidimensionales vielleicht. Aber man kann ja sagen, okay, das ist jetzt nicht gerade dreidimensional, sondern halt, äh, hunderttausenddimensional oder so. Ist ja, die Anschauung fügt einen dann halt unter Umständen.

01:01:36.110 --> 01:01:46.110
Also, viel geht vielleicht auch noch, wenn man sich so einen feststehenden Raum im Laufe des Zeitablaufs, wie der sich verändert, vorstellt. Fünf vielleicht noch, wenn da zwischendurch jemand den Vorhang aufmacht und reinguckt und sagt,

01:01:46.130 --> 01:01:50.370
Hallo, und dann da so einen Tunnel durchmacht, aber sechs, sieben, acht, ah.

01:01:50.370 --> 01:01:59.330
Ja, aber es ist ja, aber sich vorzustellen, dass, also, sich einen Text als Vektor hinzuschreiben, das kann man sich ja angucken, das ist nicht so schlimm.

01:01:59.330 --> 01:02:04.130
Ja, aber dann macht man das ja flach, man, also, die Betrachtung macht man ja dann irgendwie auf so ein Blatt Papier.

01:02:04.130 --> 01:02:11.230
Ja, also, das, was man dann tatsächlich macht, also, wenn man das jetzt erzählt, dann klingt das irgendwie, äh, kompliziert, aber es ist eigentlich total simpel.

01:02:11.230 --> 01:02:13.730
Man macht eigentlich nur Spalten auf von einer Zeile.

01:02:16.130 --> 01:02:35.250
Ja, und das, was ich auch komisch interpretieren wollte, ist, dass, wenn ich jetzt zum Beispiel, ähm, Vektoren, also, einmal habe ich halt da Werte drinstehen, nicht nur Einsen und Nullen, und diese Werte, diese Gewichte sind halt, äh, Term Frequency mal, äh, 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?

01:02:35.250 --> 01:02:46.110
Äh, Wörter wie der, die das wären, halt, üblicherweise nicht, bekommen kein hohes Gewicht, weil, äh, ja, kann man entweder rausfiltern oder es ist halt, weil die sind einfach nicht, ne, das, daraus kann ich einfach nicht, äh,

01:02:46.130 --> 01:03:16.110
jetzt nicht schließen, ob das Spam oder nicht Spam war, während eben sowas wie Viagra oder das Penis oder so, das ist wahrscheinlich, oder, äh, das, das ist deutlich charakteristischer, die werden bekommen ein höheres Gewicht und, äh, man, man guckt sich halt immer die Winkel zwischen Dingen an, äh, äh, in, in, in diesen Vektorräumen und das, die kann man einfach ausrechnen, indem man halt Sachen, das Skalarprodukt bildet zwischen, äh, zwischen, also man, und das auch wieder bei Phasenvektoren super einfach, weil, da man muss nur diese, die sind ja überall Null, nur an bestimmten Stellen nicht und man muss nur diese Stellen sich angucken, weil, äh,

01:03:16.130 --> 01:03:46.110
was dann halt auch wieder sehr schnell geht, also, was man dann dann letztendlich macht, ist total simpel, aber es klingt irgendwie, oh, Winkel, äh, in einem hunderttausenddimensionalen Raum, krass, klingt irgendwie voll, voll aufgefahren, ist aber eigentlich total einfach, also, wenn man sich jetzt anguckt, was wirklich passiert und, ähm, äh, also, da ist nichts Wildes dabei, das, was aber jetzt diese Vortaktormaschine macht an der Stelle, ist halt, wenn man sich jetzt diese Vektoren anguckt und man halt jetzt sozusagen die Wolken an Punkten irgendwie in diesem

01:03:46.130 --> 01:04:02.090
Raum, äh, das eine spammen, das andere nicht spammen und dann versucht die Sofort-Vektormaschine eine Ebene so zwischen diese, eine unterteilende, also, äh, eine separierende Hyper-Ebene so zwischen diese beiden, ähm, Klassen zu legen, dass der Abstand maximal wird zu beiden.

01:04:02.090 --> 01:04:08.150
So ein bisschen wie bei OLS, Optimal Linear Squares.

01:04:08.150 --> 01:04:14.710
Äh, ja, du meinst, äh, Ordinary Linear Squares?

01:04:16.130 --> 01:04:45.350
Das ist ein bisschen noch anders, ja.

01:04:45.350 --> 01:04:49.850
und diese Margin-Maximierung ist schon charakteristisch für Support-Tractor-Maschinen,

01:04:49.850 --> 01:04:52.530
beziehungsweise die Dinger werden halt auch Maximum-Margin-Classifier genannt.

01:04:52.530 --> 01:04:54.350
Und es gibt halt einen schönen Beweis, der sagt,

01:04:54.350 --> 01:05:04.410
Margin-Maximierung bedeutet halt auch Maximierung der Generalisierung beim Lärm.

01:05:04.410 --> 01:05:05.970
Und das ist natürlich auch eine sehr schöne Geschichte.

01:05:05.970 --> 01:05:08.650
Man kann es leider aus diversen technischen Gründen nicht so,

01:05:08.650 --> 01:05:10.110
also funktioniert es dann doch nicht.

01:05:12.890 --> 01:05:17.590
Das Problem ist vielleicht, dass man sich, wenn man sich an allen Punkten orientiert,

01:05:17.590 --> 01:05:20.970
so ein bisschen auch an den Extremwerten zu sehr entlanghaltet.

01:05:20.970 --> 01:05:24.270
Und wenn man sich mehr an dem Durchschnitt der Werte orientieren würde und da die Ebenen bildet,

01:05:24.270 --> 01:05:26.010
wäre die vielleicht ein bisschen präziser.

01:05:26.010 --> 01:05:30.530
Also vielleicht kann man die Güte erhöhen, indem man so ein bisschen diese Randwerte so außen vor lässt.

01:05:30.530 --> 01:05:33.630
Ja, man rechnet halt eine Verlustfunktion aus.

01:05:33.630 --> 01:05:34.910
Das kann man ja einfach machen.

01:05:34.910 --> 01:05:42.470
Und das ist halt ein konvexes Optimierungsproblem im Grunde.

01:05:42.890 --> 01:05:47.890
Also das Optimierungsverfahren innerhalb von der SVM löst das.

01:05:47.890 --> 01:05:50.350
Das ist halt das, was passiert.

01:05:50.350 --> 01:05:50.830
Ja, okay.

01:05:50.830 --> 01:05:57.050
Und am Schluss kommt halt das Ding raus, was tatsächlich irgendwie diese beiden Teile trennt.

01:05:57.050 --> 01:06:01.750
Und zwar, dass die Höherebene hat den größtmöglichen Abstand zwischen diesen beiden.

01:06:01.750 --> 01:06:05.970
Da kann man vielleicht noch ein bisschen was dran drehen, indem man so diese Grundgesamtheit so ein bisschen manipuliert.

01:06:05.970 --> 01:06:06.850
Aber ja.

01:06:06.850 --> 01:06:10.410
Aber sagen wir mal so, das funktioniert halt sehr gut.

01:06:10.410 --> 01:06:12.830
Es ist halt auch so, irgendwie in diesem Hochdeutschland,

01:06:12.890 --> 01:06:13.930
da ist viel Platz.

01:06:13.930 --> 01:06:18.450
Deswegen funktionieren lineare Modelle da so sehr schön, weil man kann die halt auch so durchlegen.

01:06:18.450 --> 01:06:22.150
Wenn das weniger dimensional wird, dann geht das halt linear nicht mehr.

01:06:22.150 --> 01:06:24.230
Da muss das alles irgendwie gewogen sein, aber das wird alles viel schwieriger.

01:06:24.230 --> 01:06:26.670
Und es könnte sein, dass wenn man auf einmal ganz viele komische Werte bekommt,

01:06:26.670 --> 01:06:28.130
dass man irgendwie so ein Klassifizierungsproblem hat,

01:06:28.130 --> 01:06:30.850
weil man irgendwie vielleicht noch eine Klasse hat, die man übersehen hat oder sowas.

01:06:30.850 --> 01:06:32.670
Gut, klar.

01:06:32.670 --> 01:06:34.430
Natürlich, das kann auch immer sein.

01:06:34.430 --> 01:06:38.190
Genau, aber eigentlich ist das auch...

01:06:38.190 --> 01:06:39.930
Also Support-Effekte-Maschinen, schöne Geschichte.

01:06:39.930 --> 01:06:42.870
Aber das eigentliche Ding, warum ich das jetzt auch hier verwendet habe, ist,

01:06:42.890 --> 01:06:47.290
dass die halt für Text-Klassifikationen super funktioniert haben.

01:06:47.290 --> 01:06:52.470
Da gab es halt eben bekannte Arbeit von Thorsten Jochim zu 1997 drüber.

01:06:52.470 --> 01:06:57.430
Und seitdem habe ich jedenfalls nicht wirklich substanzielle Fortschritte gesehen.

01:06:57.430 --> 01:06:59.210
Also gut, doch.

01:06:59.210 --> 01:07:03.130
Also wenn man sagt, Word-Embeddings sind halt nochmal ein ordentlicher Fortschritt gewesen.

01:07:03.130 --> 01:07:06.390
Aber das wäre im Grunde nur eine andere Art, irgendwie Texte darzustellen.

01:07:06.390 --> 01:07:08.190
Ja, das ist halt schon besser als Back-of-Words.

01:07:08.190 --> 01:07:11.830
Aber...

01:07:11.830 --> 01:07:13.570
...wird dann halt auch nochmal irgendwie ein bisschen besser.

01:07:13.570 --> 01:07:15.530
Aber es ist halt...

01:07:15.530 --> 01:07:17.470
Es wird auch durchgehend über alle Datasets und so besser.

01:07:17.470 --> 01:07:21.790
Aber es ist halt jetzt nicht so, dass man sagt, okay, das ist jetzt eine ganz andere Kategorie von gut, plötzlich.

01:07:21.790 --> 01:07:24.510
Es ist halt...

01:07:24.510 --> 01:07:28.910
Also wenn man jetzt TF-IDF-Gewichte nimmt statt binäre, einfach nur 1 zu 0, wird es auch ein bisschen besser.

01:07:28.910 --> 01:07:32.650
Und der Vorteil von Word-Embeddings ist, vielleicht noch sogar ein bisschen mehr,

01:07:32.650 --> 01:07:36.850
aber so in der gleichen Größenordnung wie von binären Gewichten zu TF-IDF zu gehen.

01:07:36.850 --> 01:07:38.970
Du musst ja immer noch sagen, was TF-IDF ist.

01:07:38.970 --> 01:07:39.510
Ja, genau.

01:07:39.510 --> 01:07:40.970
Das ist halt eben...

01:07:41.830 --> 01:07:44.270
Charakteristisch ist ein Wort eigentlich sozusagen...

01:07:44.270 --> 01:07:44.790
Für die Kategorie.

01:07:44.790 --> 01:07:45.570
Ja, genau.

01:07:45.570 --> 01:07:47.250
Kann man sich halt auch ausrechnen.

01:07:47.250 --> 01:07:49.410
Darf man natürlich auch auf den Trainingsabend machen, aber...

01:07:49.410 --> 01:07:49.570
Genau.

01:07:49.570 --> 01:07:51.750
Und...

01:07:51.750 --> 01:07:53.230
Ja.

01:07:53.230 --> 01:07:56.470
Word-Embeddings sind halt auch nochmal so eine Geschichte.

01:07:56.470 --> 01:07:57.450
Müsste ich jetzt eigentlich auch nochmal erklären.

01:07:57.450 --> 01:08:04.510
Da ist halt eine andere Art, sozusagen Wörter in einen höherdimensionalen Vektorraum abzubilden.

01:08:04.510 --> 01:08:08.030
Und da ist es dann halt nicht mehr so, dass es sozusagen pro Wort eine Dimension gibt,

01:08:08.030 --> 01:08:11.770
sondern es gibt halt einen dreihundertdimensionalen Vektorraum oder was auch immer,

01:08:11.830 --> 01:08:15.330
ich weiß nicht, kann man sich aussuchen, wie viele Dimensionen man verwenden möchte.

01:08:15.330 --> 01:08:17.410
Und jedes Wort ist dann halt ein Vektor da drin.

01:08:17.410 --> 01:08:23.670
Sodass man halt auch abbilden kann, dass Worte oft nicht nur sozusagen ein Ding beschreiben oder für einen,

01:08:23.670 --> 01:08:26.190
sondern die haben halt Anteile da und Anteile da.

01:08:26.190 --> 01:08:32.410
Und man kann damit dann quasi sozusagen gewisserweise auch die Bedeutung so ein bisschen besser mit abbilden.

01:08:32.410 --> 01:08:33.270
Hier ist dein Schild.

01:08:33.270 --> 01:08:34.410
Ja.

01:08:34.410 --> 01:08:37.550
Und das funktioniert sehr gut.

01:08:37.550 --> 01:08:40.830
Und das hat halt nochmal irgendwie Arbeit mit Text irgendwie genauer gemacht.

01:08:40.830 --> 01:08:41.470
Aber...

01:08:41.830 --> 01:08:42.470
Ja, so ein bisschen.

01:08:42.470 --> 01:08:49.430
Aber dass es wirklich da jetzt substanzielle Verbesserungen gegeben hätte, habe ich jetzt also seit...

01:08:49.430 --> 01:08:50.370
97 schon eine Weile her.

01:08:50.370 --> 01:08:53.190
Ist schon relativ lange her und ist eigentlich nicht so...

01:08:53.190 --> 01:08:54.690
Oder ich habe irgendwas übersehen, das kann natürlich auch sein.

01:08:54.690 --> 01:08:56.730
Aber ich meine, da ist nicht so wahnsinnig viel passiert.

01:08:56.730 --> 01:08:57.930
Falls ihr was übersehen habt, bitte schicken.

01:08:57.930 --> 01:09:00.790
Bis vor kurzem.

01:09:00.790 --> 01:09:06.270
Und ja, das ist vielleicht auch noch eine ganze...

01:09:06.270 --> 01:09:08.070
Das möchte ich unbedingt mal selber ausprobieren.

01:09:08.070 --> 01:09:09.430
Ach, das ist auch vielleicht...

01:09:09.430 --> 01:09:11.070
Genau, wir haben ja mit...

01:09:11.070 --> 01:09:11.710
Ja.

01:09:11.830 --> 01:09:15.670
Nico hat diese Episode zu Textklassifikation gemacht.

01:09:15.670 --> 01:09:24.950
Und der hat jetzt in seinem Podcast Tech-Tiefen auch so eine Miniserie zu Natural Language Processing gemacht.

01:09:24.950 --> 01:09:29.010
Und da fand ich einige Sendungen sehr gut.

01:09:29.010 --> 01:09:37.350
Unter anderem die, wo er über diese neuen Modelle spricht irgendwie.

01:09:37.350 --> 01:09:39.990
Der ganze Startup, das da irgendwie mit...

01:09:39.990 --> 01:09:40.370
Genau, genau.

01:09:40.370 --> 01:09:41.670
Und halt auch das...

01:09:41.670 --> 01:09:43.110
Die Folge über Spacey fand ich sehr gut.

01:09:43.110 --> 01:09:48.530
Spacey ist halt so eine Open-Source-Bibliothek für NLP-Geschichten.

01:09:48.530 --> 01:09:53.270
Aber halt ein bisschen mehr fokussiert auf Produktionssachen als jetzt zum Beispiel NLTK.

01:09:53.270 --> 01:09:54.470
Ist halt eher so Forschungsgeschichten.

01:09:54.470 --> 01:09:55.310
Super langsam.

01:09:55.310 --> 01:09:56.450
Habe ich früher mal versucht zu verwenden.

01:09:56.450 --> 01:09:59.850
Also es gibt sicher Berechtigungen, das zu verwenden.

01:09:59.850 --> 01:10:03.450
Aber wenn man jetzt produktiv irgendwas machen möchte, dafür geht es oft nicht gut.

01:10:03.450 --> 01:10:06.070
Weil es halt nicht darauf optimiert ist, das schnell zu sein.

01:10:06.070 --> 01:10:09.050
Ich habe in NLTK mal ein paar Endgramme über Harry Potter mit ein paar Kindern.

01:10:09.050 --> 01:10:10.210
Die haben das sehr gefreut.

01:10:10.210 --> 01:10:11.650
Das geht bestimmt alles super.

01:10:11.830 --> 01:10:13.150
Aber wenn wir jetzt irgendwie...

01:10:13.150 --> 01:10:13.830
Ja, weiß ich nicht.

01:10:13.830 --> 01:10:16.050
Wenn ein Geschäft darin besteht, Sachen zu klassifizieren oder so.

01:10:16.050 --> 01:10:16.670
Oder schnell zu sein.

01:10:16.670 --> 01:10:19.070
Dann ist NLTK vielleicht nicht so die Wahl.

01:10:19.070 --> 01:10:20.050
Aber Spacey das.

01:10:20.050 --> 01:10:23.310
Also die Geschichten da sind optimiert.

01:10:23.310 --> 01:10:26.370
Es ist nicht so, dass es einfach ein Toolkit ist mit allen möglichen Dingen, die man halt verwenden kann.

01:10:26.370 --> 01:10:31.270
Sondern die implementieren dann halt die Sachen, die am besten funktionieren.

01:10:31.270 --> 01:10:31.830
Auch in schnell.

01:10:31.830 --> 01:10:33.590
Und die kann man dann sozusagen verwenden.

01:10:33.590 --> 01:10:39.650
Und ja, das ist sowieso interessant, was in dem Bereich alles passiert.

01:10:39.650 --> 01:10:41.650
Aber was jetzt in letzter Zeit...

01:10:41.670 --> 01:10:42.670
Und tatsächlich...

01:10:42.670 --> 01:10:47.630
Da passiert so etwas Ähnliches wie bei ImageNet.

01:10:47.630 --> 01:10:52.890
Da gab es ja auch irgendwie mit Deep Learning halt so eine...

01:10:52.890 --> 01:10:53.850
ImageNet kennt ihr noch?

01:10:53.850 --> 01:10:54.290
Ja.

01:10:54.290 --> 01:10:55.550
Hatten wir auch schon mal vorgestellt.

01:10:55.550 --> 01:10:56.990
Das ist halt so...

01:10:56.990 --> 01:10:57.670
Da gibt es ja diese...

01:10:57.670 --> 01:11:00.450
Darauf basierende...

01:11:00.450 --> 01:11:03.670
Also auf dem ImageNet-Datastat basiert es halt so eine Challenge...

01:11:03.670 --> 01:11:05.870
Wie heißt dieser Wettbewerb noch?

01:11:05.870 --> 01:11:07.450
Very Large Data...

01:11:07.450 --> 01:11:08.510
Irgendwie Image...

01:11:08.510 --> 01:11:09.690
Ich weiß nicht mehr genau.

01:11:09.690 --> 01:11:11.190
Hatten wir auch...

01:11:11.190 --> 01:11:15.170
Das Ding läuft irgendwie jedes Jahr.

01:11:15.170 --> 01:11:21.090
Und 2011 haben ja Leute da irgendwie angefangen, sich wirklich damit mal zu beschäftigen.

01:11:21.090 --> 01:11:23.370
So wie man das dann mit Bildklassifikationen kriegt.

01:11:23.370 --> 01:11:27.390
Und 2013 hat AlexNet irgendwie dann diese Challenge gewonnen.

01:11:27.390 --> 01:11:29.050
Und zwar mit großem Abstand.

01:11:29.050 --> 01:11:32.230
So irgendwie Reduktion des Fehlers um die Hälfte oder sowas.

01:11:32.230 --> 01:11:35.930
Und ist in Regionen vorgestoßen, wo man vorher gedacht hatte, da kommt man gar nicht hin und so.

01:11:35.930 --> 01:11:40.710
Und ja, also da ist etwas passiert, was halt irgendwie...

01:11:40.710 --> 01:11:43.710
Ja, und dann Jahr für Jahr danach ist es immer besser geworden.

01:11:43.710 --> 01:11:50.570
Und also 2013 ist halt substanziell der Fehler irgendwie runtergegangen.

01:11:50.570 --> 01:11:57.270
Dann 2014 nochmal, 2005 nochmal, nach 2016 irgendwie oder so, glaube ich, sind die Modelle irgendwie bei Superhuman Performance.

01:11:57.270 --> 01:12:00.510
Also machen weniger Fehler als Menschen beim Labeln.

01:12:00.510 --> 01:12:08.930
Mittlerweile, glaube ich, machen die Modelle, die besten Modelle jetzt, machen einen Fehler, der ist halb so groß wie der, den Menschen machen.

01:12:08.930 --> 01:12:10.510
Und das bei so Tasks wie...

01:12:10.710 --> 01:12:14.050
Ja, ist da eine Katze auf dem Bild oder so?

01:12:14.050 --> 01:12:15.450
Wo man sich denkt, so das ist...

01:12:15.450 --> 01:12:17.030
Also, ja klar, das sollte man ja können.

01:12:17.030 --> 01:12:21.730
Gut, also ich meine, da sind auch fiese Bilder dabei, sowas wie unterschiedliche Hunderassen und sowas.

01:12:21.730 --> 01:12:25.150
Oder man sieht nur so ein Hinterteil mit so einem Schwanz und weiß dann nicht, ist das eine Katze oder sonst irgendwas.

01:12:25.150 --> 01:12:32.890
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.

01:12:32.890 --> 01:12:37.430
Dass die da deutlich besser sind, das ist beeindruckend.

01:12:37.430 --> 01:12:39.770
Und zwar ist das halt in sehr kurzer Zeit passiert.

01:12:40.230 --> 01:12:41.410
Ja, sozusagen, das ist ja auch sehr beeindruckend.

01:12:41.410 --> 01:12:46.010
Also da ist irgendwas passiert, was halt das ganze Feld sozusagen sehr stark in Bewegung gesetzt hat.

01:12:46.010 --> 01:12:48.870
Und sowas ähnliches sehen wir jetzt gerade bei NLP-Geschichten halt auch.

01:12:48.870 --> 01:12:53.890
Das war mir jetzt bis vor eben kurz noch gar nicht so richtig klar, dass das gerade passiert.

01:12:53.890 --> 01:12:55.570
Deutsch.

01:12:55.570 --> 01:12:56.970
Ja.

01:12:56.970 --> 01:13:00.290
Ja, Deutsch ist halt immer ein bisschen doof.

01:13:00.290 --> 01:13:02.890
Das ist eine Sprache, für die sich irgendwie niemand so richtig interessiert.

01:13:02.890 --> 01:13:03.910
Dä-düm.

01:13:03.910 --> 01:13:08.750
Also, ja, aber da gibt es wohl auch jemanden...

01:13:08.750 --> 01:13:09.910
Es gibt halt diese großen...

01:13:10.230 --> 01:13:17.490
Sprachmodelle, irgendwie BERT, irgendwie XLNet, TPT2, BERT.

01:13:17.490 --> 01:13:20.030
Ja, wir werden... Sesamstraße, wie war das?

01:13:20.030 --> 01:13:21.650
Genau, Muppet Show, glaube ich, oder?

01:13:21.650 --> 01:13:22.210
Muppet Show.

01:13:22.210 --> 01:13:23.010
Oder Sesamstraße, ja.

01:13:23.010 --> 01:13:24.250
Also, die sind wahrscheinlich da.

01:13:24.250 --> 01:13:24.830
Ja.

01:13:24.830 --> 01:13:32.490
Und da werden halt so große Transformer-Modelle trainiert.

01:13:32.490 --> 01:13:37.090
Und der Witz daran ist, ich habe mich vorher immer mit sich gewusst, ich habe das schon mitgekriegt, dass das passiert.

01:13:37.090 --> 01:13:39.430
Und ich dachte mir so, ja, warum trainiert man dann so riesige Modelle, was soll denn das?

01:13:39.750 --> 01:13:47.790
Also, man ist auch sehr teuer und auch verbrennt unfassbar viel Energie und Taktzyklen und so.

01:13:47.790 --> 01:13:52.490
Warum macht man das denn jetzt, um ein bisschen besser vorherzusagen, was das nächste Wort im Satz ist?

01:13:52.490 --> 01:13:56.730
Ja, gut, das ist schon ein interessantes Problem, aber warum wirft man da so viel Geld drauf und so viele Ressourcen?

01:13:56.730 --> 01:14:00.990
Und dann ist es aber genau wie bei ImageNet.

01:14:00.990 --> 01:14:09.610
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,

01:14:09.750 --> 01:14:11.890
kann man die auf neue Probleme sehr gut anpassen.

01:14:11.890 --> 01:14:20.170
Dann nimmt man halt irgendwas, wo man jetzt nur wenige Trainingsbeispiele hat und feintunt diese auf ImageNet trainierten Modelle auf dieses Problem

01:14:20.170 --> 01:14:26.130
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.

01:14:26.130 --> 01:14:30.950
Und kann dann halt irgendwie in einem konkreten Anwendungsfall halt sehr, sehr gut sein.

01:14:30.950 --> 01:14:38.370
Und ich glaube, auch da ist den Leuten noch nicht so richtig bewusst, was das eigentlich bedeutet.

01:14:38.370 --> 01:14:39.730
Und Anwendungen gibt es da auch noch nicht so viele.

01:14:39.750 --> 01:14:42.990
Aber da gibt es wahrscheinlich, also da werden wir sehr viele Anwendungen sehen, denke ich.

01:14:42.990 --> 01:14:50.050
Das ist halt jetzt, also mein Beispiel dafür war halt irgendwie eigentlich, dass irgendwie Flaschenpfandautomaten da so schlecht sind.

01:14:50.050 --> 01:14:50.670
Das muss eigentlich nicht sein.

01:14:50.670 --> 01:14:51.550
Das könnte alles viel besser gehen.

01:14:51.550 --> 01:14:57.570
Und das gilt im Grunde für alle Probleme, wo man irgendwie visuell was erkennen möchte.

01:14:57.570 --> 01:15:00.730
Das ist theoretisch durch.

01:15:00.730 --> 01:15:02.190
Jetzt muss man es eigentlich nur noch praktisch umsetzen.

01:15:02.190 --> 01:15:03.850
Wir haben ja gerade schon ein bisschen davon.

01:15:03.850 --> 01:15:04.930
Ja, dieser Mensch darf in die Stadt.

01:15:04.930 --> 01:15:05.950
Nein, der darf nicht in die Stadt.

01:15:05.950 --> 01:15:07.310
Ja, dieser Mensch darf da und da hinten.

01:15:07.310 --> 01:15:08.430
Ja, da könnte es auch sein.

01:15:09.750 --> 01:15:11.530
Ja, ja, es ist, ja.

01:15:11.530 --> 01:15:12.910
Diese Ampel bleibt für dich rot.

01:15:12.910 --> 01:15:14.770
Ja.

01:15:14.770 --> 01:15:17.990
Gibt doch nicht mal die guten Tipps.

01:15:17.990 --> 01:15:22.930
Ja, es ist nicht ganz unproblematisch.

01:15:22.930 --> 01:15:23.370
Das stimmt auch.

01:15:23.370 --> 01:15:34.150
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 Wikipedia.

01:15:34.150 --> 01:15:35.610
Man braucht eigentlich noch ein bisschen mehr als Wikipedia.

01:15:35.610 --> 01:15:39.250
Dann kann man da.

01:15:39.750 --> 01:15:42.810
Dann kann man da unterschiedliche Prediction-Heads draufsetzen für unterschiedliche Probleme.

01:15:42.810 --> 01:15:46.790
Und man nimmt halt sozusagen irgendwie, aber es sind halt alles Sprachprobleme.

01:15:46.790 --> 01:15:48.870
Also auch so ein Text-Klassifikations-Problem kann man halt nehmen.

01:15:48.870 --> 01:15:58.150
Jagt das halt, benutzt halt zum Beispiel BERT, um das halt irgendwie sozusagen um diese.

01:15:58.150 --> 01:16:00.230
Das ist ein Prediction-Head.

01:16:00.230 --> 01:16:01.090
Ja, genau.

01:16:01.090 --> 01:16:01.710
Das ist halt.

01:16:01.710 --> 01:16:06.610
Im Grunde, die Dinger übersetzen das ja irgendwie in eine interne Repräsentation.

01:16:06.610 --> 01:16:09.670
Und dann übersetzen sie es.

01:16:09.670 --> 01:16:11.190
Und dann übersetzen sie es wieder zurück in das, was du haben willst.

01:16:11.190 --> 01:16:12.610
Und du kannst das austauschen.

01:16:12.610 --> 01:16:16.010
Du kannst halt sagen, okay, ich möchte, dass mein Language-Modell mir zum Beispiel Sätze generiert.

01:16:16.010 --> 01:16:18.150
Oder ich möchte, dass es halt Text-Klassifikation macht.

01:16:18.150 --> 01:16:21.150
Oder ich möchte, dass es irgendwie Named-Athlete-Recognition macht.

01:16:21.150 --> 01:16:21.750
Oder irgendwas.

01:16:21.750 --> 01:16:26.510
Also sozusagen Namen oder Orte findet in Texten oder sowas.

01:16:26.510 --> 01:16:27.510
Klingelt ja direkt die Kasse.

01:16:27.510 --> 01:16:30.730
Oder Fragen beantworten kann oder solche Sachen.

01:16:30.730 --> 01:16:35.670
Und du kannst das gleiche vortrainierte Modell nehmen für all diese unterschiedlichen Tasks.

01:16:35.670 --> 01:16:38.630
Ja, das heißt, du kannst.

01:16:38.630 --> 01:16:39.590
Und wie geht es halt?

01:16:39.590 --> 01:16:40.210
Ja, du kannst halt.

01:16:40.210 --> 01:16:43.590
Ich weiß nicht, wie viel Geld Google ausgegeben hat, um Börse zu trainieren.

01:16:43.590 --> 01:16:44.310
Oder weiß ich nicht.

01:16:44.310 --> 01:16:45.070
Auf jeden Fall eine ganze Menge.

01:16:45.070 --> 01:16:46.190
Das kannst du dir nicht leisten wahrscheinlich.

01:16:46.190 --> 01:16:49.530
Und du kannst das vortrainierte Modell nehmen.

01:16:49.530 --> 01:16:50.630
Passt es auf deinen Task an.

01:16:50.630 --> 01:16:54.070
Wie zum Beispiel jetzt irgendwie Text-Klassifikation von diesem Slam-Zox oder irgendwie.

01:16:54.070 --> 01:16:56.850
Und trainierst das halt da drauf.

01:16:56.850 --> 01:16:58.810
Und kriegst halt deutlich bessere Ergebnisse.

01:16:58.810 --> 01:17:00.010
Fotokasse.

01:17:00.010 --> 01:17:00.730
Genau.

01:17:00.730 --> 01:17:02.730
Und das würde ich gerne noch ausprobieren.

01:17:02.730 --> 01:17:03.570
Das habe ich jetzt noch nicht geschafft.

01:17:03.570 --> 01:17:04.750
Aber das mache ich bestimmt demnächst irgendwann.

01:17:04.750 --> 01:17:08.050
Aber es gibt schon Papers dazu jetzt.

01:17:08.050 --> 01:17:09.410
Ist aber auch jetzt im Frühjahr erschienen.

01:17:09.510 --> 01:17:16.750
Glaube ich, eines ist auch des Reuters-Datasets, das wir auch in der Text-Klassifikations-Ding-Episode hatten.

01:17:16.750 --> 01:17:18.650
Wo jemand das einfach genommen hat.

01:17:18.650 --> 01:17:24.850
Der hat noch zwei andere Text-Klassifikations-Korpus-Datasets benutzt.

01:17:24.850 --> 01:17:26.710
Also man sollte halt immer mehrere nehmen.

01:17:26.710 --> 01:17:31.350
Weil es kann ja auch Zufall sein, dass mal irgendwas in einem bestimmten Dataset besser funktioniert.

01:17:31.350 --> 01:17:38.950
Und da waren, also gegenüber diesen guten Zahlen von 97,

01:17:39.430 --> 01:17:42.950
Verbesserung von so 5% im F1-Wert oder sowas.

01:17:42.950 --> 01:17:44.090
Was Wahnsinn ist.

01:17:44.090 --> 01:17:45.890
Also das ist halt richtig, richtig viel.

01:17:45.890 --> 01:17:49.790
Das ist halt so Klasse von irgendwie.

01:17:49.790 --> 01:17:53.770
Also in einem Ding, wo man seit 20 Jahren nichts mehr gefunden hat, was es irgendwie besser macht.

01:17:53.770 --> 01:17:55.410
Da passiert plötzlich so ein Fortschritt.

01:17:55.410 --> 01:17:57.230
Da ist irgendwas Fundamentales passiert.

01:17:57.230 --> 01:18:00.530
Also da scheint es so zu sein zumindest,

01:18:00.530 --> 01:18:04.830
dass man tatsächlich mehr Informationen aus der Sprache da rausholen kann,

01:18:04.830 --> 01:18:06.450
als man das bisher konnte.

01:18:06.450 --> 01:18:08.550
Und das ist natürlich ein Hinweis darauf, dass da noch viele...

01:18:08.550 --> 01:18:09.270
Und da das jetzt...

01:18:09.270 --> 01:18:10.070
Das sind die ersten Ergebnisse.

01:18:10.070 --> 01:18:12.550
Da kann man ja dann noch optimieren.

01:18:12.550 --> 01:18:15.750
Das heißt, das wird sehr wahrscheinlich noch alles noch viel besser werden.

01:18:15.750 --> 01:18:18.930
Also man hat auf jeden Fall jetzt einen Ansatzpunkt,

01:18:18.930 --> 01:18:21.070
wo man wieder einen Hebel reinsetzen kann.

01:18:21.070 --> 01:18:25.370
Ja, das heißt, wir kriegen jetzt wahrscheinlich auch,

01:18:25.370 --> 01:18:28.890
was Probleme angeht, wo man mit Sprache zu tun hat,

01:18:28.890 --> 01:18:30.570
irgendwie deutlich bessere Ergebnisse.

01:18:30.570 --> 01:18:32.070
Und das betrifft dann eben solche Sachen wie Text-Klassifikation,

01:18:32.070 --> 01:18:33.490
Spam, Nicht-Spam.

01:18:33.490 --> 01:18:35.050
Gut, das ist schon gelöst irgendwie.

01:18:35.050 --> 01:18:36.890
Aber es ist halt auch so ein Spezialproblem.

01:18:36.890 --> 01:18:39.070
Und man kann das halt auch mit Spezialgeschichten...

01:18:39.110 --> 01:18:40.910
Gut anpacken.

01:18:40.910 --> 01:18:42.350
Ich war ein Böses.

01:18:42.350 --> 01:18:46.170
Aber man hat diese Probleme ja auch in anderen Bereichen,

01:18:46.170 --> 01:18:48.110
wo man dann jetzt nicht so viel Energie reinstecken möchte,

01:18:48.110 --> 01:18:49.950
wie in Spam versus Nicht-Spam-Erkennung.

01:18:49.950 --> 01:18:54.170
Sondern man hat halt ein paar hundert eigene Datenpunkte oder so

01:18:54.170 --> 01:18:56.010
und kriegt dann plötzlich Ergebnisse hin,

01:18:56.010 --> 01:19:00.170
wo man sonst viel Engineering hätte reinstecken müssen

01:19:00.170 --> 01:19:01.170
oder viel, viel mehr Daten.

01:19:01.170 --> 01:19:04.450
Und das ist natürlich schon eine super interessante Geschichte.

01:19:04.450 --> 01:19:07.410
Ja, genau.

01:19:07.410 --> 01:19:08.950
Also da kommen...

01:19:08.950 --> 01:19:09.590
Da kommen bestimmt noch Sachen zu.

01:19:09.590 --> 01:19:10.750
Das wird noch cool.

01:19:10.750 --> 01:19:11.570
Ha!

01:19:11.570 --> 01:19:13.010
Das wird noch cool.

01:19:13.010 --> 01:19:13.810
Ich bin schon mal gespannt,

01:19:13.810 --> 01:19:15.290
mal diese Dinger rauszuführen.

01:19:15.290 --> 01:19:17.910
Ja, ich hatte da einige Horrorgeschichten vielleicht noch,

01:19:17.910 --> 01:19:19.370
die man jetzt daran direkt anschließen kann.

01:19:19.370 --> 01:19:20.210
Weil es gibt ja dann...

01:19:20.210 --> 01:19:20.590
Horrorgeschichten?

01:19:20.590 --> 01:19:21.670
Die Möglichkeit, ja leider.

01:19:21.670 --> 01:19:22.870
Also auch...

01:19:22.870 --> 01:19:24.510
Das war ja Stanford irgendwie, ImageNet.

01:19:24.510 --> 01:19:25.230
Und dann, ich weiß jetzt nicht,

01:19:25.230 --> 01:19:27.850
wovon das Dings Sprachnetz herkam.

01:19:27.850 --> 01:19:28.910
Aber es gibt...

01:19:28.910 --> 01:19:32.030
Ja, die Player da momentan sind Google, Facebook.

01:19:32.030 --> 01:19:34.570
Also Facebook ist Excel-Net, Google ist Word.

01:19:38.790 --> 01:19:42.130
Genau, OpenAI hat GPT-2 gemacht.

01:19:42.130 --> 01:19:43.290
Aber ich weiß nicht so...

01:19:43.290 --> 01:19:44.430
Aber die großen Player...

01:19:44.430 --> 01:19:46.210
Habe ich am MIT so eine lustige Sache gesehen.

01:19:46.210 --> 01:19:48.910
Die haben etwas an die Gesichtsmuskeln angeschlossen,

01:19:48.910 --> 01:19:51.670
dass dann die Bewegung des Gesichtes

01:19:51.670 --> 01:19:54.910
auf deine innere Stimme metten kann.

01:19:54.910 --> 01:19:57.270
Und so könnte man tatsächlich dann irgendwie so lesen,

01:19:57.270 --> 01:19:59.010
was für Sätze diese Menschen denn gerade denken,

01:19:59.010 --> 01:20:00.890
wenn man die irgendwie so mitfilmen würde.

01:20:00.890 --> 01:20:02.990
Und daraus dann solche Sachen zu bauen,

01:20:02.990 --> 01:20:04.110
ist ein bisschen gruselig.

01:20:04.110 --> 01:20:06.410
Alter Ego heißt das Projekt, glaube ich.

01:20:06.410 --> 01:20:07.770
Ja, aber da bin ich mir sehr skeptisch,

01:20:07.770 --> 01:20:08.750
wenn Leute solche Sachen behaupten.

01:20:08.750 --> 01:20:08.770
Ja, aber da bin ich mir sehr skeptisch, wenn Leute solche Sachen behaupten.

01:20:08.770 --> 01:20:12.270
Ja, ja, nein, aber ich meine überhaupt,

01:20:12.270 --> 01:20:14.090
wenn es darum geht, vorher zu sagen...

01:20:14.090 --> 01:20:20.290
Also da geht sozusagen so der interne Bullshit-Alarm los,

01:20:20.290 --> 01:20:22.790
weil das natürlich etwas ist, was alle super gerne hätten,

01:20:22.790 --> 01:20:24.610
dass sie halt irgendwie Gedanken lesen können.

01:20:24.610 --> 01:20:26.770
Auf der anderen Seite aber man...

01:20:26.770 --> 01:20:28.770
Also Menschen nicht gut können.

01:20:28.770 --> 01:20:30.230
Und Menschen sind ziemlich gut.

01:20:30.230 --> 01:20:33.170
Also die Quote...

01:20:33.170 --> 01:20:34.190
Zum Beispiel bei erfahrenen Polizisten,

01:20:34.190 --> 01:20:35.190
die glauben alle, die könnten das.

01:20:35.190 --> 01:20:36.770
Aber wenn du das testest...

01:20:36.770 --> 01:20:38.750
Also die Studien jedenfalls...

01:20:38.750 --> 01:20:39.930
Ich bin ja jetzt auch kein Experte dafür,

01:20:39.930 --> 01:20:41.170
aber ich habe da auch so Sachen gesehen,

01:20:41.170 --> 01:20:44.390
wo halt die Quote von guten Polizisten

01:20:44.390 --> 01:20:46.650
irgendwie Lügner zu erkennen

01:20:46.650 --> 01:20:49.050
in Verhören ist so knapp über 50 Prozent.

01:20:49.050 --> 01:20:50.410
Also wenn die eigentlich wahrscheinlich...

01:20:50.410 --> 01:20:51.310
Gute Polizisten...

01:20:51.310 --> 01:20:52.910
Ich weiß es nicht so genau, aber...

01:20:52.910 --> 01:20:53.850
Und wenn die das schon nicht können,

01:20:53.850 --> 01:20:55.310
wie soll das ein Modell hinkriegen?

01:20:55.310 --> 01:20:56.750
Ja, aber die haben halt so ein Ding auf dem Gesicht.

01:20:56.750 --> 01:20:57.990
Also das ist ja interessant.

01:20:57.990 --> 01:20:58.530
Guck es dir mal an.

01:20:58.530 --> 01:21:00.230
Alter Ego heißt das mit MIT-Projekten.

01:21:00.230 --> 01:21:01.590
Okay, muss ich mir mal anschauen.

01:21:01.590 --> 01:21:02.870
Ja.

01:21:02.870 --> 01:21:03.970
Das ist wirklich spannend.

01:21:03.970 --> 01:21:05.490
Ja, also ich glaube,

01:21:05.490 --> 01:21:07.130
wir waren fast am Ende mit den Klassefeiern,

01:21:07.130 --> 01:21:07.890
aber du hast noch eine Sache,

01:21:07.890 --> 01:21:08.390
hast du noch gebaut,

01:21:08.450 --> 01:21:09.410
du hast noch andere,

01:21:09.410 --> 01:21:13.150
nach der Vektormaschine was anderes getestet.

01:21:13.150 --> 01:21:13.930
Ach so, das war Spacey.

01:21:13.930 --> 01:21:14.490
Das war Spacey.

01:21:14.490 --> 01:21:14.830
Ach, das war Spacey.

01:21:14.830 --> 01:21:17.170
Das war so ein neuronales Netz,

01:21:17.170 --> 01:21:18.870
das halt...

01:21:18.870 --> 01:21:20.570
Also es ist tatsächlich ein bisschen besser als NaiveBase.

01:21:20.570 --> 01:21:21.330
Es ist ein bisschen schlechter

01:21:21.330 --> 01:21:23.830
als die lineare Support-Vektormaschine

01:21:23.830 --> 01:21:28.630
und verbraucht aber wahnsinnig viel Rechenleistung natürlich.

01:21:28.630 --> 01:21:30.870
Macht ja natürlich auch viel kompliziertere Sachen,

01:21:30.870 --> 01:21:32.370
aber das ist halt auch so ein Ding.

01:21:32.370 --> 01:21:34.330
Ich meine, wenn die Daten das halt nicht hergeben

01:21:34.330 --> 01:21:35.850
und an der Stelle tun sie es wahrscheinlich nicht,

01:21:35.850 --> 01:21:36.790
dann nützt einem das halt nichts.

01:21:36.790 --> 01:21:38.150
Sondern man braucht halt dann auch...

01:21:38.150 --> 01:21:39.570
Man braucht dann auch entsprechende Trainingsdaten,

01:21:39.570 --> 01:21:41.270
um halt diese ganzen Parameter,

01:21:41.270 --> 01:21:43.170
diese Modelle halt auch ordentlich zu finden oder so.

01:21:43.170 --> 01:21:44.070
Aber ich könnte mir halt...

01:21:44.070 --> 01:21:45.250
Also was mich jetzt interessieren würde,

01:21:45.250 --> 01:21:46.370
ist, was ist denn jetzt,

01:21:46.370 --> 01:21:50.210
wenn ich jetzt so ein vortrainiertes Language-Modell nehme

01:21:50.210 --> 01:21:52.950
und dann nochmal gucke.

01:21:52.950 --> 01:21:54.350
Vielleicht wird das dann nochmal deutlich besser.

01:21:54.350 --> 01:21:56.230
Wobei, mit dem Data-Set, naja.

01:21:56.230 --> 01:21:57.190
Ja, okay.

01:21:57.190 --> 01:22:01.990
Aber eben, das zeigt halt zum Beispiel auch,

01:22:01.990 --> 01:22:03.230
finde ich, dass wenn man jetzt...

01:22:03.230 --> 01:22:05.770
Also Spacey ist schon, gilt so als State-of-the-Art

01:22:05.770 --> 01:22:07.490
und ich finde, das ist ja auch gut und so.

01:22:07.850 --> 01:22:09.850
Und wenn man das jetzt aber so naiv benutzt

01:22:09.850 --> 01:22:10.550
für so ein Problem,

01:22:10.550 --> 01:22:11.770
wo man jetzt halt irgendwie selber

01:22:11.770 --> 01:22:14.110
nicht so viele Daten hat,

01:22:14.110 --> 01:22:16.290
dann...

01:22:16.290 --> 01:22:17.590
Also ich würde sagen,

01:22:17.590 --> 01:22:19.750
da jetzt einfach so naiv Spacey genommen zu haben,

01:22:19.750 --> 01:22:21.170
wäre wahrscheinlich nicht unbedingt der richtige Weg gewesen.

01:22:21.170 --> 01:22:22.910
Sondern...

01:22:22.910 --> 01:22:23.090
Ja.

01:22:23.090 --> 01:22:24.890
Lieber naiv Base.

01:22:24.890 --> 01:22:26.370
Man muss manchmal so Dinge ausprobieren

01:22:26.370 --> 01:22:27.970
und manchmal ist es oft,

01:22:27.970 --> 01:22:29.630
zumindest um eine Baseline zu haben,

01:22:29.630 --> 01:22:31.070
eine sehr sinnvolle Sache,

01:22:31.070 --> 01:22:32.150
ein ganz einfaches Verfahren,

01:22:32.150 --> 01:22:33.010
was man gut versteht.

01:22:33.010 --> 01:22:35.250
Zumindest mal implementiert zu haben,

01:22:35.250 --> 01:22:36.910
zu sehen, ob man nicht irgendwo fundamental

01:22:36.910 --> 01:22:37.690
was kaputt macht.

01:22:37.690 --> 01:22:38.830
Oder was nicht verstanden hat.

01:22:38.830 --> 01:22:41.550
Und für sowas, ja,

01:22:41.550 --> 01:22:42.250
das ist eigentlich ganz gut.

01:22:42.250 --> 01:22:43.210
Cool.

01:22:43.210 --> 01:22:45.670
Ja, ich glaube, damit sind wir eigentlich schon praktisch

01:22:45.670 --> 01:22:46.630
mit der Geschichte...

01:22:46.630 --> 01:22:47.670
Ja, na, E-Space haben wir ja erklärt.

01:22:47.670 --> 01:22:49.370
Jetzt fehlt eigentlich noch der Pick der Woche

01:22:49.370 --> 01:22:51.070
und schöne Wünsche fürs...

01:22:51.070 --> 01:22:51.190
Ja.

01:22:51.190 --> 01:22:53.250
Ja, leider ist es erst Montag, Wochenende.

01:22:53.250 --> 01:22:54.550
Aber...

01:22:54.550 --> 01:22:56.130
Vielleicht ist es ja bei euch.

01:22:56.130 --> 01:22:58.230
Ja, das wird auch noch ein bisschen dauern,

01:22:58.230 --> 01:22:58.690
bis die Sendung nicht...

01:22:58.690 --> 01:23:00.170
Bis die Sendung raus ist.

01:23:00.170 --> 01:23:01.070
Aber ja, wir wissen noch nicht genau,

01:23:01.070 --> 01:23:01.530
wann sie erscheinen.

01:23:01.530 --> 01:23:04.190
Ja, was ist denn dein Pick der Woche?

01:23:04.190 --> 01:23:05.690
Du hast dir ja auch was Schönes rausgesucht.

01:23:05.690 --> 01:23:06.730
Genau.

01:23:06.730 --> 01:23:07.530
Das ist mein letztes...

01:23:07.530 --> 01:23:08.270
Irgendwie über den Weg gelaufen.

01:23:08.270 --> 01:23:09.150
Iceford.

01:23:09.150 --> 01:23:12.690
Und zwar geht es dabei darum,

01:23:12.690 --> 01:23:13.730
dass halt...

01:23:13.730 --> 01:23:15.310
Importe sortieren.

01:23:15.310 --> 01:23:15.850
Ja.

01:23:15.850 --> 01:23:18.910
Man kann ja...

01:23:18.910 --> 01:23:20.270
Man kann ja gefahrene Sachen machen,

01:23:20.270 --> 01:23:21.610
automatisiert seine Importe.

01:23:21.610 --> 01:23:23.750
Eine Standardform bringen ja mit Black und so.

01:23:23.750 --> 01:23:25.930
Aber das ändert jetzt zum Beispiel

01:23:25.930 --> 01:23:27.610
die Reihenfolge von Importen halt nicht.

01:23:27.610 --> 01:23:29.170
Und wenn man das komisch gemacht hat,

01:23:29.170 --> 01:23:29.730
dann...

01:23:29.730 --> 01:23:31.590
Also Black ist ein Autovermetter,

01:23:31.590 --> 01:23:33.330
den man in seinem Editor zum Beispiel einstellen kann

01:23:33.330 --> 01:23:35.330
oder mit dem man dann Dateien später

01:23:35.330 --> 01:23:36.370
so formatiert,

01:23:36.370 --> 01:23:37.510
dass auch eure Kollegen das lesen,

01:23:37.530 --> 01:23:39.730
weil die eure ganzen Gewohnheiten zunichte machen

01:23:39.730 --> 01:23:40.390
und das so formatieren,

01:23:40.390 --> 01:23:41.210
wie man es normalerweise tut.

01:23:41.210 --> 01:23:41.770
Genau.

01:23:41.770 --> 01:23:43.730
Aber wenn man jetzt viele Imports irgendwie hat,

01:23:43.730 --> 01:23:46.030
dann ist es auch vielleicht nicht schlecht,

01:23:46.030 --> 01:23:47.030
da eine Struktur drin zu haben.

01:23:47.030 --> 01:23:49.810
Und da guckt halt Black höchstens,

01:23:49.810 --> 01:23:52.050
dass die Teilen nicht zu lang werden oder so.

01:23:52.050 --> 01:23:55.470
Aber halt nicht, wie die sortiert sind.

01:23:55.470 --> 01:24:00.970
Weil das spielt halt keine Rolle für Black-Hands.

01:24:00.970 --> 01:24:03.230
Aber das ist halt vielleicht,

01:24:03.230 --> 01:24:04.890
wenn man da auch irgendwelche Regeln zu haben.

01:24:04.890 --> 01:24:07.370
Und das...

01:24:07.370 --> 01:24:10.330
Also jedenfalls bringt Iceford das halt auch in Standardformat.

01:24:10.330 --> 01:24:12.970
Ich glaube, wenn man das einfach ohne Config oder so benutzt,

01:24:12.970 --> 01:24:14.130
dann sortiert es das alphabetisch,

01:24:14.130 --> 01:24:16.310
dass es vielleicht auch nicht die sinnvollste Geschichte ist.

01:24:16.310 --> 01:24:18.490
Aber man kann dem halt auch sagen,

01:24:18.490 --> 01:24:19.670
was es priorisieren soll

01:24:19.670 --> 01:24:21.530
oder sagen, okay,

01:24:21.530 --> 01:24:25.450
Standard-Modul aus der Standard-Bibliothek nach oben oder so.

01:24:25.450 --> 01:24:27.630
Man kann das Ding auch relativ umfangreich konfigurieren.

01:24:27.630 --> 01:24:29.270
Und ich fand einfach nett zu sehen,

01:24:29.270 --> 01:24:30.650
dass es da überhaupt irgendwie eine Möglichkeit gibt,

01:24:30.650 --> 01:24:31.470
das automatisch zu machen.

01:24:31.470 --> 01:24:33.750
Ich glaube, es gab sogar so einen Hook in Black oder sowas.

01:24:33.750 --> 01:24:37.310
Nee, in Black ist es so,

01:24:37.370 --> 01:24:42.190
dass irgendwelche Leute haben da ein GitHub aufgemacht

01:24:42.190 --> 01:24:43.750
und gefragt, ob Black das nicht auch machen könnte.

01:24:43.750 --> 01:24:45.750
Und dann haben sie gesagt,

01:24:45.750 --> 01:24:46.850
naja, vielleicht nicht.

01:24:46.850 --> 01:24:47.570
Es gibt doch Iceford.

01:24:47.570 --> 01:24:48.970
Und dann hat man irgendwelche Leute gesagt,

01:24:48.970 --> 01:24:50.950
oh, Iceford hat aber die und die und die Probleme.

01:24:50.950 --> 01:24:52.530
Und gerade in Kombination mit Black

01:24:52.530 --> 01:24:53.490
macht das manchmal Sachen kaputt.

01:24:53.490 --> 01:24:56.650
Daraufhin hat der Autor von Iceford da geschrieben,

01:24:56.650 --> 01:24:58.970
ja, ich sehe das auch alles irgendwie,

01:24:58.970 --> 01:24:59.970
dass das problematisch ist.

01:24:59.970 --> 01:25:04.210
Und ich arbeite gerade an einer Black-Iceford-Implementation,

01:25:04.210 --> 01:25:07.250
die diese Probleme dann nicht hat.

01:25:07.370 --> 01:25:09.290
Also, falls ihr mittelgroße oder größere Projekte

01:25:09.290 --> 01:25:11.390
automatisch so dienen wollt mit euren Modulen,

01:25:11.390 --> 01:25:12.670
guckt euch das doch mal an.

01:25:12.670 --> 01:25:16.150
Ja, also mein Pick der Woche war PPtop.

01:25:16.150 --> 01:25:21.490
Das macht sowas wie Python-Prozesse anzeigbar wie Htop,

01:25:21.490 --> 01:25:22.490
wenn ihr das irgendwie kennt oder so.

01:25:22.490 --> 01:25:24.810
Htop, Htop oder Top, irgendwie was unter Linux,

01:25:24.810 --> 01:25:26.970
so ein bisschen die Prozesse und Memory-Management

01:25:26.970 --> 01:25:31.470
der einzelnen laufenden Prozess-IDs und so weiter euch zeigt.

01:25:31.470 --> 01:25:33.510
Macht das was mit Python-Prozessen, das ist relativ cool.

01:25:33.510 --> 01:25:36.810
Und ja, kann das so eine Inspektion geben?

01:25:36.810 --> 01:25:37.270
Was macht der?

01:25:37.330 --> 01:25:38.110
Ja, ein Prozess eigentlich gerade.

01:25:38.110 --> 01:25:40.670
Fand ich immer ganz interessant, um mal so ein bisschen rumzuspielen,

01:25:40.670 --> 01:25:41.910
mal ein bisschen zu debuggen und zu gucken,

01:25:41.910 --> 01:25:43.810
was passiert denn da eigentlich?

01:25:43.810 --> 01:25:46.430
Ja, klingt gut, muss ich mal ausprobieren.

01:25:46.430 --> 01:25:48.590
Ja.

01:25:48.590 --> 01:25:49.850
Ja, so.

01:25:49.850 --> 01:25:53.370
Da haben wir es quasi fast heute wieder geschafft, würde ich sagen.

01:25:53.370 --> 01:25:53.650
Ja.

01:25:53.650 --> 01:25:55.710
Ja, also falls jemand von euch gezählt hat,

01:25:55.710 --> 01:25:56.790
wie oft wir Penis gezählt haben,

01:25:56.790 --> 01:25:58.010
können da sich eine Folge bündeln.

01:25:58.010 --> 01:26:01.010
Noch toller wäre es natürlich, wenn ihr einen Algorithmus schreibt,

01:26:01.010 --> 01:26:02.710
der irgendwie die Sprache analysiert und uns genau zeigt,

01:26:02.710 --> 01:26:03.590
wo das denn gewesen ist.

01:26:03.590 --> 01:26:05.630
Wir wollen euch ja mal ein bisschen motivieren,

01:26:05.630 --> 01:26:06.910
zwei Projekte, wer weiß.

01:26:07.330 --> 01:26:10.030
Ja, danke, dass ihr wieder zugehört habt.

01:26:10.030 --> 01:26:11.850
Bleibt uns gewogen, teilt es wieder rein.

01:26:11.850 --> 01:26:14.270
Ja, und auch immer auf Zeit.

01:26:14.270 --> 01:26:15.870
Guten Tag, schon morgen Abend,

01:26:15.870 --> 01:26:17.850
8 Uhr, bis demnächst.

01:26:17.850 --> 01:26:19.510
Bis dann, tschüss.
