WEBVTT

00:00:00.680 --> 00:00:05.680
Ja, hallo liebe Hörerinnen und Hörer. Wir kommen bei der 13. Episode vom Python-Podcast.

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

00:00:08.280 --> 00:00:08.640
Jo, hallo.

00:00:09.480 --> 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 Spam sortieren.

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

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

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

00:00:52.500 --> 00:01:01.040
Ja, da kann man auf jeden Fall wieder sehen, Python kann das richtig gut. Aber wenn ihr wirklich ein Einstiegsbeispiel haben wollt, also in unserer nächsten Folge haben wir wieder, glaube ich, was vor, in der übernächsten, wirklich für Einfänger nochmal.

00:01:01.040 --> 00:01:03.380
Da machen wir mal so wirklich Einsteiger-Geschichten,

00:01:03.600 --> 00:01:05.360
einfach grundsätzliche Datentypen

00:01:05.360 --> 00:01:06.840
und so. Ich habe jetzt auch versucht, mich dabei

00:01:06.840 --> 00:01:08.900
dem Beispiel auf so die grundlegenden

00:01:08.900 --> 00:01:10.980
Datenstrukturen zu beschränken, die es halt

00:01:10.980 --> 00:01:12.900
irgendwie eingebaut gibt. Aber

00:01:12.900 --> 00:01:14.980
gut, so ganz super einsteigerfreundlich ist es

00:01:14.980 --> 00:01:17.140
vielleicht nicht. Aber es ist vielleicht trotzdem interessant.

00:01:17.140 --> 00:01:19.000
Wir haben übrigens Ende August mittlerweile,

00:01:19.120 --> 00:01:21.240
2019 immer noch und es ist tatsächlich

00:01:21.240 --> 00:01:22.940
immer noch so unglaublich warm wieder.

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

00:01:25.800 --> 00:01:26.780
Ja, wollen wir irgendwie,

00:01:27.240 --> 00:01:28.840
keine Ahnung, wir können ja erstmal so ein bisschen darüber reden,

00:01:28.980 --> 00:01:30.520
was passiert ist in letzter Zeit.

00:01:30.600 --> 00:01:32.320
dass wir an so Dingen gesehen haben.

00:01:32.700 --> 00:01:34.560
Also wir waren auf der Frostcourt, also ich noch ganz kurz

00:01:34.560 --> 00:01:35.240
und du ein bisschen länger.

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

00:01:38.740 --> 00:01:40.340
Ich habe nur den einen letzten zu

00:01:40.340 --> 00:01:42.400
Reinforced Learning mehr angehört.

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

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

00:01:48.640 --> 00:01:50.360
Ja, dazu gab es auch einen Vortrag, den habe ich auch geguckt.

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

00:01:55.340 --> 00:01:56.860
Ich habe auch so wahnsinnig

00:01:56.860 --> 00:01:58.500
viele Talks, habe ich gar nicht

00:01:58.500 --> 00:01:59.280
angeguckt.

00:01:59.280 --> 00:02:00.280
Du hast genetzt werden.

00:02:01.400 --> 00:02:03.600
Aber ansonsten, doch, ja, so ein paar Sachen

00:02:03.600 --> 00:02:04.700
habe ich auch schon gesehen, das stimmt.

00:02:05.200 --> 00:02:06.740
Ja, aber es war sehr interessant, es war viel los.

00:02:06.840 --> 00:02:08.220
Und es gab eine ganz tolle Kinderbetreuung.

00:02:08.740 --> 00:02:10.780
Ja, wenn ich das mal vorher gewusst hätte,

00:02:10.920 --> 00:02:12.100
ist mir gar nicht so aufgefallen.

00:02:12.160 --> 00:02:13.380
Aber es gab einen riesen Hüpfbock und so.

00:02:14.540 --> 00:02:15.760
Ja, hätte man...

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

00:02:18.600 --> 00:02:20.320
Ja, genau.

00:02:21.460 --> 00:02:25.220
Was, also, genau, dieser Deep Learning-Vortrag

00:02:25.220 --> 00:02:26.320
war jetzt, für mich war der jetzt,

00:02:26.320 --> 00:02:28.100
also, es ist interessant, weil mich das Thema

00:02:28.100 --> 00:02:30.340
natürlich interessiert und so, aber so wahnsinnig viel Neues

00:02:30.340 --> 00:02:32.160
war jetzt nicht dabei für mich.

00:02:32.160 --> 00:02:33.240
Auch der Workshop war jetzt

00:02:33.240 --> 00:02:36.100
wahrscheinlich schon interessant

00:02:36.100 --> 00:02:38.060
für Leute, die das jetzt noch gar nicht kennen, war das

00:02:38.060 --> 00:02:40.120
Katzen-versus-Hunde-Beispiel aus

00:02:40.120 --> 00:02:41.260
Kegel. Das hatten wir auch schon mal gemacht.

00:02:41.260 --> 00:02:43.980
Das hatten wir auch schon mal gemacht. Deswegen fand ich das auch

00:02:43.980 --> 00:02:45.880
interessant, ob das Leute vielleicht aus einem Ahnblickwinkel

00:02:45.880 --> 00:02:47.920
etwas besser darstellen

00:02:47.920 --> 00:02:49.460
oder was die da so zu erzählen.

00:02:50.740 --> 00:02:52.120
Ja, also die haben da

00:02:52.120 --> 00:02:53.980
irgendwie bessere Netze verwendet.

00:02:54.120 --> 00:02:55.380
Also die Zahlen waren hinterher besser.

00:02:56.060 --> 00:02:57.960
Das war tatsächlich ganz cool zu sehen und da muss ich

00:02:57.960 --> 00:02:59.760
mal gucken, ob ich da nicht vielleicht einfach noch mal so ein bisschen

00:02:59.760 --> 00:03:01.080
ein paar stärkere Modelle mit reinbauen.

00:03:02.000 --> 00:03:04.340
Aber so ansonsten

00:03:04.340 --> 00:03:05.000
war das jetzt

00:03:05.000 --> 00:03:07.760
für mich jetzt gar nicht, also

00:03:07.760 --> 00:03:09.700
war jetzt nicht so viel

00:03:09.700 --> 00:03:10.320
Neues dabei.

00:03:13.880 --> 00:03:15.660
Ja, und wir haben Post bekommen.

00:03:15.800 --> 00:03:17.160
Nette Post. Ah, genau, natürlich.

00:03:18.180 --> 00:03:19.620
Ein ganz schöner Brief von Thorsten. Vielen Dank

00:03:19.620 --> 00:03:21.220
für deinen super netten Brief. Ja, dankeschön.

00:03:21.460 --> 00:03:23.320
Wir haben es irgendwie nicht so richtig geschafft, darauf zu antworten, weil

00:03:23.320 --> 00:03:25.040
gerade viel Stress war. Es ist immer noch viel Stress.

00:03:25.600 --> 00:03:26.380
Hier hört nicht auf.

00:03:28.680 --> 00:03:49.600
Ja, aber trotzdem hat uns sehr gefreut und genau, wir hatten auch noch eine Mail bekommen von jemandem, der sich dafür interessiert hat, wie das mit den Generatoren so funktioniert. Ja, und das ist natürlich auch eine interessante Frage und vielleicht kann man das da eigentlich auch hier auch mal kurz...

00:03:49.600 --> 00:03:52.240
Ja, Jocken, sag doch mal bitte, was ist denn mit einem Generator?

00:03:53.100 --> 00:03:56.920
Genau, man kann auch einfach Listen nehmen und dann funktioniert das auch alles.

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

00:04:02.260 --> 00:04:07.340
Also wenn man zum Beispiel eine sehr große Datenstruktur hat mit vielen Elementen in der Liste

00:04:07.340 --> 00:04:12.380
und darüber iteriert, dann passt die vielleicht gar nicht komplett in den Hauptspeicher.

00:04:12.580 --> 00:04:15.280
Das wäre natürlich dann schlecht, weil dann würde das nicht funktionieren.

00:04:15.640 --> 00:04:18.060
Ist das nicht auch einer der Unterschiede von Python 2 auf Python 3 gewesen,

00:04:18.060 --> 00:04:19.780
dass bestimmte Sachen dann als Generatoren

00:04:19.780 --> 00:04:21.720
zurückgegeben wurden, wie vorher?

00:04:21.800 --> 00:04:24.140
Ja, also bei The Dict ist es

00:04:24.140 --> 00:04:26.060
irgendwie ab Python 3 so, dass Items

00:04:26.060 --> 00:04:28.440
einen

00:04:28.440 --> 00:04:30.180
Generator zurückliefert, während

00:04:30.180 --> 00:04:32.100
bei Python 2, glaube ich,

00:04:32.120 --> 00:04:33.580
Iter-Items musste man dann aufrufen.

00:04:34.220 --> 00:04:35.820
Ich bin mir noch nicht sicher, ob das wirklich der Unterschied

00:04:35.820 --> 00:04:37.600
zwischen 2 und 3 war. Kann aber gut sein.

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

00:04:39.800 --> 00:04:41.360
Bei Python 2 musste man X-Range.

00:04:42.720 --> 00:04:43.640
Ja, und

00:04:43.640 --> 00:04:45.960
X-Range dann den Generator und

00:04:45.960 --> 00:04:47.400
jetzt mittlerweile ist es halt so, dass

00:04:47.400 --> 00:04:49.220
Range einen Generator zurückgibt, was

00:04:49.220 --> 00:04:50.960
ja, halt auch irgendwie sinnvoller ist,

00:04:51.540 --> 00:04:53.380
weil wenn man Range irgendwie

00:04:53.380 --> 00:04:55.680
ich weiß nicht,

00:04:55.840 --> 00:04:57.680
wie groß die Zahl sein muss,

00:04:57.720 --> 00:04:58.840
die man in Range reinsteckt, damit

00:04:58.840 --> 00:05:01.580
man den Hauptspeicher dann platt macht und

00:05:01.580 --> 00:05:03.520
das Programm sofort beendet wird

00:05:03.520 --> 00:05:05.580
vom Kernel, wahrscheinlich muss man

00:05:05.580 --> 00:05:07.720
eine große Zahl nehmen, aber dann ist halt

00:05:07.720 --> 00:05:09.480
das so ein bisschen frustrierendes Erlebnis vielleicht, wenn

00:05:09.480 --> 00:05:10.340
dann einfach gar nichts mehr geht.

00:05:11.420 --> 00:05:13.540
Ja, aber genau, was ist überhaupt ein Generator? Also eine Liste?

00:05:14.560 --> 00:05:15.400
Wir wissen ja vielleicht,

00:05:15.480 --> 00:05:18.100
Da ist eine kleine Datenstruktur, wo verschiedene Elemente drinstehen,

00:05:18.200 --> 00:05:19.960
über die man sowas kann wie iterieren.

00:05:20.100 --> 00:05:22.980
Das heißt, man geht über jedes einzelne Listen-Element durch

00:05:22.980 --> 00:05:24.920
und kann dann damit Dinge anstellen.

00:05:24.920 --> 00:05:28.100
Der große Unterschied ist im Grunde, dass die Liste halt schon fertig ist.

00:05:28.260 --> 00:05:29.780
Also alle Elemente der Liste sind halt schon drin

00:05:29.780 --> 00:05:31.820
und das Ding ist irgendwie in der Datenstruktur, die im Hauptspeicher liegt.

00:05:32.260 --> 00:05:36.540
Bei dem Generator ist es so, dass, wenn man darüber iteriert,

00:05:36.680 --> 00:05:40.420
halt immer das Objekt gefragt wird, was ist denn das nächste Element?

00:05:41.120 --> 00:05:42.400
Dann gibt man das nächste Ding oder so.

00:05:42.820 --> 00:05:44.700
Und intern sieht das dann halt so aus,

00:05:44.800 --> 00:05:46.160
dass eine Funktion meistens dann irgendwas

00:05:46.160 --> 00:05:48.280
rausgildet. Also nicht

00:05:48.280 --> 00:05:49.720
Return, sondern irgendwie

00:05:49.720 --> 00:05:52.140
das Ergebnis. Das heißt, sie merkt sich, wo sie gerade war.

00:05:52.480 --> 00:05:53.800
Ja, genau. Und

00:05:53.800 --> 00:05:55.540
gildet dann

00:05:55.540 --> 00:05:57.640
das nächste Ding raus und

00:05:57.640 --> 00:06:00.120
muss aber die Sachen vorher und nachher

00:06:00.120 --> 00:06:02.080
gar nicht alle speichern, sondern betrachtet immer nur

00:06:02.080 --> 00:06:03.960
das aktuelle

00:06:03.960 --> 00:06:06.020
Element sozusagen oder das

00:06:06.020 --> 00:06:08.060
aktuelle Ergebnis einer Berechnung und

00:06:08.060 --> 00:06:09.940
wird dann halt weiterhin weiter ausgeführt

00:06:09.940 --> 00:06:12.020
bei der nächsten Iteration. Also

00:06:12.020 --> 00:06:14.560
das heißt, man kann halt über eine, eben

00:06:14.560 --> 00:06:15.920
wenn man das Beispiel Range nimmt,

00:06:16.440 --> 00:06:18.600
eine Liste von, weiß ich nicht, Billionen Zahlen

00:06:18.600 --> 00:06:20.600
iterieren, ohne diese Liste der Billionen

00:06:20.600 --> 00:06:22.600
Zahlen jemals irgendwo tatsächlich halten zu

00:06:22.600 --> 00:06:24.640
müssen. Aber es könnte an einer Stelle ein bisschen länger

00:06:24.640 --> 00:06:26.560
dauern, es zu berechnen, diesen einen Schritt zu

00:06:26.560 --> 00:06:28.520
gehen, was wahrscheinlich relativ marginal ist bei

00:06:28.520 --> 00:06:30.560
der CPU, aber die Liste würde

00:06:30.560 --> 00:06:31.920
sonst im Speicher schon komplett liegen.

00:06:32.620 --> 00:06:34.100
Genau, bei einer Liste, ja.

00:06:35.640 --> 00:06:36.580
Der Generator hat dann viel

00:06:36.580 --> 00:06:38.540
weniger Speicher, den er verbraucht, gerade bei so

00:06:38.540 --> 00:06:40.400
großen Datenmengen. Genau.

00:06:40.900 --> 00:06:42.900
ja, also es ist halt. Entsprechend auch schneller?

00:06:43.640 --> 00:06:45.360
Ja? Warum ist denn der Generator

00:06:45.360 --> 00:06:46.300
so viel schneller als die Liste?

00:06:46.900 --> 00:06:48.900
Ja, das kommt drauf an. Also das würde ich jetzt so nicht sagen, dass

00:06:48.900 --> 00:06:50.600
ein Generator immer schneller ist. Das kann man so nicht sagen.

00:06:50.880 --> 00:06:52.920
Okay. Ja, wahrscheinlich ein bisschen langsamer, aber

00:06:52.920 --> 00:06:55.080
es hat halt andere Vorteile.

00:06:55.220 --> 00:06:57.000
Also der Vorteil ist halt, man kann damit Dinge tun,

00:06:57.060 --> 00:06:57.860
die mit Listen halt nicht gehen.

00:06:58.960 --> 00:07:00.840
Und ja,

00:07:01.140 --> 00:07:03.360
also

00:07:03.360 --> 00:07:04.960
auch wenn man jetzt irgendwie

00:07:04.960 --> 00:07:07.100
zum Beispiel Files passt oder so, man möchte

00:07:07.100 --> 00:07:09.000
halt möglicherweise, also das wäre vielleicht auch

00:07:09.000 --> 00:07:10.900
so ein Beispiel für, du kannst

00:07:10.900 --> 00:07:13.440
natürlich irgendwie, wenn du ein großes XML-Dokument

00:07:13.440 --> 00:07:15.080
beispielsweise hast, auch das Ding

00:07:15.080 --> 00:07:15.600
komplett

00:07:15.600 --> 00:07:19.200
in den Hauptspeicher parsen

00:07:19.200 --> 00:07:21.060
als Datenstruktur und dann

00:07:21.060 --> 00:07:23.100
damit irgendwas machen. Oder du

00:07:23.100 --> 00:07:24.580
kannst halt da Schritt für Schritt durchgehen.

00:07:25.980 --> 00:07:27.120
Und Generatoren

00:07:27.120 --> 00:07:29.000
werden halt sozusagen, also sozusagen, das wäre

00:07:29.000 --> 00:07:30.880
eine andere Möglichkeit, das zu vergleichen. So irgendwie

00:07:30.880 --> 00:07:31.200
DOM

00:07:31.200 --> 00:07:34.400
Parser versus

00:07:34.400 --> 00:07:37.060
SACS Parser. Das kennt wahrscheinlich auch keiner.

00:07:37.080 --> 00:07:38.000
Was ist denn bitte ein SACS Parser?

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

00:07:39.300 --> 00:07:42.300
Das ist doch mal das Webseiten-Strukturelement

00:07:42.300 --> 00:07:43.280
von den HTML.

00:07:44.120 --> 00:07:44.860
ObjectModel, ja, genau.

00:07:46.340 --> 00:07:47.240
Also diesen

00:07:47.240 --> 00:07:50.020
Baum gibt es aber nicht nur jetzt bei HTML-Seiten,

00:07:50.140 --> 00:07:51.660
sondern halt, wenn du jetzt irgendwie beliebige

00:07:51.660 --> 00:07:53.220
XML-Geschichten hast,

00:07:54.140 --> 00:07:55.680
kann man halt auch entweder das so parsen oder

00:07:55.680 --> 00:07:57.580
sich vom Parser so zurückgeben lassen, dass man halt

00:07:57.580 --> 00:07:59.420
den kompletten Baum im Hauptspeicher hat.

00:08:00.580 --> 00:08:01.880
Was bei kleineren Sachen ja gar kein Problem

00:08:01.880 --> 00:08:03.900
ist und es ist halt ein bisschen komfortabler, weil man halt

00:08:03.900 --> 00:08:04.800
irgendwie

00:08:04.800 --> 00:08:06.720
da hin und her springen kann

00:08:06.720 --> 00:08:08.140
oder aber man

00:08:08.140 --> 00:08:09.580
sozusagen

00:08:09.580 --> 00:08:12.860
parsed das Event basiert und lässt sich halt

00:08:12.860 --> 00:08:14.720
vom Parser Events geben, wie zum Beispiel da kommt jetzt

00:08:14.720 --> 00:08:15.800
ein neues Element vorbei oder so.

00:08:17.040 --> 00:08:19.060
Und dafür muss das Ding

00:08:19.060 --> 00:08:20.600
aber halt nicht komplett im Hauptspeicher liegen,

00:08:21.060 --> 00:08:22.900
sondern das wird dann halt sozusagen iterativ geparsed

00:08:22.900 --> 00:08:24.840
und damit kann man halt Sachen parsen, die halt so groß

00:08:24.840 --> 00:08:26.500
sind. Ich meine,

00:08:27.020 --> 00:08:28.560
man braucht, wenn man das, wenn man

00:08:28.560 --> 00:08:30.240
XML komplett parsed, wahrscheinlich das

00:08:30.240 --> 00:08:32.920
den zwei-, drei-, vierfachen Speicher

00:08:32.920 --> 00:08:34.600
von dem, wenn es auf der Platte liegt,

00:08:35.260 --> 00:08:36.980
im Hauptspeicher. Und wenn jetzt 2 GB

00:08:36.980 --> 00:08:39.160
Ding auf der Platte liegen hat, dann

00:08:39.160 --> 00:08:41.380
hat man unter Umständen ein Problem.

00:08:41.520 --> 00:08:43.360
Früher war das schlimmer. Früher als

00:08:43.360 --> 00:08:44.300
32-Bit-Systeme noch,

00:08:44.700 --> 00:08:46.760
da war schnell Ende.

00:08:47.040 --> 00:08:49.500
Ein V-Speicher voll. Ja, war halt mit 3 GB

00:08:49.500 --> 00:08:51.340
4, ja, das ist halt Hauptspeicher voll.

00:08:52.400 --> 00:08:53.720
Ohm war out of mana, ne?

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

00:08:57.980 --> 00:08:59.320
Mittlerweile kann man ja auch viele Hauptspeicher

00:08:59.320 --> 00:09:01.440
einstecken. Begegnet ist einem wahrscheinlich

00:09:01.440 --> 00:09:02.640
eher selten, dass man irgendwie

00:09:02.640 --> 00:09:04.400
den Hauptspeicher ausgeht, wenn man irgendwas passt.

00:09:04.620 --> 00:09:08.280
Aber selbst das kann natürlich immer noch passieren.

00:09:08.660 --> 00:09:13.600
Und wenn man jetzt sozusagen auch in der Lage sein möchte,

00:09:13.700 --> 00:09:15.260
Daten zu verarbeiten, die jetzt nicht in den Hauptspeicher passen,

00:09:15.360 --> 00:09:16.260
dann macht man eben sowas.

00:09:17.180 --> 00:09:18.660
Und passt halt eventbasiert.

00:09:18.720 --> 00:09:21.980
Ist ein bisschen mehr Arbeit dann sozusagen beim Programmieren,

00:09:22.220 --> 00:09:24.400
aber verbraucht halt nicht so viele Hauptspeicher.

00:09:24.880 --> 00:09:27.100
Und solche Arten von Fällen gibt es natürlich viele,

00:09:27.100 --> 00:09:29.400
wo man irgendwie Ströme von Daten hat.

00:09:30.100 --> 00:09:32.080
Auch wenn man sich an irgendwelche APIs dranhängt,

00:09:32.180 --> 00:09:33.720
Dann kriegt man halt da irgendwie

00:09:33.720 --> 00:09:35.360
Reppchen weiter, irgendwelche Requests.

00:09:35.360 --> 00:09:36.380
Genau, dann

00:09:36.380 --> 00:09:39.280
ja, für all diese Dinge ist das halt

00:09:39.280 --> 00:09:40.580
sehr sinnvoll und

00:09:40.580 --> 00:09:42.200
ja, man kann

00:09:42.200 --> 00:09:45.220
Generatoren halt auch quasi mehr oder

00:09:45.220 --> 00:09:47.080
weniger, also

00:09:47.080 --> 00:09:49.060
man kann diese Funktionssyntax mit Yield

00:09:49.060 --> 00:09:50.900
verwenden oder halt das

00:09:50.900 --> 00:09:53.080
Iterator-Protokoll beziehungsweise Generator-Protokoll

00:09:53.080 --> 00:09:54.480
dann halt verwenden oder man kann halt auch einfach

00:09:54.480 --> 00:09:57.140
eine Generator-Expression schreiben, das ist so ähnlich

00:09:57.140 --> 00:09:59.260
wie List Comprehension, bloß halt mit runden Klammern

00:09:59.260 --> 00:10:00.580
statt Eckigen und dann

00:10:00.580 --> 00:10:03.000
hat man das halt auch in einer Zeile irgendwie hingeschrieben,

00:10:03.100 --> 00:10:04.580
was halt auch unter Umständen sehr praktisch ist.

00:10:05.260 --> 00:10:06.920
Aha, das heißt also, wenn ich eine LIS-Kompräension

00:10:06.920 --> 00:10:09.080
mit runden Klammern schreibe, habe ich automatisch

00:10:09.080 --> 00:10:10.720
einen Generator und das funktioniert genauso.

00:10:11.900 --> 00:10:13.080
Ja, und wenn man jetzt noch eine andere

00:10:13.080 --> 00:10:14.860
Geschichte mit dazu nimmt, dann

00:10:14.860 --> 00:10:16.580
hat man sogar, also

00:10:16.580 --> 00:10:19.100
wenn man jetzt nicht nur Sachen aus einer Funktion

00:10:19.100 --> 00:10:21.120
rausgilden kann, also sozusagen da passiert

00:10:21.120 --> 00:10:22.500
ja folgendes,

00:10:23.160 --> 00:10:25.040
also wenn normalerweise eine Funktion retornt, dann ist die Funktion

00:10:25.040 --> 00:10:27.040
ja fertig, aber

00:10:27.040 --> 00:10:29.340
wenn man etwas rausgildet,

00:10:29.520 --> 00:10:31.140
dann wird die Funktion sozusagen nur unterbrochen,

00:10:31.240 --> 00:10:33.200
bis halt sozusagen das nächste Ergebnis

00:10:33.200 --> 00:10:34.060
daraus geholt wird.

00:10:35.680 --> 00:10:37.520
Und wenn man jetzt auch noch Sachen da reinstecken

00:10:37.520 --> 00:10:38.740
kann, dann

00:10:38.740 --> 00:10:41.160
kann man tatsächlich so bidirektionale

00:10:41.160 --> 00:10:43.300
Kommunikation irgendwie haben. Und dann kann man so was

00:10:43.300 --> 00:10:45.080
haben wie einen WebSocker-Server oder irgendwie einen Server,

00:10:45.200 --> 00:10:46.980
der halt Sachen annimmt und wieder Sachen

00:10:46.980 --> 00:10:49.140
zurückschickt. Und das halt...

00:10:49.140 --> 00:10:50.640
Auch das macht einen Generator schön.

00:10:50.780 --> 00:10:53.280
Das wäre dann jetzt nicht mehr wirklich Generator,

00:10:53.280 --> 00:10:54.700
sondern das wäre dann irgendwie so Co-Routine.

00:10:55.060 --> 00:10:57.460
Aber das kann man da machen.

00:10:58.080 --> 00:11:00.740
Und ja, sehr nett.

00:11:00.880 --> 00:11:03.340
Oh, was mir auch dabei beim Beantworten dieser Mail aufgefallen ist,

00:11:03.340 --> 00:11:10.560
ist halt, dass mittlerweile Listen relativ wenig Hauptspeicher verbrauchen.

00:11:10.660 --> 00:11:11.860
In Python 3.7 war das jetzt.

00:11:11.920 --> 00:11:12.760
Das war früher viel mehr.

00:11:12.860 --> 00:11:15.140
Früher waren das irgendwie, also ich sage mal,

00:11:15.260 --> 00:11:16.460
also keine Ahnung, was habe ich da hingeschrieben?

00:11:17.600 --> 00:11:19.240
So bei 30 Byte oder so, ich weiß es nicht mehr genau.

00:11:19.340 --> 00:11:20.200
Also vielleicht auch ein bisschen weniger,

00:11:20.440 --> 00:11:22.520
bis wir die genauen Zahlen nachgucken.

00:11:22.620 --> 00:11:24.560
Aber man hat halt einen gewissen Overhead dadurch,

00:11:24.660 --> 00:11:27.100
dass das halt ein Objekt ist, ein integer Objekt,

00:11:27.220 --> 00:11:29.020
das halt in der Liste steckt und dann braucht man halt auch noch

00:11:29.020 --> 00:11:30.880
irgendwie eben,

00:11:31.080 --> 00:11:32.200
man hat halt die Referenz

00:11:32.200 --> 00:11:34.840
auf das Integer-Objekt, das Integer-Objekt

00:11:34.840 --> 00:11:36.940
braucht selber irgendwie Platz und dann hat man halt

00:11:36.940 --> 00:11:39.100
nicht das, was das Ding eigentlich brauchen würde,

00:11:39.200 --> 00:11:40.940
nämlich irgendwie 8 Byte bei einem

00:11:40.940 --> 00:11:42.920
64-Bit. C-Programmierer werden sagen,

00:11:43.040 --> 00:11:44.980
völlig ineffektiv wollen wir eigentlich. Ja, super

00:11:44.980 --> 00:11:46.700
ineffizient, sondern halt irgendwie das mal

00:11:46.700 --> 00:11:49.160
3 oder sowas. Oder 4.

00:11:50.760 --> 00:11:51.160
Was

00:11:51.160 --> 00:11:52.160
immer noch ganz okay ist, aber

00:11:52.160 --> 00:11:55.020
das macht natürlich schon einen großen Unterschied, wenn man

00:11:55.020 --> 00:11:56.740
jetzt Listen mit

00:11:56.740 --> 00:11:58.540
in einer großen Menge von

00:11:58.540 --> 00:12:01.260
Zahlen

00:12:01.260 --> 00:12:02.860
im gleichen Datentyp hat oder so, dann

00:12:02.860 --> 00:12:04.700
denkt man sich so, naja gut, irgendwie bekloppt.

00:12:06.200 --> 00:12:07.080
Früher eine Möglichkeit,

00:12:07.300 --> 00:12:08.960
das Array-Modul in der

00:12:08.960 --> 00:12:10.920
Standardbibliothek zu verwenden, das macht das

00:12:10.920 --> 00:12:12.900
einfach quasi so ein Type-Memory-View

00:12:12.900 --> 00:12:14.780
in C, da ist das auch, dem gibt man halt

00:12:14.780 --> 00:12:16.820
einen Typ an und dann braucht das

00:12:16.820 --> 00:12:18.720
genauso viel Platz, wie man da, wie der

00:12:18.720 --> 00:12:20.080
Typ halt braucht, nativ.

00:12:21.760 --> 00:12:22.980
Oder man nimmt ein NumPy,

00:12:23.100 --> 00:12:23.620
da geht das auch.

00:12:24.940 --> 00:12:26.720
NumPy ist natürlich jetzt nicht in der Standardbibliothek, aber

00:12:26.720 --> 00:12:31.820
so und jetzt habe ich halt nachgeguckt,

00:12:31.940 --> 00:12:33.520
wie viel wir brauchen, das ist eine Liste und da habe ich

00:12:33.520 --> 00:12:35.640
eine Liste mit 100 Millionen Dingern genommen

00:12:35.640 --> 00:12:37.380
oder so und das hat dann nur noch irgendwie

00:12:37.380 --> 00:12:39.620
860, knapp

00:12:39.620 --> 00:12:41.540
68 Megabyte Hauptspeicher gebraucht auf meinem System

00:12:41.540 --> 00:12:43.080
und ich dachte so, huch, wie ist das, was ist das denn?

00:12:43.440 --> 00:12:45.320
Ehrlich gesagt, ich weiß nicht genau, woran das liegt, das müsste ich

00:12:45.320 --> 00:12:47.640
vielleicht bis zum nächsten Mal recherchieren,

00:12:48.100 --> 00:12:49.500
woran das liegt, aber das ist ja

00:12:49.500 --> 00:12:51.580
super, also das ist viel weniger

00:12:51.580 --> 00:12:52.260
als das früher war.

00:12:53.960 --> 00:12:55.520
Wie vielleicht das früher so im Bereich

00:12:55.520 --> 00:12:57.500
dann viermal so viel oder deutlich mehr.

00:12:57.820 --> 00:12:59.620
Ja, da hätte ich ja eher erwartet, dass das dann so

00:12:59.620 --> 00:13:00.920
drei Gigabyte werden oder so.

00:13:03.000 --> 00:13:03.920
Weil, ja.

00:13:04.040 --> 00:13:05.220
Ein Python-Spartplatz.

00:13:05.680 --> 00:13:06.740
Irgendjemand hat das vernünftig implementiert.

00:13:06.740 --> 00:13:07.780
Irgendwas ist da optimiert worden.

00:13:08.780 --> 00:13:09.760
Vielleicht weiß das ja auch jemand.

00:13:09.920 --> 00:13:12.260
Ja, Generatoren, liebe Männer.

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

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

00:13:17.600 --> 00:13:19.140
Oh, ich habe gerade zufällig mein Handy gestaut.

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

00:13:22.360 --> 00:13:22.680
Oha.

00:13:22.980 --> 00:13:25.040
Ja, ja. Wir freuen uns alle für sie mit.

00:13:26.420 --> 00:13:28.120
Ja, genau.

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

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

00:13:34.360 --> 00:13:36.180
Dann habe ich irgendwie Podcasts gehört.

00:13:36.240 --> 00:13:37.780
Das war auch irgendwie wieder sehr nett.

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

00:13:38.980 --> 00:13:39.320
Ja, ja.

00:13:40.460 --> 00:13:45.580
Der Django Chat Podcast hatte wieder eine ganz nette Folge mit ...

00:13:45.580 --> 00:13:46.560
Bevor du davon erzählst,

00:13:46.620 --> 00:13:48.180
also ich höre ja auch ab und zu mal gerne Podcasts.

00:13:48.240 --> 00:13:49.600
Also ich höre auch was zum Bilden,

00:13:49.600 --> 00:13:51.460
aber manchmal auch einfach Eishockey-Short in den News.

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

00:13:54.100 --> 00:13:54.640
Ah, okay.

00:13:54.720 --> 00:13:56.100
falls man sich noch für Eishockey interessiert,

00:13:56.160 --> 00:13:56.960
weil es nicht so wahrscheinlich ist,

00:13:57.060 --> 00:13:58.280
aber vielleicht gibt es ja Menschen.

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

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

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

00:14:05.220 --> 00:14:06.660
Ja, Düsseldorf und Eishockey,

00:14:06.820 --> 00:14:08.280
ja, doch, hat ja auch irgendwie...

00:14:08.280 --> 00:14:09.980
Ja, ja, man hat sich über einen der Sponsoren aufgeregt,

00:14:10.060 --> 00:14:12.260
der war nicht so ganz...

00:14:12.260 --> 00:14:13.420
Der hat so ein paar komische Sachen gepostet.

00:14:14.040 --> 00:14:16.240
Das haben die investigativen Journalisten

00:14:16.240 --> 00:14:17.340
von John Nissen aufgedeckt.

00:14:18.600 --> 00:14:20.000
Mal gucken, ob wir nächstes Jahr noch in der Liga

00:14:20.000 --> 00:14:21.180
und in den Saisen kommen werden.

00:14:23.640 --> 00:14:51.080
Tja, genau, ja, nee, ich höre auch noch andere Podcasts, aber auch viel Zeugs und das, genau, da gab es eine Episode mit Andrew Godwin, der, das ist auch ein bekannter Django-Entwickler, hat viel erzählt, der von dem schreibt das ganze Migrations-Framework, was jetzt, was bei 1.7, glaube ich, in Django reingekommen ist. Früher hieß es South.

00:14:51.500 --> 00:14:53.580
Was musst du denn früher machen, bevor man Dango Migrations

00:14:53.580 --> 00:14:55.180
machen konnte? Naja, da gab es halt drei,

00:14:55.460 --> 00:14:57.320
ich glaube, es gab drei unterschiedliche Systeme. Es gab

00:14:57.320 --> 00:14:59.400
eins von Andrew Godwin, das ist halt das Haus.

00:14:59.680 --> 00:15:01.440
Es gab eins von Simon Willison

00:15:01.440 --> 00:15:02.780
und es gab noch eins von

00:15:02.780 --> 00:15:06.140
Rusty Chris McGee oder so.

00:15:06.140 --> 00:15:07.340
Das wird sich deutlich mehr Arbeit gewiesen

00:15:07.340 --> 00:15:09.300
früher. Ja, die meisten Leute haben dann schon

00:15:09.300 --> 00:15:10.700
das Haus verwendet irgendwie.

00:15:11.360 --> 00:15:11.720
Insofern,

00:15:12.900 --> 00:15:15.340
was ich nicht wusste, ist, dass es komplett reimplementiert worden ist,

00:15:15.340 --> 00:15:17.180
als es dann bei Django 1.7 reinkam.

00:15:17.180 --> 00:15:19.160
Also er hat das halt nicht einfach

00:15:19.160 --> 00:15:21.020
übernommen sozusagen, sondern er hat es nochmal komplett neu

00:15:21.020 --> 00:15:21.500
geschrieben.

00:15:22.840 --> 00:15:24.880
Ja, aber das ist doch nicht so alles lernt, wenn man irgendwie zwei Jahre weiter ist.

00:15:25.300 --> 00:15:26.060
Oh, nee, so macht man das.

00:15:27.480 --> 00:15:29.020
Was habe ich denn da

00:15:29.020 --> 00:15:30.100
geschrieben? So ein Unsinn.

00:15:30.660 --> 00:15:32.920
Naja, jedenfalls, der macht

00:15:32.920 --> 00:15:34.260
momentan beschäftigt sich ja ganz viel mit

00:15:34.260 --> 00:15:36.540
ja, damit

00:15:36.540 --> 00:15:38.840
Django so ein bisschen mehr auf

00:15:38.840 --> 00:15:40.240
diese Async

00:15:40.240 --> 00:15:42.880
Schiene zu kriegen, weil das ist ja so ein Ding,

00:15:43.040 --> 00:15:44.800
das ist halt Django überhaupt gar nicht, also die ganzen großen

00:15:44.800 --> 00:15:46.240
Frameworks sind das nicht, Flask ist das auch nicht.

00:15:47.340 --> 00:15:48.600
Bei Django ist es halt aber schwierig,

00:15:49.420 --> 00:15:50.900
das zu ändern, weil das einfach so viel

00:15:50.900 --> 00:15:51.680
Zwerg ist und

00:15:51.680 --> 00:15:54.760
weil halt die API, also die

00:15:54.760 --> 00:15:56.860
Whiskey-API

00:15:56.860 --> 00:15:57.820
gibt es halt nicht her.

00:15:58.740 --> 00:15:59.400
Es gibt Prost.

00:16:00.760 --> 00:16:01.920
Die wollte ich schon immer noch bringen.

00:16:04.120 --> 00:16:04.900
Er hatte da vorher

00:16:04.900 --> 00:16:06.120
ein Projekt Django Channels

00:16:06.120 --> 00:16:08.900
oder das gibt es natürlich immer noch, er ist dann halt

00:16:08.900 --> 00:16:10.460
irgendwann hat die Maintenance davon abgegeben, aber

00:16:10.460 --> 00:16:13.000
jetzt geht es darum

00:16:13.000 --> 00:16:14.880
halt sozusagen Django selber

00:16:14.880 --> 00:16:16.920
Async-fähig

00:16:16.920 --> 00:16:18.720
zu machen, was halt auch

00:16:18.720 --> 00:16:20.580
eines der Ziele ist für jetzt Django 3

00:16:20.580 --> 00:16:22.880
irgendwie und er hat da irgendwie

00:16:22.880 --> 00:16:25.060
ein Projekt, ein großes Projekt gestartet

00:16:25.060 --> 00:16:27.020
und ich bin mal gespannt. Das ermöglicht ja auf einmal ungeahnte

00:16:27.020 --> 00:16:29.340
weiten... Das wird tatsächlich

00:16:29.340 --> 00:16:30.980
sehr interessant. Also ich bin

00:16:30.980 --> 00:16:33.060
schon sehr gespannt. Also das wäre natürlich, also meine

00:16:33.060 --> 00:16:34.840
Idealvorstellung auch, dass man

00:16:34.840 --> 00:16:37.260
ja, naja gut,

00:16:37.280 --> 00:16:38.540
das wird halt auch lange dauern, aber

00:16:38.540 --> 00:16:40.820
dass halt alles asynchron ist von

00:16:40.820 --> 00:16:42.160
so einmal, dass man

00:16:42.160 --> 00:16:44.820
Websocket-Geschichten halt auch direkt machen kann,

00:16:45.000 --> 00:16:46.880
dass man Clients irgendwie, wenn sich

00:16:46.880 --> 00:16:49.220
irgendwas geändert hat, benachrichtigen

00:16:49.220 --> 00:16:50.820
kann und dass man halt auch

00:16:50.820 --> 00:16:53.200
irgendwie eine Menge Datenbankabfragen

00:16:53.200 --> 00:16:55.000
oder halt auch API-Anfragen an andere

00:16:55.000 --> 00:16:57.300
Geschichten, dass man halt sozusagen Endpunkte

00:16:57.300 --> 00:16:59.120
hat, die dann wiederum

00:16:59.120 --> 00:17:01.020
andere API-Endpunkte anfragen,

00:17:01.240 --> 00:17:02.160
irgendwo anders vielleicht

00:17:02.160 --> 00:17:04.760
und dass man das alles auch wieder asynchron

00:17:04.760 --> 00:17:06.760
zusammen aggregieren kann und dann nicht

00:17:06.760 --> 00:17:08.840
das synchron hintereinander machen muss, wie das

00:17:08.840 --> 00:17:10.960
momentan passiert. Und dann hat man halt irgendwie 200

00:17:10.960 --> 00:17:12.940
Abfragen, die man irgendwo hinmacht, dann macht man

00:17:12.940 --> 00:17:15.060
vielleicht 100 Statements und dann fragt man

00:17:15.060 --> 00:17:16.720
noch ein paar APIs und dann muss man halt

00:17:16.720 --> 00:17:18.900
manchmal vielleicht auch zwei oder drei Requests machen und

00:17:18.900 --> 00:17:20.760
dann verbreitet man

00:17:20.760 --> 00:17:22.660
unheimlich viel Zeit dabei zu warten und

00:17:22.660 --> 00:17:24.720
das ist natürlich blöd, weil die Latenz natürlich

00:17:24.720 --> 00:17:26.540
irgendwie entscheidend ist. Und

00:17:26.540 --> 00:17:28.780
wenn man das asynchron machen würde, dann müsste

00:17:28.780 --> 00:17:30.180
man halt sozusagen nur, dann würde

00:17:30.180 --> 00:17:32.800
der längst laufende Request

00:17:32.800 --> 00:17:34.620
halt dann noch die Latenz bestimmen, aber

00:17:34.620 --> 00:17:36.660
ja,

00:17:36.960 --> 00:17:38.840
wenn der halt auch relativ

00:17:38.840 --> 00:17:40.780
schnell wieder da ist, dann kann das relativ

00:17:40.780 --> 00:17:42.860
flott gehen. Das wäre sehr

00:17:42.860 --> 00:17:44.000
schön. Nicht schlecht. Ja.

00:17:45.300 --> 00:17:46.560
Jedenfalls, genau, der hat auch irgendwas,

00:17:46.900 --> 00:17:48.780
der hat tolle Sachen erzählt, der arbeitet irgendwie bei

00:17:48.780 --> 00:17:50.940
Eventbrite und also zum Beispiel eine Geschichte, wo ich

00:17:50.940 --> 00:17:53.000
dachte, hätte ich nie gedacht, dass Leute damit Probleme kriegen

00:17:53.000 --> 00:17:55.140
können, ist, dass sie

00:17:55.140 --> 00:17:57.000
teilweise sehr schnell darauf

00:17:57.000 --> 00:17:59.060
reagieren müssen, wenn sich irgendwie Traffic

00:17:59.060 --> 00:18:01.060
ändert

00:18:01.060 --> 00:18:03.000
bei ihnen. Manchmal kommen so, kriegen sie

00:18:03.000 --> 00:18:04.740
sehr kurz Bescheid gesagt und dann

00:18:04.740 --> 00:18:06.460
sehr viel Traffic.

00:18:07.220 --> 00:18:08.720
300.000 Leute wollen in den nächsten

00:18:08.720 --> 00:18:10.600
15 Sekunden unseren Service.

00:18:11.000 --> 00:18:13.000
Ja, und dann müssen sie halt entsprechend

00:18:13.000 --> 00:18:14.960
Maschinen hochfahren oder zumindest

00:18:14.960 --> 00:18:16.860
irgendwie neue Applikationsserver oder so

00:18:16.860 --> 00:18:17.560
für eine bestimmte Geschichte.

00:18:18.640 --> 00:18:20.800
Und sie haben das Problem, dass Django bei ihnen

00:18:20.800 --> 00:18:22.640
sehr langsam mittlerweile startet. Also das ist halt auch so

00:18:22.640 --> 00:18:24.180
ein Eventbrite, hat irgendwie so

00:18:24.180 --> 00:18:26.840
knapp über eine Million Zeilen

00:18:26.840 --> 00:18:27.740
Python-Code.

00:18:28.880 --> 00:18:30.500
In Django. Und ist ein Django-Projekt, ja.

00:18:31.380 --> 00:18:32.760
Und das

00:18:32.760 --> 00:18:34.680
startet relativ langsam. Eventbrite kennt

00:18:34.680 --> 00:18:35.720
ihr doch, oder? Ja, kennt ihr.

00:18:35.880 --> 00:18:38.740
Das ist, denke ich, auch eine bekannte Geschichte.

00:18:39.580 --> 00:18:40.560
Und das Ding

00:18:40.560 --> 00:18:42.560
braucht halt mindestens 30 Sekunden zum Starten,

00:18:42.980 --> 00:18:44.580
weil das einfach so lange dauert, bis die ganzen

00:18:44.580 --> 00:18:45.500
Imports aufgelöst sind.

00:18:46.680 --> 00:18:47.820
Oh Gott, oh Gott, oh Gott.

00:18:48.360 --> 00:18:50.300
Dann musst du 30 Sekunden vorher wissen, was passiert.

00:18:51.880 --> 00:18:53.580
Da kommt ein Sturm.

00:18:54.180 --> 00:18:56.080
Das Problem ist, du kannst es halt nicht optimieren.

00:18:57.540 --> 00:18:58.800
Wenn die Importe so lange dauern,

00:18:58.880 --> 00:19:00.440
dann dauert es halt so lange, da kannst du nicht viel machen.

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

00:19:02.880 --> 00:19:04.140
Man müsste welche rausschmeißen eigentlich.

00:19:04.940 --> 00:19:05.900
Ja, aber...

00:19:05.900 --> 00:19:06.840
Dann geht es funktioniert, geht es verloren.

00:19:08.020 --> 00:19:09.040
Das geht ja auch nicht.

00:19:09.040 --> 00:19:13.040
Ja, also hoffentlich...

00:19:13.040 --> 00:19:13.860
Ja, das muss man schon sagen.

00:19:16.440 --> 00:19:18.020
Ja, vielleicht dann doch irgendwie an der Zeit

00:19:18.020 --> 00:19:22.560
dann mal so den monolithischen Ansatz irgendwie.

00:19:23.900 --> 00:19:26.980
Es gibt ja mehrere Optionen, wie man sowas ausmisten kann.

00:19:27.220 --> 00:19:28.540
Irgendwo ab und zu mal ein paar Sachen abfackeln,

00:19:28.620 --> 00:19:29.420
gucken, was noch stehen bleibt.

00:19:30.060 --> 00:19:33.760
Oder mal wirklich mühevoll rangehen, alles neu umsortieren.

00:19:34.100 --> 00:19:34.640
Das ist halt die Frage.

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

00:19:37.380 --> 00:19:38.740
Du kannst nicht viel machen.

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

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

00:19:41.860 --> 00:19:44.220
Ja gut, okay, die ganzen Features streichen, aber das ist nicht...

00:19:44.220 --> 00:19:46.320
Ja, aber du könntest ja zum Beispiel, kannst du nicht sowas machen wie Features

00:19:46.320 --> 00:19:48.320
nur dann laden, wenn du sie wirklich brauchst?

00:19:48.320 --> 00:19:50.120
Und dann dafür irgendwelche extra Requests machen, weil

00:19:50.120 --> 00:19:51.740
die ganzen Basissachen, vielleicht brauchen die gar nicht.

00:19:51.740 --> 00:19:53.500
Ja, so bei Django ist es so, da

00:19:53.500 --> 00:19:56.200
werden deine Installed-Apps, die werden alle

00:19:56.200 --> 00:19:56.820
importiert.

00:19:58.520 --> 00:20:00.220
Du kannst das, soweit ich weiß,

00:20:00.300 --> 00:20:02.140
auch später nicht ändern. Du kannst nicht sagen,

00:20:02.220 --> 00:20:04.200
jetzt irgendwas in Installed-Apps hinzufügen,

00:20:04.280 --> 00:20:06.220
dynamisch. Also, wahrscheinlich geht es schon

00:20:06.220 --> 00:20:07.020
doch. Wenn man

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

00:20:10.460 --> 00:20:12.280
aber das ist so nicht, sondern das passiert

00:20:12.280 --> 00:20:13.380
beim Starten. Da wird

00:20:13.380 --> 00:20:16.060
gehen, genau, wenn die ganzen

00:20:16.060 --> 00:20:18.300
Installed-Apps gehen, dann geht man durch

00:20:18.300 --> 00:20:19.300
und importiert die ganzen Dinger.

00:20:20.320 --> 00:20:21.880
Ja, falls jetzt noch jemand zuhört, der

00:20:21.880 --> 00:20:24.240
naja, wer ist das? Achso, ja genau.

00:20:24.380 --> 00:20:26.220
Moment, wir sind noch nicht ganz durch mit

00:20:26.220 --> 00:20:26.520
den

00:20:26.520 --> 00:20:30.220
Geschichten. Was haben

00:20:30.220 --> 00:20:31.720
wir denn noch?

00:20:34.360 --> 00:20:36.100
Ne, oder sind wir doch durch? Hattest du noch irgendwas?

00:20:36.880 --> 00:20:38.100
Nö, gerade für jetzt. Alles klar,

00:20:38.200 --> 00:20:40.040
okay, dann sind wir doch mit dem News-Teil durch. Alles klar.

00:20:40.460 --> 00:20:41.700
Ja, ja, ja. Okay.

00:20:43.420 --> 00:20:44.180
Dann mache ich hier mal

00:20:44.180 --> 00:20:45.160
eine Kapitelmarke zu

00:20:45.160 --> 00:20:48.580
ja,

00:20:49.680 --> 00:20:50.920
zum eigentlichen

00:20:50.920 --> 00:20:51.100
Thema.

00:20:52.940 --> 00:20:54.300
Ja, wir wollten natürlich jetzt

00:20:54.300 --> 00:20:56.000
erklären, was naiv-based denn ist.

00:20:56.080 --> 00:20:58.000
Was macht das denn? Wofür braucht man das denn?

00:20:58.520 --> 00:21:00.220
Und erst mal ist das, glaube ich, so eine

00:21:00.220 --> 00:21:02.580
Beschreibung einfach nur für so ein statistisches...

00:21:02.580 --> 00:21:03.580
Ja, also die

00:21:03.580 --> 00:21:06.200
Bayes-Riegel kennt man ja vielleicht.

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

00:21:08.760 --> 00:21:09.700
Ja, warte, lass mich nochmal.

00:21:10.460 --> 00:21:26.580
Ja, das geht ja um bedingte Wahrscheinlichkeiten von Ereignissen berechnet, die in der Zukunft stattfinden oder anhand dessen von der Eintrittswahrscheinlichkeit, die in der Vergangenheit, die man schon kannte, von ähnlichen Dingen. Und ja, dann kann man die miteinander kombinieren.

00:21:26.960 --> 00:21:29.940
Also Base Theorem ist eigentlich einfach nur…

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

00:21:33.140 --> 00:21:33.700
Nein, dachte ich.

00:21:33.700 --> 00:21:35.120
Okay, mit.

00:21:35.120 --> 00:21:47.090
Naja, also ja, im Grunde ist das einfach nur eine Möglichkeit, wie man halt sozusagen die Wahrscheinlichkeiten umdrehen kann.

00:21:47.090 --> 00:21:54.790
Also man weiß halt die Wahrscheinlichkeit von B, wenn A, ja, und jetzt möchte man das irgendwie umdrehen.

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

00:21:56.910 --> 00:21:59.030
Ja, nur immer als Beispiel, was kann man sich dann...

00:21:59.030 --> 00:22:02.750
Also ihr habt jetzt ein Kartenspiel oder sowas, ja, die Wahrscheinlichkeit dafür, dass ihr einen König zieht.

00:22:02.890 --> 00:22:05.510
Wie viel ist das denn? 4,52 oder so, ne?

00:22:06.490 --> 00:22:07.710
Und dann willst du halt wissen,

00:22:07.810 --> 00:22:09.630
wie hoch die Wahrscheinlichkeit ist, dass du ein Bild siehst.

00:22:09.690 --> 00:22:10.570
Und dann hast du wie viel?

00:22:11.670 --> 00:22:12.710
Dreimal, 4,52.

00:22:13.590 --> 00:22:14.650
Und dann kannst du dir überlegen,

00:22:15.530 --> 00:22:17.650
ja, die Wahrscheinlichkeit, dass du ein König siehst

00:22:17.650 --> 00:22:18.290
und es ein Bild ist.

00:22:18.570 --> 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:23.810 --> 00:22:24.130
Ja.

00:22:24.390 --> 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:29.130
weil jeder König ein Bild ist.

00:22:29.590 --> 00:22:31.930
Und andersrum kannst du dann halt ausrechnen, was kommt denn da raus.

00:22:32.370 --> 00:22:34.170
Ja, also. Verknüpfst du halt die beiden

00:22:34.170 --> 00:22:35.990
Wahrscheinlichkeiten mit den Ereignissen und so kann man

00:22:35.990 --> 00:22:38.070
ein bisschen in die Zukunft schauen. Das ist ja das, was

00:22:38.070 --> 00:22:39.330
die Statistiker so gerne tun mit Technik.

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

00:22:41.990 --> 00:22:44.190
Genau. Ja, wir haben eine Eintrittswahrscheinlichkeit, die würden wir gerne

00:22:44.190 --> 00:22:45.770
bestimmen anhand von

00:22:45.770 --> 00:22:48.110
Features. Und das ist ja das, was uns dann

00:22:48.110 --> 00:22:49.990
hinterher dann in diesem Machine Learning Ding, glaube ich,

00:22:49.990 --> 00:22:52.210
am meisten interessiert. Wie man aus diesem einfachen

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

00:22:53.970 --> 00:22:56.250
Feature-Dingern. Ich glaube, wir haben gesagt,

00:22:56.290 --> 00:22:58.110
wir machen das anhand diesem Spam-Beispiel. Das heißt, es geht

00:22:58.110 --> 00:23:00.150
darum, glaube ich, welche Worte

00:23:00.150 --> 00:23:01.550
da

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

00:23:20.950 --> 00:23:28.450
Ja, das ist das Gute an anderen, deswegen ist das ja auch naiv, weil man tut so, als wäre die unabhängig voneinander, als wäre ein Wort entweder Spam oder nicht.

00:23:29.330 --> 00:23:30.970
Genau, und das ist es natürlich nicht so richtig.

00:23:31.270 --> 00:23:31.810
Das stimmt nicht.

00:23:32.070 --> 00:23:33.670
Man darf das nicht einfach so alles aufmultiplizieren.

00:23:34.390 --> 00:23:35.790
Man kann auch Idiot-Based sagen oder so.

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

00:23:42.790 --> 00:23:47.210
Genau, das ist ja auch irgendwie sozusagen der erste funktionierende Ansatz gewesen,

00:23:47.430 --> 00:23:49.130
um irgendwie mit diesem Spam-Ding fertig zu werden.

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

00:23:54.050 --> 00:23:56.230
Ich habe das jetzt ehrlich gesagt gar nicht so deswegen gewählt,

00:23:56.310 --> 00:23:58.590
weil das für Machine Learning so eine interessante Geschichte ist,

00:23:58.650 --> 00:24:00.470
weil eigentlich ist es das nicht, das verwendet man

00:24:00.470 --> 00:24:01.630
eher, ja.

00:24:02.630 --> 00:24:04.670
Also Bildklassifikation, so einfache Dinge,

00:24:04.850 --> 00:24:06.050
ja, nein, bist du drauf, nicht?

00:24:06.330 --> 00:24:08.890
Ist mein Gesicht drauf, nicht? Kann ich nicht mit Base machen?

00:24:09.290 --> 00:24:10.630
Nee, da wird es wahrscheinlich eher,

00:24:10.670 --> 00:24:11.430
das wird schon nicht mehr gehen.

00:24:14.530 --> 00:24:14.850
Aber

00:24:14.850 --> 00:24:16.430
es ist trotzdem interessant.

00:24:16.630 --> 00:24:18.370
Und zwar, also ich habe das vor allen Dingen

00:24:18.370 --> 00:24:20.370
deswegen mir jetzt nochmal angeguckt,

00:24:20.370 --> 00:24:22.130
beziehungsweise überlegt, dass das ein gutes Beispiel wäre,

00:24:22.210 --> 00:24:24.290
weil ich

00:24:24.290 --> 00:24:26.210
ein Beispiel haben wollte für etwas, was man

00:24:26.210 --> 00:24:28.250
in Pure Python sozusagen

00:24:28.250 --> 00:24:30.310
machen kann, wo man nur die

00:24:30.310 --> 00:24:31.990
simplen Datenstrukturen

00:24:31.990 --> 00:24:34.270
irgendwie nimmt, die man halt irgendwie so

00:24:34.270 --> 00:24:36.430
dabei hat, also Skalare, Listen

00:24:36.430 --> 00:24:38.490
ja oder beziehungsweise

00:24:38.490 --> 00:24:40.270
Strings als eine Form

00:24:40.270 --> 00:24:42.190
von irgendwie Variablen, die jetzt

00:24:42.190 --> 00:24:43.130
halt einen bestimmten Wert haben,

00:24:43.910 --> 00:24:44.970
Listen,

00:24:46.310 --> 00:24:48.390
Dictionaries und das war's

00:24:48.390 --> 00:24:50.010
eigentlich und mehr braucht man gar nicht.

00:24:51.330 --> 00:24:52.030
Und halt hat man

00:24:52.030 --> 00:24:54.230
noch Funktionen, die man irgendwie aufruft und

00:24:54.230 --> 00:24:55.350
das war's.

00:24:56.310 --> 00:24:58.230
Also ihr seht, wir sind bei einer

00:24:58.230 --> 00:25:00.390
totalen Einsteigerfolge angekommen. Ja, eigentlich

00:25:00.390 --> 00:25:02.390
schon. Also das

00:25:02.390 --> 00:25:04.410
ist halt das Interessante,

00:25:04.490 --> 00:25:06.090
dass man damit halt so wahnsinnig viel machen kann.

00:25:06.790 --> 00:25:08.350
Und das ist halt etwas, was ich gerne

00:25:08.350 --> 00:25:09.450
irgendwie vermitteln würde.

00:25:10.350 --> 00:25:12.030
Also wenn man das hinkriegt, wenn man das

00:25:12.030 --> 00:25:14.210
versteht, dann hat man schon

00:25:14.210 --> 00:25:14.690
ganz viel.

00:25:16.230 --> 00:25:18.170
Das heißt, anhand Python lernen, ein bisschen anhand

00:25:18.170 --> 00:25:19.830
von Jochens Beispiel, mit dem man auch

00:25:19.830 --> 00:25:21.870
Machine Learning machen kann. Und zwar

00:25:21.870 --> 00:25:24.250
ein Notebook hast du auch auf deinem GitHub?

00:25:24.450 --> 00:25:25.890
Genau, das kann ich dann auch in den

00:25:25.890 --> 00:25:27.790
Show Notes verlinken, wo da halt dieses Notebook drin ist.

00:25:28.230 --> 00:25:29.450
und sich das mal angucken kann.

00:25:30.690 --> 00:25:32.250
Ich benutze ja einfach irgendwie, es gibt so

00:25:32.250 --> 00:25:34.710
ein SMS-Spam-

00:25:34.710 --> 00:25:36.090
Dataset, wobei Kekkel,

00:25:37.050 --> 00:25:38.250
das habe ich mir runtergeladen,

00:25:38.390 --> 00:25:40.010
irgendwie auf meinen S3 gepackt und

00:25:40.010 --> 00:25:42.310
das Notebook zieht sich das davon einfach

00:25:42.310 --> 00:25:44.050
und lädt das runter und dann hat man das.

00:25:44.110 --> 00:25:46.110
Das ist nicht so viel, das sind irgendwie, warte,

00:25:46.170 --> 00:25:48.210
lass mich mal gerade gucken. Ich werde die Stadt, das ist dieses Ding hier auch

00:25:48.210 --> 00:25:49.070
einfach mal erstmal neu.

00:25:50.970 --> 00:25:51.330
Okay.

00:25:52.550 --> 00:25:54.150
Lade das mal runter, es sind irgendwie nur so 200

00:25:54.150 --> 00:25:55.770
Kilowatt. Okay.

00:25:56.930 --> 00:25:57.070
So.

00:25:57.950 --> 00:26:00.810
Dann pausen wir das mal so.

00:26:02.190 --> 00:26:04.250
Okay, wie viele Nachrichten haben wir denn da drin?

00:26:07.770 --> 00:26:08.830
5.500.

00:26:10.830 --> 00:26:15.050
Und davon sind, ich weiß jetzt gar nicht genau, wie viele.

00:26:17.330 --> 00:26:20.770
1.500 sind, ah nee, ich weiß nicht, ihr müsst nachgucken.

00:26:20.770 --> 00:26:24.950
Also es ist deutlich mehr Hemm als Spam, aber...

00:26:24.950 --> 00:26:25.430
Ein Schinken?

00:26:26.310 --> 00:26:26.950
Ja, genau.

00:26:27.950 --> 00:26:33.170
Aber es ist halt

00:26:33.170 --> 00:26:35.710
eigentlich nicht viele Datenpunkte

00:26:35.710 --> 00:26:37.130
oder Beobachtungen, wenn man

00:26:37.130 --> 00:26:38.730
heutige Maßstäbe anlegt, aber

00:26:38.730 --> 00:26:41.110
es ist auf jeden Fall ein Datastat, wenn man schon

00:26:41.110 --> 00:26:43.190
ein bisschen was machen kann und es tut halt

00:26:43.190 --> 00:26:44.350
auch nicht weh, wenn man es irgendwo hinrotaliert.

00:26:44.870 --> 00:26:46.890
Du könntest ja auch erstmal ein bisschen Handling dafür bekommen,

00:26:46.990 --> 00:26:49.170
wie funktioniert das denn mit der Klassifikation,

00:26:49.590 --> 00:26:51.050
wenn ich jetzt so zwei Dinge habe, die ich voneinander

00:26:51.050 --> 00:26:53.090
trennen möchte. Genau, dieses Ding,

00:26:53.250 --> 00:26:55.030
das Beispiel hier würde übrigens auch für

00:26:55.030 --> 00:26:56.910
sozusagen beliebig,

00:26:57.030 --> 00:26:59.530
ganz beliebig vielleicht nicht, aber mehr als

00:26:59.530 --> 00:27:01.430
zwei auf jeden Fall auch funktionieren. Also ganz

00:27:01.430 --> 00:27:03.330
genauso. Also aber es wäre Multiclass

00:27:03.330 --> 00:27:05.070
Klassifikation. Das heißt,

00:27:05.610 --> 00:27:07.410
es würde hinterher sozusagen die

00:27:07.410 --> 00:27:09.190
bestpassendste Klasse rausfallen. Man würde

00:27:09.190 --> 00:27:09.930
nicht mehrere

00:27:09.930 --> 00:27:13.290
Klassen, zu denen jetzt irgendwas gehört,

00:27:13.570 --> 00:27:15.390
bekommen. Also man könnte sich ja vorstellen, es gibt jetzt

00:27:15.390 --> 00:27:17.430
nicht nur Spam

00:27:17.430 --> 00:27:19.210
und Ham, sondern es gibt auch noch irgendwie Newsletter

00:27:19.210 --> 00:27:20.790
oder irgendwie

00:27:20.790 --> 00:27:23.310
Notifikationen von irgendwelchen Social

00:27:23.310 --> 00:27:25.470
Networks oder sowas. Oder Spam.

00:27:25.870 --> 00:27:29.650
Ja, aber vielleicht möchte man das ja aus welchen Gründen auch immer irgendwie feiner unterteilen

00:27:29.650 --> 00:27:33.090
und die Notifikationen sehen, die dich irgendwie dahin latschen sollen,

00:27:33.150 --> 00:27:36.050
doch mal wieder ein bisschen Zeit auf Facebook zu verbringen oder so.

00:27:38.890 --> 00:27:44.110
Und dann würde man jetzt mit dem Ansatz auch immer nur eine von den Klassen kriegen.

00:27:44.190 --> 00:27:47.970
Aber es könnte natürlich eben sein, dass es zum Beispiel eine Notifikation ist und Spam.

00:27:49.290 --> 00:27:53.710
Ja, weil das da rausfällt, weil Naivbase halt einfach sagt, nö, ich will jetzt nur eins haben.

00:27:54.070 --> 00:27:55.730
Also das wäre jetzt, also das, was

00:27:55.730 --> 00:27:58.070
in dem Roadbook drinsteht,

00:27:58.470 --> 00:28:00.210
da fällt halt hinterher eine Kategorie

00:28:00.210 --> 00:28:02.110
bei raus. Man könnte es auch so

00:28:02.110 --> 00:28:04.250
umbauen, dass es Multilabel kann,

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

00:28:06.190 --> 00:28:07.330
Wir machen ja das Anfängerbeispiel.

00:28:07.330 --> 00:28:08.730
Wir machen jetzt ein einfaches Beispiel.

00:28:08.730 --> 00:28:10.870
Also, genau.

00:28:11.970 --> 00:28:12.830
So, was wir

00:28:12.830 --> 00:28:14.530
jetzt da

00:28:14.530 --> 00:28:16.790
zuerst machen, ist das halt in Training und Test

00:28:16.790 --> 00:28:18.750
Dinger aufzuteilen. Da habe ich das einfach zufällig

00:28:18.750 --> 00:28:20.930
getrennt nach, also

00:28:20.930 --> 00:28:22.690
25% sind halt Test,

00:28:22.950 --> 00:28:25.050
der Rest ist Training, also 75%.

00:28:25.050 --> 00:28:26.110
75%.

00:28:26.110 --> 00:28:27.330
Und

00:28:27.330 --> 00:28:30.330
ja, das, was ich jetzt eigentlich

00:28:30.330 --> 00:28:30.910
sozusagen

00:28:30.910 --> 00:28:34.490
und das wäre natürlich schon

00:28:34.490 --> 00:28:36.650
schön, wenn man sich das irgendwie angucken würde oder so,

00:28:37.430 --> 00:28:38.410
aber was ich jetzt eigentlich

00:28:38.410 --> 00:28:40.770
zeigen

00:28:40.770 --> 00:28:42.550
wollen würde, ist, dass

00:28:42.550 --> 00:28:45.070
wie einfach das ist,

00:28:45.450 --> 00:28:46.730
sozusagen

00:28:46.730 --> 00:28:48.490
ein Modell zu trainieren, das jetzt

00:28:48.490 --> 00:28:50.490
zwischen Spam und Nicht-Spam unterscheiden kann.

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

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

00:28:53.970 --> 00:28:56.110
vorhersagt, dass es Wörter enthält,

00:28:56.210 --> 00:28:57.530
die Spam sind, unter der Bindung

00:28:57.530 --> 00:28:58.490
könnte Spam sein.

00:29:00.770 --> 00:29:01.950
Ich kann ja mal kurz versuchen

00:29:01.950 --> 00:29:04.030
mit Worten zu beschreiben, wie dieser Trainingsprozess

00:29:04.030 --> 00:29:04.830
aussieht.

00:29:05.910 --> 00:29:06.950
Und der ist halt, man

00:29:06.950 --> 00:29:09.870
geht jetzt über alle Dokumente,

00:29:09.950 --> 00:29:11.250
die entweder Spam oder Ham sind, drüber.

00:29:11.490 --> 00:29:12.650
Die in den Trainingsdaten steht ja dran.

00:29:12.650 --> 00:29:13.950
Und guckt, ob Penis drin steht.

00:29:15.010 --> 00:29:15.690
Ja genau, teilt

00:29:15.690 --> 00:29:18.210
das, teilt

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

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

00:29:22.510 --> 00:29:25.190
Und dann kommt man in alle, also man hat ja

00:29:25.190 --> 00:29:27.230
Trainingsdaten, wo halt drin steht, dass es Spam ist oder es nicht

00:29:27.230 --> 00:29:29.150
Spam ist. Und wenn man jetzt sagt, okay,

00:29:29.290 --> 00:29:31.270
in denen, wo Spam ist, kommt 50

00:29:31.270 --> 00:29:33.210
mal Penis vor und in denen, wo nicht Spam ist,

00:29:33.290 --> 00:29:35.370
kommt nur einmal Penis vor, dann hat man so eine bedingte

00:29:35.370 --> 00:29:37.190
Wahrscheinlichkeit. Aber die Wahrscheinlichkeit,

00:29:37.270 --> 00:29:39.310
dass Penis vorkommt und es kein Spam ist und die Wahrscheinlichkeit,

00:29:39.390 --> 00:29:41.090
dass Penis drin vorkommt, ist Spam ist. Und

00:29:41.090 --> 00:29:43.310
daraus hat man jetzt auch nach Base so eine

00:29:43.310 --> 00:29:45.030
kombinatorische Möglichkeit, sich das

00:29:45.030 --> 00:29:47.070
rauszurechnen. Genau,

00:29:47.170 --> 00:29:48.850
man hat jetzt für jedes einzelne Wort eine

00:29:48.850 --> 00:29:51.010
Wahrscheinlichkeit dafür, dass

00:29:51.010 --> 00:29:53.750
dieses Wort irgendwie in dieser

00:29:53.750 --> 00:29:55.730
Kategorie vorkommt. Das ist einfach

00:29:55.730 --> 00:29:57.230
die Frequenz von dem Wort in der Kategorie.

00:29:57.910 --> 00:29:58.510
Also wenn halt

00:29:58.510 --> 00:30:03.730
man muss das natürlich

00:30:03.730 --> 00:30:05.730
immer noch eben teilen durch die Anzahl der Worte, die überhaupt

00:30:05.730 --> 00:30:07.450
irgendwie in der Kategorie vorgekommen sind.

00:30:07.550 --> 00:30:08.790
Deswegen muss man sich das halt auch noch merken.

00:30:09.150 --> 00:30:11.610
Man geht halt über alle Dokumente, merkt sich

00:30:11.610 --> 00:30:13.830
okay, wie viel

00:30:13.830 --> 00:30:15.710
Wörter habe ich

00:30:15.710 --> 00:30:17.990
denn jetzt bisher gesehen für die

00:30:17.990 --> 00:30:19.550
Klasse

00:30:19.550 --> 00:30:21.770
Spam oder Ham und zählt

00:30:21.770 --> 00:30:23.690
das dann halt hoch, je nachdem, ob das...

00:30:23.690 --> 00:30:24.890
Haben wir heute schon mal Penis gesagt?

00:30:25.130 --> 00:30:26.910
Entschuldige, ich bin mal albern.

00:30:27.310 --> 00:30:28.930
Oh, wir fliegen bei iTunes raus, Mann.

00:30:31.610 --> 00:30:33.190
Oh, wir sind auf iTunes? Na gut.

00:30:34.050 --> 00:30:35.570
Keine Ahnung. Ne, ich glaube nicht, aber...

00:30:35.570 --> 00:30:36.190
Ne, wie Viagra.

00:30:38.130 --> 00:30:39.630
Das könnte eine sehr gefährliche Folge

00:30:39.630 --> 00:30:41.710
werden. Wir lesen keine Spam-Geschichten

00:30:41.710 --> 00:30:42.510
vor. Na gut.

00:30:43.510 --> 00:30:44.950
Auch wenn wir damit reich werden können.

00:30:45.910 --> 00:30:47.210
Reich werden? Ich will einen Spam.

00:30:47.210 --> 00:30:49.150
Nee, das ist ein altes SMS-Spam.

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

00:30:52.510 --> 00:30:55.510
Ja, also, das, was man da eigentlich macht,

00:30:55.590 --> 00:30:57.290
ist, man geht halt über alle Wörter drüber

00:30:57.290 --> 00:31:00.390
und merkt sich halt sozusagen für das entsprechende Label,

00:31:00.430 --> 00:31:01.930
was man gerade gesehen hat, irgendwie,

00:31:02.810 --> 00:31:05.650
ja, man zählt da halt hoch,

00:31:05.770 --> 00:31:07.490
wie viele Wörter hat man in dieser Kategorie überhaupt gesehen.

00:31:08.310 --> 00:31:12.270
Und man zählt jetzt sozusagen noch hoch quasi,

00:31:13.010 --> 00:31:15.470
welche Worte man wie oft gesehen hat in welcher Kategorie.

00:31:15.470 --> 00:31:17.030
Und dann kann man hinterher sagen, okay,

00:31:17.210 --> 00:31:39.590
Wenn ich jetzt eben in der Kategorie Spam 10 Mal Penis gesehen habe und ich habe insgesamt 1000 Wörter gesehen, unterschiedliche Wörter, dann ist die Wahrscheinlichkeit, dass es Spam ist, wenn ich jetzt das Wort Penis sehe, ist es halt, was ist das dann, ein Prozent oder sowas.

00:31:40.770 --> 00:31:42.090
Ich habe jetzt nicht genau mitgerechnet.

00:31:43.150 --> 00:32:07.330
Ja, es ist immer blöd, so was, also, genau. Und das macht man jetzt, also, nochmal, ich gehe einfach jetzt, verdammt, das ist gar nicht so einfach. Also die Trainingsfunktion ist einfach nur, ja, man geht über alle Dokumente drüber, zählt für das Label halt hoch, wie viele Dokumente man, ach Quatsch, jetzt habe ich das auch noch falsch erklärt.

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

00:32:10.490 --> 00:32:10.630
Ja.

00:32:13.470 --> 00:32:15.790
Was man eigentlich...

00:32:15.790 --> 00:32:17.070
Du wusstest, dass du jetzt Pfarrer warst?

00:32:17.670 --> 00:32:19.390
Ja, ja, natürlich. Landpfarrer.

00:32:20.750 --> 00:32:21.990
Dazu kann ich was erzählen.

00:32:23.450 --> 00:32:24.110
Mit der Fibreza

00:32:24.110 --> 00:32:25.810
war ich ja offenbar keine Ahnung von, aber

00:32:25.810 --> 00:32:27.670
nee, das ist eine ganz, ganz

00:32:27.670 --> 00:32:29.810
eine ultra interessante Geschichte.

00:32:31.530 --> 00:32:31.970
Das

00:32:31.970 --> 00:32:33.630
in, also

00:32:33.630 --> 00:32:33.890
in

00:32:33.890 --> 00:32:37.730
England gab es

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

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

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

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

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

00:32:48.730 --> 00:32:49.830
Priorei, wenn es darum geht.

00:32:50.150 --> 00:32:50.530
Wie hieß

00:32:50.530 --> 00:32:53.810
dieses Buch nochmal?

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

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

00:32:57.490 --> 00:32:59.470
Das spielt ja so ein bisschen

00:32:59.470 --> 00:33:01.150
Leute Adelig und so.

00:33:01.810 --> 00:33:03.630
Ja, eigentlich ein gutes Buch, kann ich empfehlen.

00:33:05.290 --> 00:33:05.610
Und

00:33:05.610 --> 00:33:07.450
dann kommt da plötzlich dieser Pfarrer,

00:33:07.730 --> 00:33:09.570
Wie kann das sein? Das gehört doch eigentlich gar nicht dazu.

00:33:09.670 --> 00:33:12.550
Doch, doch, doch, die spielten da mit.

00:33:12.710 --> 00:33:16.290
Das war eine Klasse von Leuten, die relativ viel verdient haben

00:33:16.290 --> 00:33:18.370
für die damaligen Verhältnisse.

00:33:19.710 --> 00:33:21.790
Und sie mussten praktisch nichts tun dafür.

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

00:33:23.870 --> 00:33:25.370
Ab und zu mal vor der Kanzel herunterfliegen.

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

00:33:27.050 --> 00:33:30.310
Und das gab denen Zeit, sich mit allen möglichen abseitigen,

00:33:31.050 --> 00:33:35.290
in alle möglichen Richtungen ihren Interessen nachzugehen.

00:33:35.350 --> 00:33:36.730
Das war schon ein bisschen Nachbrudertakt, oder?

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

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

00:33:41.270 --> 00:33:43.170
Nee, das ist deutlich später.

00:33:43.590 --> 00:33:47.830
Aber es gibt Leute, die tatsächlich ernsthaft behaupten,

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

00:33:49.350 --> 00:33:51.990
warum die Industrialisierung irgendwie so abgehoben hat

00:33:51.990 --> 00:33:55.470
und warum so viele coole neue Sachen da rausgekommen sind.

00:33:55.550 --> 00:33:57.530
Weil es gab halt eine Menge Leute, die hatten viel Zeit, viel Geld

00:33:57.530 --> 00:33:58.950
und echt nichts zu tun.

00:33:59.610 --> 00:34:02.210
Und dann haben die halt irgendwie sich einfach da so für interessiert,

00:34:02.330 --> 00:34:04.630
wie baut man eine Dampfmaschine?

00:34:04.810 --> 00:34:05.910
Ich meine, Darwin war auch so jemand.

00:34:06.110 --> 00:34:08.210
Also, ähm, ja.

00:34:09.110 --> 00:34:10.250
Bayes war so jemand,

00:34:10.890 --> 00:34:12.230
mir fällt das jetzt nicht ein, aber es gab

00:34:12.230 --> 00:34:14.110
eine ganze Menge, eine ganze Menge der Leute, die jetzt so

00:34:14.110 --> 00:34:16.030
total bekannt sind, wo man sich ja denkt, so, wow, die haben

00:34:16.030 --> 00:34:18.510
großartige Sachen gemacht, waren Landfahrer

00:34:18.510 --> 00:34:20.450
in England. Ja, war gut.

00:34:21.330 --> 00:34:21.970
Ähm. Ja,

00:34:22.070 --> 00:34:23.930
rückwärts Induktion. Ja,

00:34:24.470 --> 00:34:25.690
äh, genau.

00:34:26.510 --> 00:34:28.530
Also, was ich jetzt gerade blödsinnigerweise

00:34:28.530 --> 00:34:30.070
falsch erzählt habe, ist, dass man sich nicht

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

00:34:32.190 --> 00:34:34.290
sondern merkt sich halt, wie viele Dokumente

00:34:34.290 --> 00:34:35.930
kommen jetzt pro Kategorie eigentlich vor.

00:34:36.110 --> 00:34:51.770
Und genau, also was man sich eigentlich merkt, ist, wie viele Dokumente hat man jetzt pro Kategorie gesehen und dann halt noch für jedes Wort da drin sozusagen, wie oft kam denn dieses Wort in der Kategorie vor.

00:34:52.370 --> 00:35:01.810
Und dann hat man die Wahrscheinlichkeit, dass ein Wort vorgekommen ist, wie zum Beispiel ein Piep unter der Bedingung, dass es Spam ist oder das Wort Piep unter der Bedingung, dass es kein Spam ist.

00:35:02.050 --> 00:35:10.110
Und das hat man zwei bedingte Wahrscheinlichkeiten und daraus kann man jetzt mit der allgemeinen Wahrscheinlichkeit für das Vorkommen dieses Wortes rausrechnen, wie hoch die Wahrscheinlichkeit denn sein könnte.

00:35:10.370 --> 00:35:15.450
Genau, aber das klingt halt alles irgendwie so relativ kompliziert, wenn man es so erklärt, in Code ist das sehr wenig Zeilen.

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

00:35:17.050 --> 00:35:37.090
Also diese Train-Funktion, die hat halt, lass mich nicht lügen, eins, zwei, drei, vier, fünf, sechs, sieben Zeilen. Das ist alles. Und die sind alle relativ kurz. Also keine von diesen Zeilen hat mehr als 30 Characters oder sowas. Also es ist wirklich sehr, sehr einfach.

00:35:38.690 --> 00:35:48.510
Und ja, man kommt mit den ganz simplen Datenstrukturen, ich habe jetzt an der Stelle DefaultsDict genommen, weil das zum Zählen halt schöner ist, als wenn man das normale Dict nimmt, da muss man so oft get schreiben.

00:35:48.950 --> 00:35:52.550
Aber was ist DefaultsDict? Ach, das ist eine Bibliothek aus der Standardbibliothek?

00:35:52.550 --> 00:35:54.430
Nee, ja, es ist in der Standardbibliothek.

00:35:55.130 --> 00:35:57.390
Genau, und zwar aus dem Collections-Modul.

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

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

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

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

00:36:07.510 --> 00:36:08.890
dann gibt man einen Key an,

00:36:08.890 --> 00:36:12.310
dann halt der, ja, dann den Wert

00:36:12.310 --> 00:36:13.870
oder halt eine Datenstruktur.

00:36:14.230 --> 00:36:16.370
Also ganz oft, was man halt macht

00:36:16.370 --> 00:36:17.270
oder früher gemacht hat,

00:36:17.370 --> 00:36:18.510
heute nimmt man wahrscheinlich Default-Dict,

00:36:19.010 --> 00:36:20.510
ist halt irgendwie, du hast halt,

00:36:22.170 --> 00:36:24.290
irgendeinen Dikt, 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.610
und dann sagst du irgendwie

00:36:27.610 --> 00:36:30.110
dieses Dikt.ZDFault, irgendwie

00:36:30.110 --> 00:36:30.730
dein Key,

00:36:31.050 --> 00:36:33.950
Eckeklammer auf, Eckeklammer zu,

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

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

00:36:40.450 --> 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:46.150
ZDFault machen, aber dann ist die Zeile relativ

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

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

00:36:50.750 --> 00:36:52.150
Da halt ein Default-Dikt macht,

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

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

00:36:56.310 --> 00:36:58.250
okay, wenn ich jetzt ein Default-Dict habe

00:36:58.250 --> 00:37:00.190
von List, dann macht es genau

00:37:00.190 --> 00:37:02.050
das. Und da muss man nicht SetDefault die ganze Zeit sagen,

00:37:02.170 --> 00:37:04.030
sondern normalerweise würde ja,

00:37:04.150 --> 00:37:05.970
wenn ich ein Dict nehme und da

00:37:05.970 --> 00:37:07.990
einfach irgendwie ein Key reinsetze und dann

00:37:07.990 --> 00:37:10.130
dem irgendwie, dann sage Append irgendwas

00:37:10.130 --> 00:37:12.030
oder so, oder dem Wertzuweiser, dann

00:37:12.030 --> 00:37:13.690
kracht es halt, weil das sagt dann halt KeyError.

00:37:13.790 --> 00:37:14.830
Die Key gibt es da gar nicht.

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

00:37:20.590 --> 00:37:22.190
Weil er dann immer die leere Liste drin hat.

00:37:22.390 --> 00:37:24.670
Wenn es das noch nicht gibt, dann erzeugt er halt

00:37:24.670 --> 00:37:26.710
in dem Moment halt entsprechend eben eine Liste

00:37:26.710 --> 00:37:28.370
oder halt ein Integer, wenn man sagt

00:37:28.370 --> 00:37:30.190
DefaultDict von Int, dann wird halt,

00:37:30.610 --> 00:37:31.910
kann man halt sagen, irgendwie

00:37:31.910 --> 00:37:34.750
Dict, Ecke-Klammer auf,

00:37:34.890 --> 00:37:36.550
Key, Ecke-Klammer zu, plus gleich

00:37:36.550 --> 00:37:38.830
irgendwas, plus gleich 1

00:37:38.830 --> 00:37:40.190
zum Beispiel und zählt damit halt hoch,

00:37:40.610 --> 00:37:42.550
ohne dass es einen Key-Error gibt, auch wenn es den Key

00:37:42.550 --> 00:37:43.630
darin noch nicht gab, weil

00:37:43.630 --> 00:37:46.510
wenn es den Key nicht gibt, dann wird das halt

00:37:46.510 --> 00:37:48.170
erzeugt. Und zwar,

00:37:48.450 --> 00:37:50.530
ja. Schön, DefaultKey ist

00:37:50.530 --> 00:37:52.390
direkt mit den Keys mit. Hatte der schon mal, dass er irgendwie

00:37:52.390 --> 00:37:54.370
auf einen Key zugreifen wollte, in dessen

00:37:54.370 --> 00:37:56.290
ein Error gab und ein Programm durchgeflogen ist

00:37:56.290 --> 00:37:58.550
mit Z-Default, wäre das nicht passiert.

00:37:59.130 --> 00:38:00.350
Genau, also Z-Default

00:38:00.350 --> 00:38:02.410
hat man dann früher gemacht und heute, denke ich,

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

00:38:04.010 --> 00:38:06.290
es wäre interessant, Default-Dict. Und man kann das

00:38:06.290 --> 00:38:08.230
dann auch noch ineinander schachteln, also für die Counts der

00:38:08.230 --> 00:38:10.270
Wörter in den einzelnen Kategorien habe ich jetzt ein...

00:38:10.270 --> 00:38:12.390
Ah, das ist ja so unheimlich kompliziert, wenn man

00:38:12.390 --> 00:38:14.290
in Statistik irgendwie die ganzen bedingten Wahrscheinlichkeiten

00:38:14.290 --> 00:38:16.090
immer gegen sich umdreht. Aber hey, wir können Dicts

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

00:38:18.430 --> 00:38:19.710
JSON hört sich das an, wie JSON.

00:38:20.530 --> 00:38:22.930
Ja, Dicts und Jason haben ja auch viel miteinander zu tun.

00:38:23.050 --> 00:38:24.110
Also das ist ja so was ganz Ähnliches.

00:38:25.010 --> 00:38:26.270
Könntest Dicts als Jason

00:38:26.270 --> 00:38:27.910
rausrealisieren. Also na gut,

00:38:28.190 --> 00:38:29.990
du hast halt Objekte drin, die sich nicht

00:38:29.990 --> 00:38:32.570
in Jason rausrealisieren lassen, was natürlich auch sein kann.

00:38:33.710 --> 00:38:34.770
Ja, und was ich total

00:38:34.770 --> 00:38:36.590
nicht so finde, ist, dass ich glaube, bei Jason, wenn ich das

00:38:36.590 --> 00:38:39.050
richtig im Kopf habe, dass immer bei den letzten Elementen

00:38:39.050 --> 00:38:40.390
das Komma nicht dastehen darf.

00:38:40.790 --> 00:38:42.750
Ach ja, Jason hat so

00:38:42.750 --> 00:38:44.590
ein paar so hässliche Seiten. Ja, das ist so ein bisschen

00:38:44.590 --> 00:38:46.750
äh, genau, Jason

00:38:46.750 --> 00:38:48.190
zu parsen ist so ein bisschen ätzend.

00:38:49.530 --> 00:38:49.970
Ähm,

00:38:50.530 --> 00:39:06.630
Aber genau, also das ist wirklich wenig Zeilen und trotzdem hat man damit ein Modell gebaut, das dann ganz ordentlich funktioniert. Die Klassifikation ist jetzt ein bisschen schwieriger.

00:39:08.210 --> 00:39:10.450
Ja, wir möchten gerne jetzt klassifizieren.

00:39:10.830 --> 00:39:11.970
Das beschreibe ich jetzt nicht.

00:39:12.030 --> 00:39:13.890
Das hat schon beim Trainieren, das ist total einfach,

00:39:14.010 --> 00:39:15.750
hat das nicht gut funktioniert und jetzt beim Klassifizieren.

00:39:16.090 --> 00:39:17.590
Also kann man sich angucken, wenn einem das interessiert.

00:39:17.930 --> 00:39:20.950
Im Grunde, was passiert ist eigentlich nur,

00:39:21.050 --> 00:39:22.170
dass man halt bei einer neuen Nachricht,

00:39:22.210 --> 00:39:24.090
bei der man nicht weiß, ist das jetzt bei mir oder nicht,

00:39:24.690 --> 00:39:25.670
zerlegt man auch wieder in Worte

00:39:25.670 --> 00:39:29.430
und multipliziert dann halt für jede Kategorie

00:39:29.430 --> 00:39:32.730
halt sozusagen die Kategoriefrequenz dieses Wortes auf.

00:39:32.930 --> 00:39:35.310
Ja, also um das erstmal nochmal zu simplifizieren zu sagen,

00:39:35.310 --> 00:39:36.890
ohne dass das technisch vielleicht ganz korrekt ist,

00:39:36.950 --> 00:39:38.350
Man nimmt einfach die Wahrscheinlichkeit

00:39:38.350 --> 00:39:40.830
jedes einzelnen Wortes, ob es Spam ist

00:39:40.830 --> 00:39:42.730
oder nicht Spam ist, also bei Viagra oder

00:39:42.730 --> 00:39:44.630
ein Piep, ist es vielleicht relativ hoch,

00:39:44.710 --> 00:39:46.790
dass dann die Mail Spam ist und multipliziert die miteinander

00:39:46.790 --> 00:39:48.650
und bekommt dann einen Gesamtwert raus,

00:39:48.950 --> 00:39:50.770
ob es jetzt nur Spam sein könnte

00:39:50.770 --> 00:39:52.270
oder nicht. Genau.

00:39:53.610 --> 00:39:54.750
Diese Zahlen sind

00:39:54.750 --> 00:39:56.550
dann halt sehr niedrig oft, weil

00:39:56.550 --> 00:39:58.610
entsprechend halt, ja, Worte auch nicht

00:39:58.610 --> 00:40:00.730
so, meistens gibt es...

00:40:00.730 --> 00:40:02.610
Hier muss man natürlich noch mit der Anzahl normalisieren oder sowas.

00:40:02.870 --> 00:40:04.690
Genau, also normalerweise

00:40:04.690 --> 00:40:06.770
man muss auch ein bisschen aufpassen, man muss ein bisschen tricksen,

00:40:06.950 --> 00:40:08.690
damit man da nicht irgendwie so in,

00:40:09.750 --> 00:40:11.050
es wird halt null irgendwie dadurch,

00:40:11.130 --> 00:40:14.050
dass man zu oft kleine Zahlen miteinander multipliziert hat.

00:40:14.350 --> 00:40:16.190
Ja, ich glaube, auch wenn du größere Zahlen miteinander multiplizierst,

00:40:16.410 --> 00:40:17.770
die unter 1 sind, wird es irgendwann null.

00:40:17.970 --> 00:40:18.950
Naja, eben, genau.

00:40:19.330 --> 00:40:21.470
Und das ist halt, also muss man halt gucken,

00:40:21.530 --> 00:40:22.250
wenn die Texte lang werden,

00:40:22.330 --> 00:40:23.770
jetzt bei SMS auch praktisch sind sie nicht so lang,

00:40:24.170 --> 00:40:26.050
aber da muss man halt Maßnahmen ergreifen.

00:40:26.210 --> 00:40:27.350
Ich weiß nicht, ob ich das hier getan habe,

00:40:28.030 --> 00:40:28.850
dass das nicht null wird.

00:40:29.710 --> 00:40:31.130
Es ist aber auch im Grunde egal.

00:40:31.130 --> 00:40:31.950
Es geht ja nicht darum,

00:40:32.530 --> 00:40:34.230
sozusagen eine exakte Wahrscheinlichkeit auszurechnen,

00:40:34.270 --> 00:40:36.710
sondern das irgendwie klassifizieren zu können.

00:40:36.750 --> 00:40:38.010
Du könntest einfach den Logarithmus davon nehmen.

00:40:38.390 --> 00:40:39.910
Ja, genau, das könnte man zum Beispiel machen.

00:40:41.490 --> 00:40:41.850
Und

00:40:41.850 --> 00:40:44.790
was ich jetzt da gemacht habe, ist es einfach

00:40:44.790 --> 00:40:46.670
so zu normalisieren,

00:40:46.810 --> 00:40:48.670
dass halt hinterher die Summe der beiden

00:40:48.670 --> 00:40:51.130
Zahlen, die dabei rauskommen,

00:40:51.210 --> 00:40:52.890
halt wieder 1 ist, sodass man das halt

00:40:52.890 --> 00:40:54.350
als Wahrscheinlichkeit interpretieren kann.

00:40:55.930 --> 00:40:56.910
Ja, und

00:40:56.910 --> 00:40:59.030
dann wisst ihr halt,

00:40:59.250 --> 00:41:00.890
ne, das ist tatsächlich so der Quotient

00:41:00.890 --> 00:41:02.310
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.570
logischerweise eure Wahrscheinlichkeit. Genau.

00:41:06.750 --> 00:41:08.590
Und das funktioniert dann halt jetzt,

00:41:08.750 --> 00:41:10.310
also bei dem Dataset war das so...

00:41:10.310 --> 00:41:11.390
Und das ist das Coole an der E-Base,

00:41:11.470 --> 00:41:12.670
dass es funktioniert mit relativ wenig Daten,

00:41:12.750 --> 00:41:13.470
wie ihr gerade gehört habt.

00:41:13.790 --> 00:41:13.910
Genau.

00:41:14.390 --> 00:41:15.050
Schnell sogar.

00:41:15.150 --> 00:41:16.270
Es ist sauschnell.

00:41:16.270 --> 00:41:18.350
Also das ist wahrscheinlich schneller

00:41:18.350 --> 00:41:19.270
als so ziemlich alles andere.

00:41:19.870 --> 00:41:21.930
Auch deswegen, weil das halt kaum was macht.

00:41:22.190 --> 00:41:23.270
Das ist halt irgendwie...

00:41:25.250 --> 00:41:27.250
Oder ich bin mir ziemlich sicher,

00:41:27.350 --> 00:41:28.150
dass es wahrscheinlich schneller ist

00:41:28.150 --> 00:41:30.630
als die meisten anderen Machine Learning Verfahren.

00:41:32.190 --> 00:41:33.090
Es ist sauschnell.

00:41:33.230 --> 00:41:34.270
Man braucht keine Spezialbibliotheken

00:41:35.010 --> 00:41:36.130
wie NumPy oder sowas.

00:41:36.750 --> 00:41:38.050
Aber ist das schon richtiges Maschinenlösung?

00:41:38.150 --> 00:41:40.130
Weil im Prinzip berechnest du ja nur die einzelnen Wahrscheinlichkeiten

00:41:40.130 --> 00:41:41.010
für die einzelnen Kategorien.

00:41:41.250 --> 00:41:42.350
Ja, aber es ist, ja.

00:41:42.870 --> 00:41:45.290
Na gut, jetzt wissen wir, warum Statistiker sagen Haha.

00:41:46.010 --> 00:41:46.630
Ja, ja, natürlich.

00:41:46.930 --> 00:41:49.110
Also sie haben ja auch so ein bisschen recht, das ist schon so.

00:41:49.730 --> 00:41:53.610
Aber trotzdem, ich meine, du kannst damit halt Sachen machen,

00:41:54.470 --> 00:41:57.650
wo Statistik halt Schwierigkeiten mit hätte.

00:41:58.530 --> 00:42:01.530
Also wenn man das jetzt auf Papier machen wollen würde.

00:42:01.530 --> 00:42:03.370
Also der Unterschied zwischen Statistik und Maschinenlösung ist,

00:42:03.410 --> 00:42:04.310
man schreibt es in einen Computer.

00:42:04.590 --> 00:42:07.170
Ja, ich würde tatsächlich sagen, das ist einer der Hauptunterschiede,

00:42:07.230 --> 00:42:08.630
dass du es halt mit Computern machst und

00:42:08.630 --> 00:42:10.790
auch damit rumspielen kannst und

00:42:10.790 --> 00:42:12.870
während du auf, weil, ja,

00:42:13.350 --> 00:42:15.110
klassischer Statistik irgendwie

00:42:15.110 --> 00:42:16.710
die Formeln

00:42:16.710 --> 00:42:18.690
aufschreiben musst. Genau, dann machst du es

00:42:18.690 --> 00:42:20.670
auf Papier alles und guckst halt, was da auch

00:42:20.670 --> 00:42:22.150
oft dann genauer geht, ja, du

00:42:22.150 --> 00:42:24.130
kannst dann halt dein Modell viel besser

00:42:24.130 --> 00:42:26.650
irgendwie bauen

00:42:26.650 --> 00:42:28.550
und so, aber, und du hast halt nur

00:42:28.550 --> 00:42:30.470
wenige Beispiele oft,

00:42:31.110 --> 00:42:32.590
während bei Machine Learning

00:42:32.590 --> 00:42:34.610
ist es so oft, ob das jetzt alles so genau passt

00:42:34.610 --> 00:42:36.430
oder so, das interessiert dich gar nicht, sondern es muss halt

00:42:36.430 --> 00:42:38.570
hinterher ein gutes Ergebnis dabei rauskommen, das kannst du evaluieren.

00:42:40.030 --> 00:42:41.010
Und warum das jetzt nicht funktioniert.

00:42:41.030 --> 00:42:42.210
Man kann auch mal statistische Fehlerchen machen.

00:42:42.670 --> 00:42:44.850
Ja, das kann man natürlich auch. Rausargumentiert.

00:42:45.390 --> 00:42:46.330
Es geht ja nur darum, ob

00:42:46.330 --> 00:42:47.990
morgen die Wetter, die Sonne scheint oder

00:42:47.990 --> 00:42:50.410
nicht. Ja, ja.

00:42:50.850 --> 00:42:52.430
Sagen wir mal so, die Kritik ist teilweise schon

00:42:52.430 --> 00:42:53.290
prächtig, aber

00:42:53.290 --> 00:42:56.150
Man muss halt immer mit seinen Daten auch ein bisschen aufpassen.

00:42:56.250 --> 00:42:58.590
Und das Problem bei solchen Dingen ist halt, ihr habt halt

00:42:58.590 --> 00:43:00.650
meistens Abhängigkeit zwischen einzelnen

00:43:00.650 --> 00:43:01.610
Merkmalen irgendwie dann doch.

00:43:02.430 --> 00:43:04.470
ja, also nur eine Mail in den Müll zu

00:43:04.470 --> 00:43:06.390
schmeißen, weil jetzt Piep drin vorkommt, ist

00:43:06.390 --> 00:43:08.490
vielleicht blöd. Vielleicht habt ihr auch eine nette Mail geschrieben

00:43:08.490 --> 00:43:10.230
von eurer, äh,

00:43:10.230 --> 00:43:11.910
zukünftigen, eurem zukünftigen

00:43:11.910 --> 00:43:14.190
Geliebten, der wollte euch irgendwas Nettes schreiben und

00:43:14.190 --> 00:43:15.950
dann ist er im Spam-Ordner gelandet oder sowas.

00:43:16.130 --> 00:43:18.390
Ja, genau.

00:43:18.610 --> 00:43:20.210
Also, wenn man das jetzt evaluiert, also was

00:43:20.210 --> 00:43:21.830
dabei rauskommt, ist schon ganz gut, irgendwie so

00:43:21.830 --> 00:43:24.190
ja, Genauigkeit, Genauigkeit ist

00:43:24.190 --> 00:43:25.610
ein bisschen irreführend, gerade wenn die

00:43:25.610 --> 00:43:28.170
Klassen nicht so, wenn da nicht so

00:43:28.170 --> 00:43:30.070
viel, wenn das halt nicht gleich verteilt ist, sondern

00:43:30.070 --> 00:43:32.190
sehr unterschiedlich, kann einen, gibt's auch

00:43:32.190 --> 00:43:33.750
immer ein schönes Beispiel bei Spam, wenn

00:43:33.750 --> 00:43:36.070
halt irgendwie die Wahrscheinlichkeit, und das ist

00:43:36.070 --> 00:43:37.930
tatsächlich so, irgendwie, ich glaube, mittlerweile,

00:43:38.070 --> 00:43:40.010
wenn man, es kann sein,

00:43:40.110 --> 00:43:41.990
dass mehr als 99% aller verschickten

00:43:41.990 --> 00:43:42.910
Mail irgendwie Spam ist.

00:43:44.590 --> 00:43:46.190
Und wenn man dann einen Klassifikator

00:43:46.190 --> 00:43:47.590
macht, der einfach immer sagt, es ist Spam,

00:43:47.770 --> 00:43:49.990
dann hat er eine Accuracy von 99%.

00:43:50.790 --> 00:43:51.250
Tja.

00:43:51.870 --> 00:43:53.910
Sieht gut aus, ist aber nicht wirklich

00:43:53.910 --> 00:43:55.770
sinnvoll, weil das Problem ist, man kommt

00:43:55.770 --> 00:43:57.650
keine...

00:43:57.650 --> 00:43:58.870
Keine tiefere Erkenntnis.

00:43:59.310 --> 00:44:01.750
Ja, der guten Mails kommt noch durch.

00:44:01.950 --> 00:44:03.770
Das heißt, man kriegt gar keine Mail mehr, was so ein bisschen

00:44:03.770 --> 00:44:05.670
vielleicht nicht der Sinn von Mail ist.

00:44:05.770 --> 00:44:06.910
Ja, wäre kontraproduktiv tatsächlich.

00:44:08.330 --> 00:44:10.090
Aber sehr halt in dieser

00:44:10.490 --> 00:44:11.150
Bekommst du viel Spam?

00:44:11.930 --> 00:44:13.850
Ich weiß es ehrlich gesagt nicht.

00:44:14.170 --> 00:44:15.250
Es kommt kaum was durch.

00:44:16.090 --> 00:44:18.150
Ich habe letztens eine gekommen, die kam super durch.

00:44:18.250 --> 00:44:19.010
Das war sehr spannend.

00:44:19.710 --> 00:44:22.130
Ich wurde gefragt, ob ich mich nicht sofort für schnellen Sex

00:44:22.130 --> 00:44:24.050
treffen möchte. Und noch heute.

00:44:24.370 --> 00:44:25.970
Und ich müsste auch einfach nur hier draufklicken.

00:44:26.750 --> 00:44:28.030
Wirklich, sowas habe ich noch nie bekommen.

00:44:28.130 --> 00:44:29.850
Das war das erste Mal seit bestimmt

00:44:29.850 --> 00:44:31.950
acht Jahren oder sowas, dass sowas in meinem Postfach landete.

00:44:32.350 --> 00:44:34.130
Okay, ist interessant, wie Sie das geschafft haben,

00:44:34.130 --> 00:44:35.170
durch die Spamfilter durchzukommen.

00:44:38.630 --> 00:44:40.070
Werbung, genau. Ich weiß es nicht genau.

00:44:40.090 --> 00:44:42.010
Ich gucke jetzt hier gerade mal in meinen Spam-Foil.

00:44:42.110 --> 00:44:43.770
Doch, es kommt jeden Tag.

00:44:45.690 --> 00:44:46.750
Ich weiß es jetzt nicht.

00:44:46.890 --> 00:44:51.090
Allein heute sehe ich wahrscheinlich schon so 40, 50 Spam-Mails oder sowas.

00:44:51.350 --> 00:44:52.710
Wie viele E-Mails bekommst du eigentlich jeden Tag?

00:44:52.790 --> 00:44:54.290
Ich habe das irgendwann mal komplett raus sortiert.

00:44:54.750 --> 00:44:55.510
Ich weiß es nicht.

00:44:56.070 --> 00:44:59.150
Meine Inbox hier hat gerade so 5.600 ungelesene Mails.

00:44:59.850 --> 00:45:01.010
Von 10.000 reduziert.

00:45:01.090 --> 00:45:06.730
Ich bekomme relativ schnell voll, aber 100, 200 Stück bleibt da.

00:45:06.730 --> 00:45:08.930
Ich habe die ganzen E-Mails abonniert, alles rausgekickt,

00:45:09.010 --> 00:45:10.970
alles gelöscht, wollte ich alles

00:45:10.970 --> 00:45:12.210
nicht mehr haben, meine Dokus, nö.

00:45:12.570 --> 00:45:14.830
Ja, also dieses, ja, also

00:45:14.830 --> 00:45:16.810
ja, Mail ist problematisch.

00:45:17.030 --> 00:45:18.690
Ich bekomme natürlich jeden Tag immer zehnmal

00:45:18.690 --> 00:45:20.430
Fanpost von Hörern von diesen

00:45:20.430 --> 00:45:21.510
wunderschönen Posten.

00:45:23.110 --> 00:45:24.990
Ja, da geht's gerade noch.

00:45:25.170 --> 00:45:26.530
Da könnte, das ist okay.

00:45:28.570 --> 00:45:28.770
Also,

00:45:28.870 --> 00:45:30.430
wenn ihr möchtet, schreibt uns an hallo.at.

00:45:30.430 --> 00:45:31.070
Das ist schon okay.

00:45:32.670 --> 00:45:34.550
Es gibt ja auch keine, das Blöde ist halt irgendwie,

00:45:34.550 --> 00:45:36.410
es gibt ja auch keine Lösung. Natürlich kann man sagen,

00:45:36.730 --> 00:45:38.490
man nimmt einfach keine Mail mehr an oder man liest

00:45:38.490 --> 00:45:40.530
das nicht oder sowas auch. Also ihr könntet

00:45:40.530 --> 00:45:42.550
mal einen Test machen. Ihr könntet ein Piep in das

00:45:42.550 --> 00:45:44.810
nächste E-Mail, Fan-E-Mail

00:45:44.810 --> 00:45:46.530
an uns schreiben. Einmal das Wort und mal

00:45:46.530 --> 00:45:48.430
gucken, ob es bei uns im Filter landet. Also wir sehen

00:45:48.430 --> 00:45:50.450
das auch. Also ich gucke zumindest in den Filter, muss man mal rein.

00:45:50.530 --> 00:45:52.370
Du auch? Also ich schon.

00:45:52.490 --> 00:45:54.410
Ich verlasse mich drauf, dass das irgendwie funktioniert.

00:45:55.070 --> 00:45:56.350
Und dass Leute, wenn es

00:45:56.350 --> 00:45:58.110
irgendwas Wichtiges war, dann halt andere Wege versuchen,

00:45:58.250 --> 00:46:00.350
mich zu erreichen. Naja, also glaubt

00:46:00.350 --> 00:46:01.710
doch wirklich an einen Hörer, wenn er uns

00:46:01.710 --> 00:46:04.290
eine Liebeserklärung

00:46:04.290 --> 00:46:05.930
sagt. Das funktioniert leider nicht.

00:46:06.310 --> 00:46:08.250
Ja, ja, ja. Aber

00:46:08.250 --> 00:46:09.550
genau, also

00:46:09.550 --> 00:46:12.190
was ich halt an dieser

00:46:12.190 --> 00:46:13.830
Geschichte schick finde, ist,

00:46:14.690 --> 00:46:16.230
also man kann halt mit wenigen Zeilen

00:46:16.230 --> 00:46:17.850
Python, kann man halt einen

00:46:17.850 --> 00:46:20.110
I-Base-Classifier schreiben, der schnell ist, der

00:46:20.110 --> 00:46:21.910
relativ genau funktioniert.

00:46:22.970 --> 00:46:24.230
Man würde das jetzt nicht wirklich

00:46:24.230 --> 00:46:25.790
verwenden, wenn man tatsächlich in Spam

00:46:25.790 --> 00:46:27.950
Wie groß war jetzt nochmal der Trainingsdatensatz?

00:46:28.050 --> 00:46:29.830
5.000, hast du gesagt? 5.500

00:46:29.830 --> 00:46:31.530
vorkategorisierte

00:46:31.530 --> 00:46:34.050
Nachrichten. Könnte man noch

00:46:34.050 --> 00:46:36.410
zusammentragen, wenn man so ein Classifier-Problem

00:46:36.410 --> 00:46:37.590
selber lösen wollen würde?

00:46:38.250 --> 00:47:07.970
Ja, ja, nein, also ich meine, man würde das jetzt nicht, wenn man jetzt irgendwie einen Spam-Filter tatsächlich verwendet in einem Mail-Client oder so, da würde man jetzt diesen Ansatz nicht nehmen, aber, also weil das halt nicht so genau ist, ich habe das jetzt mal verglichen, da drunter sind noch so irgendwie zwei andere Dinge, ich habe einmal einfach nur eine lineare Support-Vector-Maschine genommen, die ist halt ein Stückchen besser und auch nicht viel langsamer, die ist auch sehr schnell und dann habe ich auch nochmal Spacey genommen mit so einem 1D-Convolutional-Netz

00:47:07.970 --> 00:47:09.950
und das ist unfassbar viel langsamer.

00:47:10.250 --> 00:47:11.590
Alle wieder abgehängt.

00:47:11.930 --> 00:47:13.590
Ja, also der Witz ist,

00:47:13.950 --> 00:47:16.550
also eigentlich natürlich nimmt man nicht Naive Base,

00:47:16.850 --> 00:47:18.290
aber es könnte Situationen geben,

00:47:18.410 --> 00:47:20.290
in denen das total sinnvoll ist, sowas zu benutzen.

00:47:20.730 --> 00:47:23.390
Wie zum Beispiel, also ein Szenario wäre,

00:47:24.050 --> 00:47:25.350
du möchtest Trainingsdaten generieren.

00:47:26.170 --> 00:47:26.490
Ja.

00:47:27.610 --> 00:47:29.010
Und du hast jetzt,

00:47:29.190 --> 00:47:30.450
möchtest das aber im Frontend machen,

00:47:30.450 --> 00:47:31.810
so dass das halt sich für denjenigen,

00:47:32.010 --> 00:47:33.270
der das editiert,

00:47:33.430 --> 00:47:36.450
halt irgendwie schnell

00:47:37.290 --> 00:47:39.330
und so anfühlt, dass er damit

00:47:39.330 --> 00:47:41.290
irgendwie gut arbeiten kann. Und jetzt

00:47:41.290 --> 00:47:45.210
möchtest du halt nicht jedes Mal ein Request

00:47:45.210 --> 00:47:47.070
machen und uns irgendwie einen Server schicken, wo dann

00:47:47.070 --> 00:47:49.190
irgendwie irgendwas installiert ist mit NumPy oder so, was

00:47:49.190 --> 00:47:51.170
dann halt irgendwie ordentlich

00:47:51.170 --> 00:47:52.630
einen Classifier hat,

00:47:53.190 --> 00:47:55.090
sondern dir ist wichtiger, dass es schnell ist.

00:47:55.210 --> 00:47:57.250
Und das letzte Prozent Genauigkeit interessiert

00:47:57.250 --> 00:47:59.210
dich nicht oder das letzte Prozent F1

00:47:59.210 --> 00:48:01.270
Wert oder so, weil es einfach

00:48:01.270 --> 00:48:03.070
nur darum geht, möglichst schnell viele Trainingsdaten

00:48:03.070 --> 00:48:04.990
zu erzeugen. Und dich interessiert vielleicht noch, ob

00:48:04.990 --> 00:48:07.190
ein Ding schwer oder leicht zu klassifizieren ist.

00:48:07.290 --> 00:48:09.170
aber nicht, ob das jetzt ganz genau

00:48:09.170 --> 00:48:10.970
stimmt oder nicht, weil es guckt ja eh jemand nochmal drauf.

00:48:11.970 --> 00:48:13.090
Und da

00:48:13.090 --> 00:48:15.050
kann halt das, dieses

00:48:15.050 --> 00:48:17.170
Naiv-Based-Ding könntest du auch in JavaScript problemlos

00:48:17.170 --> 00:48:19.110
implementieren. Das wären ein paar Zahlen mehr,

00:48:19.210 --> 00:48:21.150
nicht viel mehr Zahlen. Und es wäre auch

00:48:21.150 --> 00:48:21.930
sauschnell in JavaScript.

00:48:22.830 --> 00:48:24.830
Und du könntest das halt im Frontend verwenden,

00:48:25.090 --> 00:48:27.090
um halt basierend, also jemand sagt,

00:48:27.250 --> 00:48:29.150
das ist Spam, das ist Spam. Okay, jetzt sortiere

00:48:29.150 --> 00:48:31.290
mir nochmal um, sodass die uneindeutigen

00:48:31.290 --> 00:48:32.330
Fälle oben sind halt.

00:48:34.370 --> 00:48:34.730
Und

00:48:34.730 --> 00:48:37.170
dann sortierst du nochmal, machst nochmal 20 Beispiele

00:48:37.170 --> 00:48:39.190
für die, 20 Beispiele für die Gruppe, sortierst nochmal um,

00:48:39.270 --> 00:48:40.830
dann kannst du halt wahrscheinlich tausende von Dingen

00:48:40.830 --> 00:48:43.250
in relativ wenig Zeit irgendwie

00:48:43.250 --> 00:48:44.670
labeln

00:48:44.670 --> 00:48:47.470
und benutzt halt zum Sortieren

00:48:47.470 --> 00:48:49.230
einen Classifier, der

00:48:49.230 --> 00:48:50.850
halt im Frontend-Code in JavaScript

00:48:50.850 --> 00:48:52.670
so läuft. Und für den Fall

00:48:52.670 --> 00:48:55.310
Aber wir sind doch hier

00:48:55.310 --> 00:48:57.050
beim Python-Podcast. Ja, natürlich.

00:48:57.250 --> 00:48:58.950
Also du kannst das halt auch in Python machen.

00:48:59.250 --> 00:49:00.910
TypeScript ist ja auch relativ nah dran, tatsächlich.

00:49:01.870 --> 00:49:03.450
Ja, aber

00:49:03.450 --> 00:49:07.090
also, sagen wir so, das ist halt ein

00:49:07.090 --> 00:49:09.130
Vorteil, den fast alle diese sogenannten

00:49:09.130 --> 00:49:11.050
Skriptsprachen halt haben. Also ich finde das immer

00:49:11.050 --> 00:49:13.170
so ein bisschen... Ja, man könnte das auch

00:49:13.170 --> 00:49:15.110
direkt wieder rausrennen dann, ne? Und irgendeine Datenbank

00:49:15.110 --> 00:49:16.290
kleine...

00:49:16.290 --> 00:49:19.050
Irreführend, wenn die dann halt so abwehren als Skriptsprachen, weil das ist halt

00:49:19.050 --> 00:49:20.910
eine große Stärke. Also du kannst halt wirklich

00:49:20.910 --> 00:49:23.050
solche Sachen... Du brauchst im Grunde nur

00:49:23.050 --> 00:49:25.050
diese drei Grunddatentypen, wie eben

00:49:25.050 --> 00:49:27.270
ja, Zahlen, Strings,

00:49:27.510 --> 00:49:29.110
also Variablen, wo halt

00:49:29.110 --> 00:49:30.130
ein Ding irgendwie drin ist,

00:49:31.130 --> 00:49:32.810
Listen und Dicts

00:49:32.810 --> 00:49:35.070
und kannst damit halt schon sehr, sehr viel bauen.

00:49:35.870 --> 00:49:36.170
Und

00:49:36.170 --> 00:49:40.770
ja, musst da nicht irgendwie großartig

00:49:40.770 --> 00:49:42.490
irgendwie Boilerplate schreiben und

00:49:42.490 --> 00:49:44.410
irgendwie eine Klassenhierarchie aufbauen

00:49:44.410 --> 00:49:46.370
und irgendwie UML-Diagramme malen,

00:49:46.430 --> 00:49:48.330
sondern du kannst es halt einfach mal so kurz runterschreiben

00:49:48.330 --> 00:49:50.410
und kommst damit, wenn du es

00:49:50.410 --> 00:49:52.550
richtig machst, halt in Performance-Regionen,

00:49:53.270 --> 00:49:54.530
die sonst schwer zu erreichen

00:49:54.530 --> 00:49:56.310
sind. Also wenn du das zum Beispiel jetzt in C++ machen

00:49:56.310 --> 00:49:58.230
wolltest und versuchst, schneller zu sein als diese

00:49:58.230 --> 00:50:00.150
Python-Implementation, wird das,

00:50:00.650 --> 00:50:01.610
das wird schwer, weil

00:50:01.610 --> 00:50:04.370
die Dict-Implementation ist in Python relativ

00:50:04.370 --> 00:50:05.730
relativ stark optimiert.

00:50:05.730 --> 00:50:07.410
Da geht dann so viel Zeit rein, um das zu entwickeln.

00:50:07.530 --> 00:50:09.350
In der Zeit hätte man einen Algorithmus.

00:50:09.570 --> 00:50:10.550
Es ist wirklich,

00:50:11.010 --> 00:50:12.810
ich meine, ich habe das ja dann auch schon häufig,

00:50:13.110 --> 00:50:15.050
also wenn du das dann in C++ machst und dann die

00:50:15.050 --> 00:50:17.070
Hashmap aus der Standardbibliothek oder so, kann es gut sein,

00:50:17.170 --> 00:50:18.470
dass du langsamer bist als Python, weil

00:50:18.470 --> 00:50:20.930
die Implementation nicht so optimiert ist.

00:50:21.370 --> 00:50:23.070
Und du kannst es mit C++ viel schneller

00:50:23.070 --> 00:50:24.510
hinkriegen, aber du würdest halt

00:50:24.510 --> 00:50:27.410
derartig viel mehr

00:50:27.410 --> 00:50:29.210
Zeit dafür brauchen. Und die Frage ist, brauchst du es halt

00:50:29.210 --> 00:50:30.270
so genau und so schnell?

00:50:31.070 --> 00:50:33.510
Bist du bereit dafür, so viel Zeit zu investieren?

00:50:33.510 --> 00:50:34.450
und die Antwort ist oft nein.

00:50:34.810 --> 00:50:37.750
Es ist viel besser, weniger Zeit zu brauchen

00:50:37.750 --> 00:50:40.590
und etwas zu haben,

00:50:40.710 --> 00:50:42.150
das vielleicht nicht total super optimal ist,

00:50:42.250 --> 00:50:43.450
aber halt auch schon sehr gut.

00:50:43.950 --> 00:50:44.370
Und das geht.

00:50:44.630 --> 00:50:46.710
Und das ist das, was ich eigentlich damit zeigen wollte.

00:50:46.790 --> 00:50:48.430
Pre-Labeling von Trainingsdaten.

00:50:48.710 --> 00:50:50.730
Ja, genau.

00:50:51.630 --> 00:50:53.570
Oder halt auch, um zu verstehen, wie das funktioniert,

00:50:53.690 --> 00:50:54.530
um wirklich sagen zu können,

00:50:54.630 --> 00:50:55.550
okay, ich kann mich jetzt darauf verlassen,

00:50:55.650 --> 00:50:57.150
dass das wirklich klappt,

00:50:57.210 --> 00:51:00.470
weil das Problem ist ja immer an den Blackbox-neuronalen Netzgeschichten

00:51:00.470 --> 00:51:01.050
oder so auch.

00:51:02.430 --> 00:51:25.510
Du kannst da nicht so richtig gut reingucken, natürlich kann man irgendwie das alles evaluieren oder so, aber du verstehst halt auch nicht so wirklich, was das tut und es ist immer gut, so ein paar Sachen da zu haben, bei denen man wirklich auch das insofern verstanden hat, dass man es einfach mal selber implementiert hat, weil man dann beurteilen kann, was da passiert und wenn das halt ganz andere Ergebnisse liefert oder so, dann hat man auch einen interessanten Ansatzpunkt, wo man nachfragen kann, was ist denn da jetzt eigentlich passiert.

00:51:27.690 --> 00:51:37.390
Und genau, daher finde ich das super sinnvoll, ab und zu mal so ein Verfahren auch selber zu implementieren oder in NaiveBase ist halt auch da super, weil es halt so super einfach ist, genau.

00:51:39.130 --> 00:51:43.330
Ja, also in dem Notebook hast du dann tatsächlich das nochmal verglichen von der Geschwindigkeit her zu den ganzen anderen Verfahren.

00:51:43.370 --> 00:51:45.530
Von der Geschwindigkeit her, das sind einfach nur die...

00:51:45.530 --> 00:51:46.490
Präzisionsgrade, Entschuldigung.

00:51:47.170 --> 00:51:55.790
Also eigentlich eben Genauigkeit sollte man sich nicht angucken, sondern Precision Recall und ja, da ist halt irgendwie so lineare Support-Weckmaschinen sind halt schon so ein bisschen besser.

00:51:55.790 --> 00:51:57.850
Was ist Precision Recall?

00:51:58.770 --> 00:51:59.790
Ja, das ist halt

00:51:59.790 --> 00:52:02.170
Genauigkeit eben. Argument von eben

00:52:02.170 --> 00:52:03.770
ist halt, wenn

00:52:03.770 --> 00:52:06.050
mehr als 99% der Mails, die man

00:52:06.050 --> 00:52:07.250
so sieht, Spam sind, dann

00:52:07.250 --> 00:52:09.710
ist Genauigkeit von 99%

00:52:09.710 --> 00:52:10.610
sagt halt nichts aus.

00:52:11.470 --> 00:52:13.050
Und dann benutzt man den Recall-Wert?

00:52:13.370 --> 00:52:15.530
Man benutzt Precision und Recall und

00:52:15.530 --> 00:52:17.890
Precision ist halt

00:52:17.890 --> 00:52:19.670
sozusagen

00:52:19.670 --> 00:52:21.850
die, also man kann, es gibt

00:52:21.850 --> 00:52:23.710
vier Fälle, die auftreten können, wenn du

00:52:23.710 --> 00:52:26.050
jetzt irgendwie Spam klassifizierst.

00:52:27.310 --> 00:52:28.190
Es kann halt sein...

00:52:28.190 --> 00:52:29.650
Alpha-Fehler, Beta-Fehler, ja und nein.

00:52:30.370 --> 00:52:31.770
Genau, genau. Oder bei Machine Learning

00:52:31.770 --> 00:52:33.910
nennt man das oft True-Positive, False-Positive,

00:52:34.090 --> 00:52:35.390
False-Negative und True-Negative.

00:52:36.190 --> 00:52:37.530
Also sozusagen es ist...

00:52:37.530 --> 00:52:39.370
Es ist Spam und du hast es als Spam erkannt. Genau.

00:52:39.370 --> 00:52:41.370
Es ist Spam und es ist bei deinem Impost-Eingang

00:52:41.370 --> 00:52:42.610
gelandet. Das wäre

00:52:42.610 --> 00:52:45.370
False-Negative, ja.

00:52:45.550 --> 00:52:47.370
Oder es ist kein Spam

00:52:47.370 --> 00:52:49.690
und du hast es als Spam erkannt und es ist False-Positive.

00:52:50.430 --> 00:52:51.450
Oder... Es ist kein Spam

00:52:51.450 --> 00:52:52.970
und du hast es im Post-Eingang, was genau das ist.

00:52:53.210 --> 00:52:55.330
bei der Geschichte, also

00:52:55.330 --> 00:52:57.490
True Negatives spielen bei uns jetzt keine Rolle,

00:52:57.650 --> 00:52:59.470
weil das ist halt das Gleiche, wenn du jetzt nur zwei

00:52:59.470 --> 00:53:01.410
Klassen hast, also

00:53:01.410 --> 00:53:03.550
aber wenn du jetzt

00:53:03.550 --> 00:53:05.350
mehrere Klassen hättest, müsstest du das halt auch nochmal

00:53:05.350 --> 00:53:07.550
unterscheiden oder bei Multilabel musstest du das unterscheiden,

00:53:08.270 --> 00:53:09.390
weil es dann ja auch sein kann, dass etwas

00:53:09.390 --> 00:53:11.530
in keiner Klasse liegt oder so, aber den Fall haben wir ja gar nicht,

00:53:11.630 --> 00:53:13.070
wir haben ja nur irgendwie Spam oder Ham.

00:53:13.090 --> 00:53:13.890
Wir binär, genau.

00:53:16.030 --> 00:53:17.390
Und genau, dann

00:53:17.390 --> 00:53:18.670
ist Precision einfach

00:53:18.670 --> 00:53:20.730
Anzahl der Dinge,

00:53:21.030 --> 00:53:23.070
Anzahl der True Positives geteilt durch

00:53:23.070 --> 00:53:25.330
TruePositive

00:53:25.330 --> 00:53:26.250
plus FalsePositive.

00:53:27.310 --> 00:53:28.970
Also nochmal, TruePositive

00:53:28.970 --> 00:53:31.350
ist ein Mail, die kein Spam ist

00:53:31.350 --> 00:53:32.390
und die im Posteingang landet?

00:53:33.110 --> 00:53:34.210
TruePositive ist

00:53:34.210 --> 00:53:37.210
es ist kein Spam und

00:53:37.210 --> 00:53:38.330
es ist im Posteingang gelandet.

00:53:38.890 --> 00:53:40.710
Habe ich das nicht gesagt? Oder hast du das gesagt?

00:53:40.870 --> 00:53:42.810
Okay, dann habe ich es nur falsch verstanden.

00:53:43.350 --> 00:53:44.490
Musst du mal zurückspulen, nochmal neu hören.

00:53:45.450 --> 00:53:46.910
Genau, also es ist alles richtig gelaufen,

00:53:47.050 --> 00:53:49.110
das ist TruePositive. FalsePositive wäre

00:53:49.110 --> 00:53:51.190
halt irgendwie, es wurde als Spam

00:53:51.190 --> 00:53:52.870
erkannt, es war aber kein Spam.

00:53:53.070 --> 00:54:12.230
Und jetzt addiert man halt die False Positives auf die True Positives und wenn man jetzt sozusagen die True Positives teilt dadurch, durch die größere Zahl, dann kriegt man die Quote der, wie kann man das sagen, die Quote der, bei denen es richtig gelaufen ist sozusagen.

00:54:12.450 --> 00:54:13.630
Aber das ist jetzt nicht so

00:54:13.630 --> 00:54:15.470
wie bei der Genauigkeit, sondern

00:54:15.470 --> 00:54:17.710
es ist halt, da wäre halt, wenn man

00:54:17.710 --> 00:54:19.930
jetzt sozusagen

00:54:19.930 --> 00:54:21.670
einen Classifier hätte, der immer

00:54:21.670 --> 00:54:22.270
sagt

00:54:22.270 --> 00:54:25.570
Spam, ja, der hätte halt

00:54:25.570 --> 00:54:27.330
eine irre hohe Anzahl von False Positives

00:54:27.330 --> 00:54:29.650
und der hätte dann halt eine Precision

00:54:29.650 --> 00:54:30.870
von Null, mehr oder weniger.

00:54:31.430 --> 00:54:33.550
Also, da hätte ich vielleicht recht, aber

00:54:33.550 --> 00:54:34.250
ja, genau.

00:54:35.530 --> 00:54:37.710
Okay, Recall. Und Recall ist halt

00:54:37.710 --> 00:54:39.230
sozusagen das Gleiche, bloß

00:54:39.230 --> 00:54:41.550
irgendwie mit False

00:54:41.550 --> 00:54:43.490
Negatives statt True Positives und

00:54:43.490 --> 00:54:45.570
das beschreibt im Grunde, wie viel von denen, die ich hätte

00:54:45.570 --> 00:54:47.090
erkennen sollen, habe ich tatsächlich erkannt.

00:54:48.470 --> 00:54:49.530
Ja, man

00:54:49.530 --> 00:54:51.510
kann halt einfach auf Precision optimieren,

00:54:51.630 --> 00:54:52.890
indem man sagt, irgendwie

00:54:52.890 --> 00:54:54.670
ja, man

00:54:54.670 --> 00:54:57.610
klassifiziert

00:54:57.610 --> 00:54:59.570
nur das Ding, wo man sich super sicher ist, als

00:54:59.570 --> 00:55:01.050
nur eins als super sicher

00:55:01.050 --> 00:55:03.710
als das, was man

00:55:03.710 --> 00:55:05.570
wo man es hält, ja, dann hat man

00:55:05.570 --> 00:55:07.670
wahrscheinlich eine Precision von eins, aber

00:55:07.670 --> 00:55:09.510
wenn man jetzt nicht alle findet, sondern

00:55:09.510 --> 00:55:10.430
irgendwie

00:55:10.430 --> 00:55:13.150
viele Spams

00:55:13.150 --> 00:55:14.770
halt durchgehen. Es gibt so ein paar

00:55:14.770 --> 00:55:17.050
Machine Learning Beispiele, für die das vielleicht gar nicht so irrelevant ist.

00:55:17.150 --> 00:55:18.770
Also wenn man jetzt zum Beispiel entscheidet, ob man jetzt

00:55:18.770 --> 00:55:20.890
einen Laser auf einen Insekt richtet, um das dann abzuschießen oder nicht,

00:55:21.210 --> 00:55:22.810
und das ist aus Versehen dann die Katze oder der Hund,

00:55:22.870 --> 00:55:24.810
das wäre dann vielleicht nicht ganz so gut, wenn man dann

00:55:24.810 --> 00:55:26.890
so ein paar False Positives... Das sind False Positives, genau.

00:55:27.070 --> 00:55:28.750
Das wäre auch, das ist auch, aber es ist je nach

00:55:28.750 --> 00:55:30.830
Problem, ist es halt unterschiedlich

00:55:30.830 --> 00:55:32.250
schlimm, ob jetzt False Positives oder

00:55:32.250 --> 00:55:33.730
False Negatives auftreten.

00:55:34.890 --> 00:55:36.750
Ist aber beides natürlich blöd, das sind halt einfach

00:55:36.750 --> 00:55:38.750
unterschiedliche Arten von... Also im einen Fall kommt einfach

00:55:38.750 --> 00:55:40.190
hat die Mücke dann trotzdem rein und sticht dich.

00:55:40.270 --> 00:55:41.510
Und im anderen Fall ist es vielleicht deine Katze.

00:55:42.330 --> 00:55:43.650
Genau, in dem Fall würde man wahrscheinlich eher

00:55:43.650 --> 00:55:45.330
als Positives versuchen wollen zu vermeiden.

00:55:45.670 --> 00:55:49.010
Aber ja, es hängt halt von dem Problem ab.

00:55:49.090 --> 00:55:51.550
Und man kann sich sozusagen meistens aussuchen,

00:55:51.630 --> 00:55:52.470
was man jetzt lieber hätte.

00:55:52.670 --> 00:55:53.490
Man kann halt darauf optimieren.

00:55:53.650 --> 00:55:55.070
Das heißt, du definierst quasi die Irrtumswahrscheinlichkeit,

00:55:55.130 --> 00:55:56.310
die du nicht unterschreiten willst.

00:55:56.450 --> 00:55:58.730
Und darauf optimierst du dann dein Modell.

00:55:59.010 --> 00:55:59.810
Genau, genau.

00:55:59.970 --> 00:56:01.170
Man kann sagen, also ich möchte nicht,

00:56:02.010 --> 00:56:04.850
dass mir so und so viel echte Mails verloren gehen.

00:56:05.350 --> 00:56:07.150
Das wäre wahrscheinlich das mit dem Swamp-Klassiker.

00:56:07.150 --> 00:56:09.330
3 klassische Grenzen, 1%, 2%, 5%

00:56:09.330 --> 00:56:10.910
oder sowas. Ja, also

00:56:10.910 --> 00:56:12.910
die aktuellen Geschichten sind wahrscheinlich alle noch

00:56:12.910 --> 00:56:14.350
deutlich drunter, aber

00:56:14.350 --> 00:56:15.970
genau, und dann

00:56:15.970 --> 00:56:18.870
sagt man, okay, dann mit dem anderen Fehler lebt man

00:56:18.870 --> 00:56:20.870
dann halt, ja, also im Fall von Spam-Classifier

00:56:20.870 --> 00:56:22.930
würde man halt eher damit leben, dass halt ein bisschen Spam

00:56:22.930 --> 00:56:25.010
durchkommt. Aber man möchte eigentlich nicht,

00:56:25.230 --> 00:56:26.330
dass echte Mail irgendwie

00:56:26.330 --> 00:56:28.910
wegsortiert wird. Ja, das

00:56:28.910 --> 00:56:30.990
wäre nicht so gut. Aber wie gesagt,

00:56:31.050 --> 00:56:33.030
je nach Anwendung kann das halt unterschiedlich sein. Es gibt auch Anwendungen,

00:56:33.090 --> 00:56:34.810
bei denen es andersrum ist. Also

00:56:34.810 --> 00:56:36.670
medizinische Anwendungen sind oft dann zum Beispiel

00:56:36.670 --> 00:56:38.630
dann eher darauf optimiert, dass es Recall

00:56:38.630 --> 00:56:40.190
hoch ist und Fall-Spositives

00:56:40.190 --> 00:56:42.490
sind egal, man möchte halt nicht, dass man jemanden

00:56:42.490 --> 00:56:44.530
undiagnostiziert lässt, vielleicht, je nachdem,

00:56:44.570 --> 00:56:45.170
was es für eine Klarheit ist.

00:56:46.250 --> 00:56:47.910
Also, ja, kommt.

00:56:48.030 --> 00:56:50.510
Zu dem Spam-Fall noch ganz interessant, also um jetzt mal auf das

00:56:50.510 --> 00:56:52.730
echte Beispiel zurückzukommen, würde

00:56:52.730 --> 00:56:54.110
man dann vielleicht hingehen und

00:56:54.110 --> 00:56:56.790
bestimmte Ausnahmekriterien noch hinterherfiltern,

00:56:56.870 --> 00:56:58.650
beispielsweise, wenn du jetzt von mir eine Mail

00:56:58.650 --> 00:57:00.610
bekommst und ich bin ja wahrscheinlich irgendwie

00:57:00.610 --> 00:57:02.570
in deinem Adressbuch drin, dass

00:57:02.570 --> 00:57:04.370
du mich dann trotzdem kriegst, obwohl

00:57:04.370 --> 00:57:06.550
ich jetzt dir ganz viele Schimpfworte schreibe, oder?

00:57:06.670 --> 00:57:09.210
Genau, also natürlich, das ist jetzt

00:57:09.210 --> 00:57:11.210
nicht ein echtes System oder so, sondern das ist

00:57:11.210 --> 00:57:12.850
einfach nur so ein Beispiel, aber

00:57:12.850 --> 00:57:15.230
natürlich diese ganzen Signale oder

00:57:15.230 --> 00:57:17.330
Features oder so, das würde man alles mit rein

00:57:17.330 --> 00:57:18.770
beziehen eigentlich.

00:57:19.030 --> 00:57:20.470
Ich weiß schon, was ich jetzt ausprobieren werde.

00:57:22.150 --> 00:57:22.450
Ja, ja.

00:57:23.290 --> 00:57:24.630
Und ich glaube also mittlerweile,

00:57:24.890 --> 00:57:27.030
ich weiß nicht mal, was da

00:57:27.030 --> 00:57:28.850
verwendet wird. Also

00:57:28.850 --> 00:57:30.710
bei Google habe ich jetzt noch, also die

00:57:30.710 --> 00:57:32.950
Verfahren, die heutzutage verwendet werden, sind alle sehr, sehr

00:57:32.950 --> 00:57:33.610
schlau mittlerweile.

00:57:34.550 --> 00:57:36.090
Die hätten ja schon genug Trainingsdaten, um das

00:57:36.090 --> 00:57:37.150
noch ein bisschen mehr zu optimieren.

00:57:37.610 --> 00:57:40.110
Da gibt es einen globalen Anteil, zum Beispiel bei Google,

00:57:40.310 --> 00:57:41.930
ich weiß nicht genau, wann ich das letzte Mal

00:57:41.930 --> 00:57:44.050
ein Paper darüber gelesen habe, was sie machen, aber sie haben dann

00:57:44.050 --> 00:57:46.050
halt irgendwie, ihr Modell besteht teilweise

00:57:46.050 --> 00:57:47.790
halt aus so globalen Geschichten,

00:57:48.570 --> 00:57:49.990
weil sie halt sehr viel

00:57:49.990 --> 00:57:51.530
Spam und Nicht-Spam haben sozusagen,

00:57:51.710 --> 00:57:53.370
die sie als Trainingsdaten verwenden können.

00:57:53.830 --> 00:57:56.190
Und dann ist das Modell auch immer noch teilweise

00:57:56.190 --> 00:57:57.210
personalisiert

00:57:57.210 --> 00:57:59.550
auf dich, weil es gibt halt vielleicht auch Leute, die

00:57:59.550 --> 00:58:01.750
wenn ich jetzt irgendwie, keine Ahnung,

00:58:01.750 --> 00:58:01.930
ein

00:58:01.930 --> 00:58:05.090
jemand bin, der sich professionell

00:58:05.090 --> 00:58:07.250
beschäftigt, Spam von Nicht-Spam zu unterscheiden

00:58:07.250 --> 00:58:09.030
und dann mir die Leute Spam schicken

00:58:09.030 --> 00:58:10.990
als Beispiele und ich das nicht kriege,

00:58:11.230 --> 00:58:13.030
weil das heißt, es muss auch

00:58:13.030 --> 00:58:15.050
manche Leute, bei manchen Leuten

00:58:15.050 --> 00:58:16.950
ist das ja vielleicht okay. Oder wenn ich

00:58:16.950 --> 00:58:18.930
jetzt zum Beispiel ein nigerianischer

00:58:18.930 --> 00:58:20.990
Prinz bin, der irgendwie ein Bankkonto in der Schweiz hat,

00:58:21.490 --> 00:58:22.590
dann, ja.

00:58:22.590 --> 00:58:24.610
Wäre schon doof, wenn die ganzen Leute meine Hilfe versuchen,

00:58:24.670 --> 00:58:26.830
ich will den Geld schenken und keiner will es haben.

00:58:27.010 --> 00:58:27.910
Alle denken so, haha, ja.

00:58:29.970 --> 00:58:30.330
Also,

00:58:30.750 --> 00:58:35.670
Ja, die bestehen halt aus so einem globalen Teil

00:58:35.670 --> 00:58:38.210
und halt aus so einem personalisierten Teil.

00:58:38.310 --> 00:58:39.510
Mir passiert das immer mit meinem Nachnamen.

00:58:39.570 --> 00:58:41.070
Leute sagen immer, haha, verarsch mich nicht.

00:58:41.710 --> 00:58:41.870
Ja.

00:58:42.910 --> 00:58:43.550
Ja, ist so.

00:58:44.050 --> 00:58:44.770
Vollst positiv, ja.

00:58:44.990 --> 00:58:45.650
Oder? Was sagst du?

00:58:46.030 --> 00:58:48.150
Das wäre vollst positiv, ja.

00:58:48.250 --> 00:58:51.810
Das wäre mal eigentlich was, alles in Ordnung, ja.

00:58:54.710 --> 00:58:56.130
Genau, und ja.

00:58:58.070 --> 00:58:59.390
Ich denke halt immer, ich mache mich lustig

00:58:59.390 --> 00:59:00.290
und finde meinen Humor doof.

00:59:00.750 --> 00:59:06.290
Ja, also die

00:59:06.290 --> 00:59:07.590
Dinger funktionieren. Also ich habe

00:59:07.590 --> 00:59:10.210
weder das Spam durchgekommen ist, noch dass

00:59:10.210 --> 00:59:12.270
ich, okay, vielleicht kriege ich einfach nicht mit, dass

00:59:12.270 --> 00:59:14.010
bei mir normale Mail verschwindet, aber

00:59:14.010 --> 00:59:16.130
also früher war das tatsächlich immer noch so ein Problem

00:59:16.130 --> 00:59:17.490
und mittlerweile ist das alles so gut.

00:59:18.150 --> 00:59:19.990
Ich würde einfach sagen, das funktioniert.

00:59:24.110 --> 00:59:25.910
Genau, ja, ich habe dann halt noch so ein paar Sachen

00:59:25.910 --> 00:59:27.370
probiert und eben zum Beispiel

00:59:27.370 --> 00:59:29.870
jetzt hier die, also

00:59:29.870 --> 00:59:31.890
irgendwie State of the Art

00:59:31.890 --> 00:59:34.750
irgendwie Textklassifikationsgeschichte

00:59:34.750 --> 00:59:36.110
ist schon besser als

00:59:36.110 --> 00:59:40.490
als Naive Bayes, aber

00:59:40.490 --> 00:59:42.510
nicht so wahnsinnig, also in dem Fall halt gar nicht so

00:59:42.510 --> 00:59:43.830
wahnsinnig viel. Halt irgendwie

00:59:43.830 --> 00:59:46.630
bisschen mehr F1

00:59:46.630 --> 00:59:48.390
irgendwie, ein Prozent oder

00:59:48.390 --> 00:59:50.330
anderthalb oder sowas, aber viel mehr auch nicht.

00:59:51.170 --> 00:59:52.530
Also, achso, F1, harmonische

00:59:52.530 --> 00:59:54.570
Mittel zwischen Precision und Tricor. Wir haben das glaube ich

00:59:54.570 --> 00:59:56.590
bei der Textklassifikationsfolge auch schon nochmal alles erzählt.

00:59:56.710 --> 00:59:58.390
Ja, weil wir wollten jetzt auch nicht, dass alle das alles nochmal

00:59:58.390 --> 01:00:00.370
hören müssen, die auch gerade einschalten oder nur

01:00:00.370 --> 01:00:02.410
von der F-Base zuhören. Also du musst vielleicht

01:00:02.410 --> 01:00:04.330
nochmal deswegen kurz erwähnen, was eine Support-Vector-Maschine

01:00:04.330 --> 01:00:05.350
ist und was Base hier ist.

01:00:06.710 --> 01:00:06.890
Ja,

01:00:07.330 --> 01:00:10.170
richtig, also Support-Vector-Maschinen

01:00:10.170 --> 01:00:12.210
sind

01:00:12.210 --> 01:00:14.250
auch eine Art von

01:00:14.250 --> 01:00:16.150
ja, Machine Learning

01:00:16.150 --> 01:00:17.530
Verfahren, Modellen.

01:00:19.470 --> 01:00:20.230
So ein bisschen, also manchmal

01:00:20.230 --> 01:00:22.210
manche Namen sind halt ein bisschen blöd, da würde ich sagen, auch der Name

01:00:22.210 --> 01:00:24.210
ist ein bisschen, also sagt einem halt nicht, was das macht.

01:00:24.850 --> 01:00:26.410
Was das eigentlich

01:00:26.410 --> 01:00:27.470
tut, ist...

01:00:27.470 --> 01:00:28.850
Orthogonale Vektoren auf irgendwelchen

01:00:28.850 --> 01:00:30.890
Ebenen erzeugen. Ja, es ist ein diskriminatives

01:00:30.890 --> 01:00:32.910
Machine Learning Modell, das halt lernt

01:00:32.910 --> 01:00:34.850
sozusagen

01:00:34.850 --> 01:00:36.990
zwischen, wenn man jetzt ein paar Spam und Nicht-Spam

01:00:36.990 --> 01:00:39.010
nimmt, zwischen diesen beiden Klassen. Es interpretiert

01:00:39.010 --> 01:00:40.870
halt auch, wie eigentlich fast alle Machine Learning

01:00:40.870 --> 01:00:41.950
Modelle jetzt außerdem,

01:00:42.090 --> 01:00:44.110
das macht das nicht so, aber

01:00:44.110 --> 01:00:46.050
interpretiert halt

01:00:46.050 --> 01:00:48.510
Texte als Vektoren in einem

01:00:48.510 --> 01:00:50.210
enddimensionalen Vektorraum.

01:00:51.070 --> 01:00:52.690
Ja, wobei halt, also das wäre auch

01:00:52.690 --> 01:00:54.150
klassischer Back-of-Words

01:00:54.150 --> 01:00:56.750
Ansatz, dass halt jedes

01:00:56.750 --> 01:00:57.870
Wort ist sozusagen eine Dimension

01:00:57.870 --> 01:01:00.670
und der Text ist halt einfach

01:01:00.670 --> 01:01:02.770
der Vektor, der dann

01:01:02.770 --> 01:01:04.770
entsteht, wenn du sozusagen bei allen

01:01:04.770 --> 01:01:06.850
Wörtern, die du gesehen hast, diese Dimensionen,

01:01:06.890 --> 01:01:08.710
denen ein Gewicht gibst, also du kannst auch einfach eins setzen,

01:01:08.790 --> 01:01:10.430
dann wäre es halt binär, aber du kannst,

01:01:10.850 --> 01:01:12.750
also eins, du hast ein Wort, das Wort gesehen oder null, du hast das Wort

01:01:12.750 --> 01:01:13.250
halt nicht gesehen.

01:01:14.830 --> 01:01:16.870
Wie viele Dimensionen kannst du dir so vorstellen

01:01:16.870 --> 01:01:18.570
vor deinem inneren Auge, wenn du

01:01:18.570 --> 01:01:19.750
versuchst, sie zu visualisieren?

01:01:19.770 --> 01:01:22.570
Das ist nicht schlimm, das muss man sich nicht großartig vorstellen.

01:01:22.630 --> 01:01:23.570
Das muss man sich gar nicht vorstellen.

01:01:23.970 --> 01:01:25.370
Nee, also was ich mir

01:01:25.370 --> 01:01:27.070
vorstelle, ist halt irgendwas Dreidimensionales vielleicht.

01:01:27.590 --> 01:01:29.010
Aber man kann ja sagen, okay, das ist jetzt nicht direkt

01:01:29.010 --> 01:01:30.190
dreidimensional, sondern halt

01:01:30.190 --> 01:01:32.690
hunderttausenddimensional oder so.

01:01:32.690 --> 01:01:34.050
Ist ja...

01:01:34.050 --> 01:01:36.150
Ja, ich hau gut einen dann halt unter Umständen.

01:01:38.430 --> 01:01:38.550
Also

01:01:38.550 --> 01:01:40.690
vier geht vielleicht auch noch, wenn man sich so einen feststehenden Raum

01:01:40.690 --> 01:01:42.510
im Laufe des Zeitablaufs wieder sich verändert

01:01:42.510 --> 01:01:44.670
vorstellt. Fünf vielleicht noch, wenn da zwischendurch jemand

01:01:44.670 --> 01:01:46.330
den Vorhang aufmacht und reinguckt und sagt Hallo

01:01:46.330 --> 01:01:48.190
und dann da so einen Tunnel durchmacht, aber

01:01:48.190 --> 01:01:50.370
sechs, sieben, acht, ah.

01:01:51.070 --> 01:01:52.890
Ja, aber es ist ja...

01:01:52.890 --> 01:01:54.850
sich vorzustellen, dass, also sich

01:01:54.850 --> 01:01:56.930
einen Text als Vektor

01:01:56.930 --> 01:01:58.910
hinzuschreiben, das kann man sich ja angucken, das ist

01:01:58.910 --> 01:02:00.870
nicht so schlimm. Ja, aber dann macht man das ja flach,

01:02:01.030 --> 01:02:02.870
dann ist die Betrachtung, macht man den dann irgendwie

01:02:02.870 --> 01:02:04.630
auf so ein Blatt Papier?

01:02:05.050 --> 01:02:06.890
Ja, also das, was man dann tatsächlich macht,

01:02:06.970 --> 01:02:08.890
also wenn man sich das jetzt erzählt, dann klingt das irgendwie

01:02:08.890 --> 01:02:10.810
kompliziert, aber es ist eigentlich total

01:02:10.810 --> 01:02:12.790
simpel. Man macht eigentlich nur Spalten auf

01:02:12.790 --> 01:02:14.610
von einer Zeile. Genau, also

01:02:14.610 --> 01:02:16.870
wenn man das jetzt geometrisch interpretieren wollte,

01:02:16.970 --> 01:02:18.990
ist das, wenn ich jetzt zum Beispiel

01:02:18.990 --> 01:02:21.270
Vektoren,

01:02:21.450 --> 01:02:23.030
Also einmal habe ich halt da Werte drinstehen,

01:02:23.170 --> 01:02:24.050
nicht nur Einsen und Nullen.

01:02:24.510 --> 01:02:26.070
Und diese Werte, diese Gewichte sind halt

01:02:26.070 --> 01:02:28.950
Term Frequency mal Inverse Document Frequency,

01:02:29.170 --> 01:02:30.670
sozusagen wie wichtig ist dieses Wort

01:02:30.670 --> 01:02:32.370
üblicherweise in Texten.

01:02:32.490 --> 01:02:34.210
Also ist das eher charakteristisch für bestimmte Sachen

01:02:34.210 --> 01:02:35.250
oder eher nicht so charakteristisch?

01:02:36.690 --> 01:02:38.210
Wörter wie der, die das wären halt

01:02:38.210 --> 01:02:40.170
üblicherweise nicht, bekommen kein hohes Gewicht.

01:02:40.170 --> 01:02:42.450
Ja, kann man entweder rausfiltern

01:02:42.450 --> 01:02:44.210
oder es ist halt, weil die sind einfach

01:02:44.210 --> 01:02:46.250
nicht, daraus kann ich jetzt

01:02:46.250 --> 01:02:47.790
nicht schließen, ob das Spam oder nicht Spam war.

01:02:48.130 --> 01:02:50.170
Während eben sowas wie Viagra oder das Penis

01:02:50.170 --> 01:02:51.270
oder was auch immer, das ist wahrscheinlich

01:02:51.270 --> 01:02:53.230
oder das ist

01:02:53.230 --> 01:02:54.870
deutlich charakteristischer, die werden bekommen

01:02:54.870 --> 01:02:56.710
ein höheres Gewicht und

01:02:56.710 --> 01:02:59.290
man guckt sich halt immer die Winkel zwischen Dingen an

01:02:59.290 --> 01:03:01.410
in diesen

01:03:01.410 --> 01:03:03.210
Vektorräumen und die kann man

01:03:03.210 --> 01:03:05.290
einfach ausrechnen, indem man halt Sachen, das Skalarprodukt

01:03:05.290 --> 01:03:06.350
bildet zwischen

01:03:06.350 --> 01:03:09.190
und das auch wieder bei

01:03:09.190 --> 01:03:10.770
Phasenvektoren super einfach, weil

01:03:10.770 --> 01:03:13.270
da man muss nur, die sind ja überall null

01:03:13.270 --> 01:03:15.130
nur an bestimmten Stellen nicht und man muss nur

01:03:15.130 --> 01:03:17.090
diese Stellen sich angucken, was dann halt auch wieder sehr schnell geht

01:03:17.090 --> 01:03:19.330
also was man dann letztendlich

01:03:19.330 --> 01:03:21.270
macht, ist total simpel, aber es klingt

01:03:21.270 --> 01:03:23.210
irgendwie, oh, Winkel

01:03:23.210 --> 01:03:25.170
in einem

01:03:25.170 --> 01:03:27.150
hunderttausenddimensionalen Raum.

01:03:27.450 --> 01:03:29.090
Krass. Klingt irgendwie voll

01:03:29.090 --> 01:03:31.410
voll abgefahren. Ist aber eigentlich

01:03:31.410 --> 01:03:33.230
total einfach. Also, wenn man sich jetzt

01:03:33.230 --> 01:03:34.110
anguckt, was wirklich passiert.

01:03:37.470 --> 01:03:39.270
Also, da ist nichts Wildes dabei. Das, was

01:03:39.270 --> 01:03:41.250
aber jetzt die Sofort-Vektormaschine macht an der Stelle, ist

01:03:41.250 --> 01:03:43.250
halt, wenn man sich jetzt diese Vektoren anguckt und man

01:03:43.250 --> 01:03:45.350
hat jetzt sozusagen die Wolken an Punkten

01:03:45.350 --> 01:03:46.390
irgendwie in diesem Raum.

01:03:47.050 --> 01:03:49.170
Das eine spammen, das andere nicht spammen und dann versucht

01:03:49.170 --> 01:03:50.670
die Support-Vector-Maschine eine

01:03:50.670 --> 01:03:52.790
Ebene so zwischen diese

01:03:52.790 --> 01:03:54.570
unterteilende, also

01:03:54.570 --> 01:03:56.930
eine separierende Hyper-Ebene so zwischen

01:03:56.930 --> 01:03:59.090
diese beiden Klassen

01:03:59.090 --> 01:04:00.550
zu legen, dass der Abstand

01:04:00.550 --> 01:04:02.090
maximal wird zu beiden.

01:04:03.650 --> 01:04:04.870
So ein bisschen wie bei

01:04:04.870 --> 01:04:06.950
OLS, Optimal

01:04:06.950 --> 01:04:08.150
Linear Squares.

01:04:10.710 --> 01:04:11.270
Ja.

01:04:12.090 --> 01:04:12.990
Du meinst

01:04:12.990 --> 01:04:14.690
Ordinary Lease Squares?

01:04:15.610 --> 01:04:16.850
Ordinary ist ein bisschen noch anders, ja.

01:04:17.770 --> 01:04:19.030
Ist noch ein bisschen, also

01:04:19.030 --> 01:04:20.970
naja, das ist nicht so ganz das Gleiche.

01:04:21.770 --> 01:04:23.030
Also es ist tatsächlich das Modell, also

01:04:23.030 --> 01:04:23.670
die

01:04:23.670 --> 01:04:26.990
Verlustsummen ist anders

01:04:26.990 --> 01:04:29.370
und das Modell ist auch anders, aber

01:04:29.370 --> 01:04:31.330
weil also das Modell, was

01:04:31.330 --> 01:04:33.170
bei der Support-Factor-Maschine, obwohl

01:04:33.170 --> 01:04:35.610
naja, es ist auch ein lineares Modell, also insofern ist es

01:04:35.610 --> 01:04:37.030
ja,

01:04:38.110 --> 01:04:39.550
also es gibt zwischen all diesen linearen

01:04:39.550 --> 01:04:41.350
Modellen natürlich irgendwelche Verbindungen, aber

01:04:41.350 --> 01:04:41.690
ja,

01:04:42.050 --> 01:04:45.350
also aber dieses Markenmodell

01:04:45.350 --> 01:04:47.170
diese Margin-Maximierung

01:04:47.170 --> 01:04:48.710
ist schon charakteristisch für

01:04:48.710 --> 01:04:51.070
Support-Vector-Maschinen, beziehungsweise die Dinger werden halt auch

01:04:51.070 --> 01:04:52.530
Maximum-Margin-Classifier genannt.

01:04:53.190 --> 01:04:54.350
Und es gibt halt einen schönen Beweis, der sagt,

01:04:54.950 --> 01:04:57.390
ja, Margin-Maximierung

01:04:57.390 --> 01:04:58.970
ist halt auch, bedeutet

01:04:58.970 --> 01:05:00.610
Maximierung

01:05:00.610 --> 01:05:02.830
der Generalisierung

01:05:02.830 --> 01:05:05.150
beim Lernen. Und das ist natürlich auch

01:05:05.150 --> 01:05:06.790
eine sehr schöne Geschichte. Man kann es leider

01:05:06.790 --> 01:05:08.650
aus diversen technischen Gründen nicht so,

01:05:08.890 --> 01:05:10.110
also funktioniert es dann doch nicht.

01:05:11.550 --> 01:05:11.870
Das

01:05:11.870 --> 01:05:14.890
Problem ist vielleicht, dass man sich,

01:05:15.130 --> 01:05:16.930
wenn man sich an allen Punkten

01:05:16.930 --> 01:05:19.090
orientiert, so ein bisschen auch an den

01:05:19.090 --> 01:05:20.930
Extremwerten zu sehr an Langhallen

01:05:20.930 --> 01:05:23.130
und wenn man sich mehr an dem Durchschnitt der Werte orientieren

01:05:23.130 --> 01:05:25.090
würde und da die Ebenen bildet, wäre

01:05:25.090 --> 01:05:26.990
die vielleicht ein bisschen präziser, also vielleicht kann man die

01:05:26.990 --> 01:05:28.930
Güte erhöhen, indem man so ein bisschen diese Randwerte

01:05:28.930 --> 01:05:30.550
so außen vor lässt.

01:05:31.190 --> 01:05:32.750
Ja, man rechnet halt eine

01:05:32.750 --> 01:05:34.910
Verlustfunktion aus, das kann man ja einfach machen,

01:05:35.030 --> 01:05:36.970
die sozusagen, und

01:05:36.970 --> 01:05:38.870
das SVM ist halt

01:05:38.870 --> 01:05:40.810
sozusagen ein konvexes, also das ist halt

01:05:40.810 --> 01:05:42.770
ein konvexes Optimierungsproblem im Grunde und

01:05:42.770 --> 01:05:45.270
das Optimierungsverfahren

01:05:45.270 --> 01:05:47.110
innerhalb von der

01:05:47.110 --> 01:05:47.890
SVM löst das.

01:05:49.230 --> 01:05:50.370
Das ist halt das, was passiert.

01:05:51.270 --> 01:05:52.730
Und am Schluss kommt halt das

01:05:52.730 --> 01:05:55.090
Ding raus, was tatsächlich irgendwie

01:05:55.090 --> 01:05:57.050
diese beiden Teile trennt.

01:05:57.190 --> 01:05:59.110
Und zwar, dass den größten,

01:05:59.390 --> 01:06:00.990
die Hyper-Ebene hat den größtmöglichen Abstand

01:06:00.990 --> 01:06:02.930
zwischen diesen beiden. Ja, ich glaube, da kann man

01:06:02.930 --> 01:06:05.010
vielleicht noch ein bisschen was dran drehen, indem man so diese Grundgesamtheit

01:06:05.010 --> 01:06:06.850
so ein bisschen manipuliert. Aber ja.

01:06:07.430 --> 01:06:08.850
Aber sagen wir so, das

01:06:08.850 --> 01:06:10.430
funktioniert halt, das funktioniert sehr gut.

01:06:10.950 --> 01:06:12.570
Es ist halt auch so, irgendwie in diesem

01:06:12.570 --> 01:06:14.610
hochdimensionalen, da ist viel Platz, geht auch

01:06:14.610 --> 01:06:16.890
deswegen funktionieren lineare Modelle da so sehr schön,

01:06:16.990 --> 01:06:18.450
weil man kann die halt da so durchlegen.

01:06:19.510 --> 01:06:20.750
Wenn das weniger dimensional wird,

01:06:20.830 --> 01:06:22.690
dann geht das halt linear nicht mehr, dann muss das alles

01:06:22.690 --> 01:06:24.230
irgendwie gewogen sein, aber das wird alles viel schwieriger.

01:06:24.270 --> 01:06:26.650
Und es könnte sein, dass wenn man auf einmal ganz viele komische Werte bekommt,

01:06:26.710 --> 01:06:28.630
dass man irgendwie so ein Klassifizierungsproblem hat, weil man irgendwie

01:06:28.630 --> 01:06:30.850
vielleicht noch eine Klasse hat, die man übersehen hat oder sowas.

01:06:32.010 --> 01:06:32.690
Gut, klar.

01:06:32.690 --> 01:06:34.430
Natürlich, das kann auch immer sein.

01:06:36.750 --> 01:06:38.290
Genau, aber eigentlich ist das auch, also

01:06:38.290 --> 01:06:40.590
Support-Effekte-Maschinen, schöne Geschichte, aber

01:06:40.590 --> 01:06:42.610
das eigentliche Ding, warum ich das jetzt auch hier verwendet

01:06:42.610 --> 01:06:43.470
habe, ist, dass die halt

01:06:43.470 --> 01:06:46.610
für eben Textklassifikationen super

01:06:46.610 --> 01:06:48.510
funktioniert haben. Da gab es halt eben bekannte

01:06:48.510 --> 01:06:50.730
Arbeit von

01:06:50.730 --> 01:06:52.470
Thorsten Jochim zu 1997 drüber

01:06:52.470 --> 01:06:54.410
und seitdem habe ich jedenfalls

01:06:54.410 --> 01:06:56.190
nicht wirklich substanzielle

01:06:56.190 --> 01:06:58.290
Fortschritte gesehen. Also

01:06:58.290 --> 01:07:00.110
gut, doch. Also wenn man sagt,

01:07:00.350 --> 01:07:02.530
Word-Embeddings sind halt nochmal ein ordentlicher

01:07:02.530 --> 01:07:04.630
Fortschritt gewesen, aber das ist ja im Grunde nur eine andere

01:07:04.630 --> 01:07:06.390
Art, irgendwie Texte darzustellen.

01:07:06.510 --> 01:07:08.570
Das ist halt schon besser als Back of Words, aber

01:07:08.570 --> 01:07:12.770
wird dann halt auch nochmal

01:07:12.770 --> 01:07:14.790
irgendwie ein bisschen besser. Aber es ist

01:07:14.790 --> 01:07:16.710
halt, es wird auch durchgehend über alle

01:07:16.710 --> 01:07:18.550
Datasets und so besser, aber es ist halt jetzt nicht so,

01:07:18.790 --> 01:07:20.750
dass man sagt, okay, das ist jetzt eine ganz andere Kategorie

01:07:20.750 --> 01:07:21.810
von gut, plötzlich.

01:07:23.130 --> 01:07:24.690
Es ist halt, also

01:07:24.690 --> 01:07:26.650
wenn man jetzt TF-IDF-Gewichte nimmt, statt

01:07:26.650 --> 01:07:28.670
binäre, einfach nur 1 zu 0, wird es auch ein bisschen

01:07:28.670 --> 01:07:30.690
besser. Und der Vorteil von

01:07:30.690 --> 01:07:32.650
Word-Ambeddings ist vielleicht noch sogar ein bisschen mehr,

01:07:32.650 --> 01:07:34.690
aber so in der gleichen Größenordnung

01:07:34.690 --> 01:07:36.670
wie von binären Gewichten zu TF-IDF zu

01:07:36.670 --> 01:07:38.170
gehen. Du musst ja einmal noch mal sagen, was

01:07:38.170 --> 01:07:40.290
EDF ist. Ja, genau. Das ist halt eben

01:07:40.290 --> 01:07:42.650
wie charakteristisch ist ein Wort

01:07:42.650 --> 01:07:44.790
eigentlich sozusagen. Für die Kategorie.

01:07:44.970 --> 01:07:46.630
Ja, genau. Kann man sich halt

01:07:46.630 --> 01:07:48.530
auch ausrechnen. Darf man natürlich noch auf den Trainingsabend machen,

01:07:48.710 --> 01:07:50.570
aber genau. Und

01:07:50.570 --> 01:07:53.250
ja,

01:07:54.170 --> 01:07:56.470
Word-Embeddings sind halt auch nochmal so eine Geschichte.

01:07:56.570 --> 01:07:57.450
Müsste ich jetzt eigentlich auch nochmal erklären.

01:07:58.250 --> 01:07:59.470
Ist halt eine andere Art,

01:08:00.330 --> 01:08:01.750
sozusagen Wörter in einen

01:08:01.750 --> 01:08:04.510
höherdimensionalen Vektorraum abzubilden.

01:08:04.890 --> 01:08:06.510
Und da ist es dann halt nicht mehr so, dass es sozusagen

01:08:06.510 --> 01:08:08.670
pro Wort eine Dimension gibt, sondern es gibt

01:08:08.670 --> 01:08:10.890
halt einen 300-dimensionalen

01:08:10.890 --> 01:08:12.270
Vektorraum oder was auch immer, ich weiß nicht,

01:08:12.350 --> 01:08:14.690
kann man sich aussuchen, wie viele Dimensionen man

01:08:14.690 --> 01:08:16.670
verwenden möchte und jedes Wort ist dann halt

01:08:16.670 --> 01:08:18.770
ein Vektor da drin, sodass man halt

01:08:18.770 --> 01:08:20.650
auch abbilden kann, dass Worte oft nicht

01:08:20.650 --> 01:08:22.550
nur sozusagen ein Ding

01:08:22.550 --> 01:08:24.610
beschreiben oder für einen, sondern die haben

01:08:24.610 --> 01:08:26.570
halt Anteile da und Anteile da und

01:08:26.570 --> 01:08:28.830
man kann damit dann quasi sozusagen

01:08:28.830 --> 01:08:30.730
gewisserweise auch die Bedeutung so ein bisschen

01:08:30.730 --> 01:08:32.450
besser mit abbilden.

01:08:32.570 --> 01:08:33.270
Hier ist dein Schild.

01:08:34.170 --> 01:08:34.410
Ja,

01:08:34.570 --> 01:08:37.170
und das funktioniert

01:08:37.170 --> 01:08:39.030
sehr gut und das hat halt nochmal irgendwie

01:08:39.030 --> 01:08:41.290
Arbeit mit Text irgendwie genauer gemacht, aber

01:08:41.290 --> 01:08:42.490
so ein bisschen,

01:08:42.770 --> 01:08:45.150
aber dass es wirklich

01:08:45.150 --> 01:08:47.230
da jetzt substanzielle Verbesserungen gegeben hätte,

01:08:47.430 --> 01:08:49.150
habe ich jetzt also seit

01:08:49.150 --> 01:08:51.270
97 schon eine Weile her. Ist schon relativ

01:08:51.270 --> 01:08:52.930
lange her und ist eigentlich nicht so,

01:08:53.190 --> 01:08:54.850
oder ich habe irgendwas übersehen, das kann natürlich auch sein, aber

01:08:54.850 --> 01:08:56.730
ich meine, nee, da ist nicht so wahnsinnig viel passiert.

01:08:56.730 --> 01:08:57.930
Falls wir was übersehen haben, bitte schicken.

01:08:59.650 --> 01:09:01.270
Bis vor kurzem und

01:09:01.270 --> 01:09:03.270
ja,

01:09:03.370 --> 01:09:04.370
das ist vielleicht auch noch

01:09:04.370 --> 01:09:06.930
eine ganz interessante, das möchte ich

01:09:06.930 --> 01:09:08.070
unbedingt mal selber ausprobieren,

01:09:08.550 --> 01:09:10.350
wir haben ja mit

01:09:10.350 --> 01:09:12.970
Nico da diese

01:09:12.970 --> 01:09:15.370
Episode zu Textklassifikation

01:09:15.370 --> 01:09:17.210
gemacht und der hat

01:09:17.210 --> 01:09:18.970
jetzt in seinem Podcast

01:09:18.970 --> 01:09:21.170
Techtiefen auch

01:09:21.170 --> 01:09:22.550
so eine Miniserie zu

01:09:22.550 --> 01:09:24.950
Natural Language Processing gemacht

01:09:24.950 --> 01:09:26.670
und da

01:09:26.670 --> 01:09:29.010
fand ich einige Sendungen sehr gut,

01:09:30.330 --> 01:09:31.190
unter anderem

01:09:31.190 --> 01:09:32.150
die, wo er

01:09:32.150 --> 01:09:34.150
über diese neuen

01:09:34.150 --> 01:09:36.770
Modelle spricht

01:09:36.770 --> 01:09:37.410
irgendwie.

01:09:38.290 --> 01:09:41.050
Und halt auch

01:09:41.050 --> 01:09:42.850
die Folge bei Spacey fand ich

01:09:42.850 --> 01:09:43.110
sehr gut.

01:09:44.810 --> 01:09:46.950
Spacey ist halt so eine Open-Source-Bibliothek

01:09:46.950 --> 01:09:48.530
für NLP-Geschichten,

01:09:48.990 --> 01:09:50.730
aber halt ein bisschen mehr fokussiert

01:09:50.730 --> 01:09:52.450
auf Produktionssachen als jetzt

01:09:52.450 --> 01:09:54.470
zum Beispiel NLTK. Ist halt eher so Forschungsgeschichten.

01:09:54.770 --> 01:09:56.450
Super langsam. Habe ich früher mal versucht zu verwenden.

01:09:57.510 --> 01:09:58.670
Also gibt

01:09:58.670 --> 01:10:00.610
sicher Berechtigung, das zu verwenden, aber wenn man

01:10:00.610 --> 01:10:02.130
jetzt produktiv irgendwas machen möchte, dafür

01:10:02.130 --> 01:10:04.190
geht es oft nicht gut, weil es halt

01:10:04.190 --> 01:10:06.090
nicht darauf optimiert ist, das schnell zu sein.

01:10:06.250 --> 01:10:07.790
Ich habe in NLTK mal ein paar Endgramme über

01:10:07.790 --> 01:10:10.230
Harry Potter mit ein paar Kindern, die haben das sehr gefreut.

01:10:10.330 --> 01:10:12.010
Das geht bestimmt alles super, aber wenn

01:10:12.010 --> 01:10:14.010
jetzt irgendwie, ja, weiß ich nicht, wenn

01:10:14.010 --> 01:10:16.050
ein Geschäft darin besteht, Sachen zu klassifizieren oder so

01:10:16.050 --> 01:10:18.330
oder schnell zu sein, dann ist NLTK

01:10:18.330 --> 01:10:20.110
vielleicht nicht so die Wahl, aber Spacey wäre es.

01:10:20.490 --> 01:10:22.110
Also da, die Geschichten

01:10:22.110 --> 01:10:24.010
da sind optimiert, ist es nicht so, dass es

01:10:24.010 --> 01:10:25.990
einfach ein Toolkit ist mit allen möglichen Dingen, die man halt

01:10:25.990 --> 01:10:26.630
verwenden kann, sondern

01:10:26.630 --> 01:10:30.130
die implementieren dann halt

01:10:30.130 --> 01:10:31.830
die Sachen, die am besten funktionieren, auch in schnell

01:10:31.830 --> 01:10:33.610
und die kann man dann sozusagen verwenden.

01:10:35.690 --> 01:10:35.950
Und

01:10:35.950 --> 01:10:37.870
ja,

01:10:37.970 --> 01:10:39.650
das ist sowieso interessant, was in dem Bereich alles passiert,

01:10:39.890 --> 01:10:41.670
aber was jetzt in letzter Zeit

01:10:41.670 --> 01:10:42.810
tatsächlich

01:10:42.810 --> 01:10:45.790
da passiert, ist so etwas

01:10:45.790 --> 01:10:47.630
Ähnliches wie bei ImageNet.

01:10:48.670 --> 01:10:49.730
Da gab es ja auch

01:10:49.730 --> 01:10:51.370
irgendwie mit Deep Learning halt so eine

01:10:51.370 --> 01:10:53.850
ImageNet kennt ihr noch?

01:10:54.070 --> 01:10:55.550
Ja. Hatten wir auch schon mal vorgestellt.

01:10:56.070 --> 01:10:57.930
Das heißt, da gibt es ja diese

01:10:57.930 --> 01:11:00.330
darauf basierende,

01:11:00.330 --> 01:11:01.950
also auf dem ImageNet-Dataset basiert,

01:11:02.030 --> 01:11:04.170
so eine Challenge,

01:11:04.730 --> 01:11:05.890
wie heißt dieser Wettbewerb noch?

01:11:06.110 --> 01:11:08.050
Very Large Data, bla, irgendwie Image,

01:11:08.490 --> 01:11:09.710
ich weiß nicht mehr genau,

01:11:10.390 --> 01:11:11.950
hatten wir auch überwacht, erwähnt.

01:11:13.610 --> 01:11:15.170
Das Ding läuft irgendwie jedes Jahr

01:11:15.170 --> 01:11:19.170
und 2011 haben ja Leute da irgendwie angefangen,

01:11:19.250 --> 01:11:21.110
sich wirklich damit mal zu beschäftigen,

01:11:21.290 --> 01:11:23.390
so wie man das dann mit Bildklassifikationen kriegt.

01:11:23.750 --> 01:11:27.370
Und 2013 hat AlexNet irgendwie dann diese Challenge gewonnen

01:11:27.370 --> 01:11:29.050
und zwar mit großem Abstand,

01:11:29.050 --> 01:11:31.070
so irgendwie Reduktion des Fehlers

01:11:31.070 --> 01:11:33.070
um die Hälfte oder sowas und ist in Regionen

01:11:33.070 --> 01:11:34.970
vorgestoßen, wo man vorher gedacht hatte,

01:11:35.070 --> 01:11:35.930
da kommt man gar nicht hin und so.

01:11:36.870 --> 01:11:39.010
Und ja, also da ist etwas passiert,

01:11:39.150 --> 01:11:41.010
was halt irgendwie, ja, und

01:11:41.010 --> 01:11:42.970
dann Jahr für Jahr danach ist es

01:11:42.970 --> 01:11:45.130
immer besser geworden. Und also 2013

01:11:45.130 --> 01:11:46.930
ist halt

01:11:46.930 --> 01:11:49.110
substanziell

01:11:49.110 --> 01:11:50.570
der Fehler irgendwie runtergegangen.

01:11:51.130 --> 01:11:52.910
Dann 2014 nochmal, 2005 nochmal,

01:11:53.050 --> 01:11:54.990
nach 2016 irgendwie oder so

01:11:54.990 --> 01:11:56.830
glaube ich, sind die Modelle irgendwie bei Superhuman

01:11:56.830 --> 01:11:58.890
Performance, also machen weniger

01:11:58.890 --> 01:12:00.530
Fehler als Menschen beim Labeln.

01:12:01.470 --> 01:12:02.710
Mittlerweile, glaube ich, machen

01:12:02.710 --> 01:12:04.850
die Modelle, die besten Modelle jetzt

01:12:04.850 --> 01:12:06.870
machen so, die machen einen Fehler,

01:12:06.990 --> 01:12:08.930
der ist halb so groß, wie der den Menschen machen.

01:12:09.130 --> 01:12:10.130
Und das bei so Tasks wie,

01:12:10.770 --> 01:12:12.550
ja, ist da eine Katze

01:12:12.550 --> 01:12:14.750
auf dem Bild oder so, wo man sich denkt,

01:12:14.830 --> 01:12:17.030
das ist, also, ja klar, das sollte man ja können.

01:12:17.850 --> 01:12:18.770
Gut, also, ich meine,

01:12:18.830 --> 01:12:20.790
da sind auch fiese Bilder dabei, sowas wie unterschiedliche

01:12:20.790 --> 01:12:23.030
Hunderassen und sowas. Man sieht nur so ein Hinterteil

01:12:23.030 --> 01:12:24.870
mit so einem Schwanz und weiß dann nicht, ist das eine Katze oder so

01:12:24.870 --> 01:12:26.590
irgendwas. Ja, aber das ist halt

01:12:26.590 --> 01:12:28.510
irgendwie, dass man da Modelle hat, die bei

01:12:28.510 --> 01:12:30.330
so einem Ding, wo man denkt, da ja gut, also

01:12:30.330 --> 01:12:32.510
da ist ein Mensch schon nicht so

01:12:32.510 --> 01:12:32.890
schlecht drin,

01:12:34.070 --> 01:12:36.410
dass die da deutlich besser sind, das ist

01:12:36.410 --> 01:12:38.590
beeindruckend. Und zwar ist das

01:12:38.590 --> 01:12:39.750
halt in sehr kurzer Zeit passiert.

01:12:40.310 --> 01:12:42.510
Das ist ja auch sehr beeindruckend. Also da ist irgendwas passiert, was

01:12:42.510 --> 01:12:44.250
halt das ganze Feld

01:12:44.250 --> 01:12:46.030
sozusagen sehr stark in Bewegung gesetzt hat.

01:12:46.550 --> 01:12:48.450
Und so etwas ähnliches sehen wir jetzt gerade bei NLP-Geschichten

01:12:48.450 --> 01:12:49.990
halt auch. Das war mir jetzt

01:12:49.990 --> 01:12:52.590
bis vor eben kurz noch gar nicht so richtig klar,

01:12:52.990 --> 01:12:53.890
dass das gerade passiert.

01:12:55.210 --> 01:12:55.570
Deutsch.

01:12:56.590 --> 01:13:00.290
Ja, Deutsch ist halt immer ein bisschen doof.

01:13:00.730 --> 01:13:02.890
Das ist eine Sprache, für die sich irgendwie niemand so richtig interessiert.

01:13:04.730 --> 01:13:08.590
Also, ja, aber da gibt es wohl auch jemanden,

01:13:08.710 --> 01:13:11.830
es gibt halt diese großen Sprachmodelle,

01:13:12.090 --> 01:13:16.090
irgendwie BERT, irgendwie XLNET, TPT2.

01:13:17.110 --> 01:13:17.510
BERT.

01:13:18.330 --> 01:13:20.030
Ja, wir werden in Sesamstraße, wie war das?

01:13:20.310 --> 01:13:21.670
In Muppet Show, glaube ich, oder?

01:13:21.890 --> 01:13:22.210
Muppet Show.

01:13:22.230 --> 01:13:23.290
Oder Sesamstraße, ich weiß nicht.

01:13:26.430 --> 01:13:32.490
Und da werden halt so große Transformer-Modelle trainiert.

01:13:33.590 --> 01:13:37.090
Und der Witz daran ist, ich habe das schon mitgekriegt, dass das passiert.

01:13:37.210 --> 01:13:39.430
Und ich dachte mir so, warum trainiert man dann so riesige Modelle, was soll denn das?

01:13:39.870 --> 01:13:47.790
Also man ist auch sehr teuer und auch verbreitet unfassbar viel Energie und Taktzyklen und so.

01:13:48.130 --> 01:13:49.170
Warum macht man das denn?

01:13:49.270 --> 01:13:52.510
Jetzt um ein bisschen besser vorherzusagen, was das nächste Wort im Satz ist.

01:13:53.150 --> 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:57.790 --> 01:14:01.870
Und dann ist es aber genau wie bei ImageNet, bei ImageNet ist es ja auch so,

01:14:02.010 --> 01:14:07.190
dass dadurch, dass es vortrainierte Modelle gibt, die sozusagen ein gutes Verständnis davon haben,

01:14:07.270 --> 01:14:11.890
wie unsere visuelle Welt halt so aussieht, kann man die auf neue Probleme sehr gut anpassen.

01:14:11.890 --> 01:14:15.790
Dann nimmt man halt irgendwas, wo man jetzt nur wenige Trainingsbeispiele hat

01:14:15.790 --> 01:14:20.170
und feintunt diese auf ImageNet trainierten Modelle auf dieses Problem

01:14:20.170 --> 01:14:22.610
und kriegt damit Sachen hin, die vorher halt völlig unmöglich wären

01:14:22.610 --> 01:14:24.250
oder wo man halt auch irgendwie

01:14:24.250 --> 01:14:26.150
hunderttausende Trainingsbeispiele gebraucht hätte oder so

01:14:26.150 --> 01:14:28.450
und kann dann halt

01:14:28.450 --> 01:14:30.510
irgendwie in einem konkreten Anwendungsfall halt sehr, sehr

01:14:30.510 --> 01:14:30.970
gut sein.

01:14:33.630 --> 01:14:34.490
Und auch da,

01:14:34.610 --> 01:14:36.610
ich glaube, auch da ist den Leuten noch nicht so richtig bewusst,

01:14:36.810 --> 01:14:38.370
was das eigentlich bedeutet

01:14:38.370 --> 01:14:40.350
und Anwendungen gibt es da auch noch nicht so viele, aber da gibt es

01:14:40.350 --> 01:14:42.350
wahrscheinlich, also da werden wir sehr viele Anwendungen

01:14:42.350 --> 01:14:44.430
sehen, denke ich, dass halt jetzt, also

01:14:44.430 --> 01:14:46.470
ja, eben mein Beispiel dafür war

01:14:46.470 --> 01:14:48.570
halt irgendwie eigentlich, dass irgendwie Flaschen

01:14:48.570 --> 01:14:50.410
Pfandautomaten da so schlecht sind, das muss eigentlich

01:14:50.410 --> 01:14:52.230
nicht sein, das könnte alles viel besser gehen und das

01:14:52.230 --> 01:14:54.550
gilt im Grunde für alle Probleme, wo man

01:14:54.550 --> 01:14:55.550
irgendwie visuell was erkennen

01:14:55.550 --> 01:14:57.570
möchte.

01:14:58.290 --> 01:15:00.170
Das ist theoretisch

01:15:00.170 --> 01:15:02.190
durch. Jetzt muss man es eigentlich nur noch praktisch umsetzen.

01:15:02.770 --> 01:15:04.490
Ja, mir graut schon ein bisschen davon. Ja, dieser Mensch

01:15:04.490 --> 01:15:06.230
darf in die Stadt. Nein, der darf nicht in die Stadt. Ja,

01:15:06.330 --> 01:15:08.450
dieser Mensch darf da und da hin. Ja, leider könnte es auch sein,

01:15:08.510 --> 01:15:10.090
dass er jetzt...

01:15:10.090 --> 01:15:11.430
Ja, es ist...

01:15:11.430 --> 01:15:12.910
Diese Ampel bleibt für dich rot.

01:15:14.430 --> 01:15:14.790
Ja.

01:15:16.610 --> 01:15:18.010
Gibt doch nicht mal die guten Tipps.

01:15:20.850 --> 01:15:23.370
Ja, es ist nicht ganz unproblematisch, das stimmt auch.

01:15:23.650 --> 01:15:26.850
Aber eben, also das ist jetzt auch für Sprache halt so ein bisschen passiert,

01:15:26.990 --> 01:15:30.430
weil man eben, wenn man jetzt so ein Language-Modell trainiert hat

01:15:30.430 --> 01:15:34.230
auf irgendwie großen, weiß ich nicht, auf einem Website-Crawl oder eben Wikipedia,

01:15:34.390 --> 01:15:35.630
man braucht eigentlich noch ein bisschen mehr als Wikipedia,

01:15:36.670 --> 01:15:41.930
dann kann man da unterschiedliche Prediction-Heads draufsetzen

01:15:41.930 --> 01:15:42.810
für unterschiedliche Probleme.

01:15:43.390 --> 01:15:46.810
Und man nimmt halt sozusagen irgendwie, aber es sind halt alles Sprachprobleme,

01:15:46.870 --> 01:15:48.870
also auch so ein Text-Klassifikations-Problem kann man halt nehmen,

01:15:50.190 --> 01:15:52.210
Jagt das halt, benutzt halt zum Beispiel

01:15:52.210 --> 01:15:54.190
BERT, um das halt

01:15:54.190 --> 01:15:54.650
irgendwie

01:15:54.650 --> 01:15:58.150
sozusagen um diese

01:15:58.150 --> 01:16:00.230
Ist das ein Prediction Head?

01:16:00.590 --> 01:16:01.730
Ja, genau. Das ist halt

01:16:01.730 --> 01:16:04.130
im Grunde die

01:16:04.130 --> 01:16:05.890
Dinger übersetzen das ja irgendwie in eine interne

01:16:05.890 --> 01:16:07.890
Repräsentation. Und

01:16:07.890 --> 01:16:10.110
dann übersetzen sie es wieder zurück

01:16:10.110 --> 01:16:12.090
in das, was du haben willst. Und du kannst das

01:16:12.090 --> 01:16:14.050
austauschen. Du kannst halt sagen, okay, ich möchte, dass

01:16:14.050 --> 01:16:16.030
mein Language-Modell mir zum Beispiel Sätze generiert.

01:16:16.330 --> 01:16:18.030
Oder ich möchte, dass es halt Textklassifikationen

01:16:18.030 --> 01:16:19.370
macht. Oder ich möchte, dass es irgendwie

01:16:19.370 --> 01:16:21.330
Named Entity Recognition macht oder

01:16:21.330 --> 01:16:23.370
irgendwas, also sozusagen Namen

01:16:23.370 --> 01:16:25.530
oder Orte findet

01:16:25.530 --> 01:16:27.510
in Texten oder sowas. Klingelt ja direkt die Kasse.

01:16:27.830 --> 01:16:29.690
Oder Fragen beantworten

01:16:29.690 --> 01:16:30.750
kann oder solche Sachen.

01:16:31.710 --> 01:16:33.270
Und du kannst das gleiche

01:16:33.270 --> 01:16:35.370
vortrainierte Modell nehmen für all diese unterschiedlichen

01:16:35.370 --> 01:16:36.410
Tasks.

01:16:37.710 --> 01:16:39.370
Das heißt, du kannst, und die gibt es

01:16:39.370 --> 01:16:41.410
halt auch, du kannst halt, ich weiß nicht

01:16:41.410 --> 01:16:43.310
wie viel Geld Google ausgegeben hat, um BERT zu

01:16:43.310 --> 01:16:45.070
trainieren oder weiß ich nicht, auf jeden Fall eine ganze Menge.

01:16:45.190 --> 01:16:46.190
Das konntest du nicht leisten wahrscheinlich.

01:16:47.870 --> 01:16:49.310
Und du kannst das vortrainierte Modell

01:16:49.310 --> 01:16:51.050
nehmen, passt es auf deinen Task an, wie zum Beispiel

01:16:51.050 --> 01:16:52.910
jetzt irgendwie Text klassifizieren von diesem

01:16:52.910 --> 01:16:54.070
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.830
und kriegst halt deutlich bessere Ergebnisse.

01:16:59.590 --> 01:17:00.730
Toll, klasse. Genau.

01:17:01.270 --> 01:17:03.010
Und das würde ich gerne noch ausprobieren, das habe ich

01:17:03.010 --> 01:17:04.770
jetzt noch nicht geschafft, aber das mache ich bestimmt demnächst irgendwann.

01:17:05.530 --> 01:17:06.950
Und dann, aber es gibt

01:17:06.950 --> 01:17:09.030
schon Papers dazu jetzt. Ist aber auch jetzt im Frühjahr

01:17:09.030 --> 01:17:11.010
erschienen, glaube ich, eins, das ist auch des Reuters-Dataset,

01:17:11.050 --> 01:17:13.310
das wir auch in der Text-Klassifikations-

01:17:13.310 --> 01:17:13.730
Ding

01:17:13.730 --> 01:17:16.750
Episode hatten,

01:17:17.370 --> 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:25.390 --> 01:17:26.710
Also man sollte halt immer mehrere nehmen,

01:17:27.910 --> 01:17:28.910
weil es kann ja auch Zufall sein,

01:17:29.010 --> 01:17:31.350
dass mal irgendwas in einem bestimmten Dataset besser funktioniert.

01:17:32.370 --> 01:17:38.970
Und da waren gegenüber diesen guten Zahlen von 97

01:17:38.970 --> 01:17:42.950
Verbesserungen von so 5% im F1-Wert oder sowas,

01:17:43.150 --> 01:17:44.090
was Wahnsinn ist.

01:17:44.090 --> 01:17:45.930
Also das ist halt richtig, richtig viel.

01:17:46.510 --> 01:17:48.030
das ist halt so klasse von

01:17:48.030 --> 01:17:50.350
irgendwie, also

01:17:50.350 --> 01:17:52.490
in einem Ding, wo man seit 20 Jahren nichts mehr

01:17:52.490 --> 01:17:54.450
gefunden hat, was es irgendwie besser macht, da passiert

01:17:54.450 --> 01:17:56.270
plötzlich so ein Fortschritt, dass es halt, da ist

01:17:56.270 --> 01:17:58.370
irgendwas Fundamentales passiert. Also da

01:17:58.370 --> 01:18:00.510
scheint es so zu sein, zumindest,

01:18:00.930 --> 01:18:02.310
dass man tatsächlich

01:18:02.310 --> 01:18:04.590
mehr Informationen aus der Sprache da rausholen

01:18:04.590 --> 01:18:06.450
kann, als man das bisher konnte

01:18:06.450 --> 01:18:08.430
und das ist natürlich ein Hinweis darauf, dass da noch viel

01:18:08.430 --> 01:18:10.070
und da das jetzt, das sind die ersten Ergebnisse,

01:18:10.310 --> 01:18:12.570
da kann man ja dann noch optimieren,

01:18:12.670 --> 01:18:14.650
das heißt, das wird sehr wahrscheinlich

01:18:14.650 --> 01:18:16.150
noch alles noch viel besser werden und

01:18:16.150 --> 01:18:19.170
also man hat auf jeden Fall jetzt einen Ansatzpunkt, wo man

01:18:19.170 --> 01:18:21.070
wieder einen Hebel reinsetzen kann

01:18:21.070 --> 01:18:21.510
und

01:18:21.510 --> 01:18:24.970
ja, das heißt, wir kriegen jetzt wahrscheinlich

01:18:24.970 --> 01:18:25.850
auch, was

01:18:25.850 --> 01:18:28.890
Probleme angeht, wo man mit Sprache zu tun hat,

01:18:29.210 --> 01:18:30.970
irgendwie deutlich bessere Ergebnisse und das betrifft

01:18:30.970 --> 01:18:32.610
dann eben solche Sachen, eben wie Textklassifikation,

01:18:32.870 --> 01:18:34.850
Spam, nicht Spam, das ist gut, das ist schon gelöst

01:18:34.850 --> 01:18:36.890
irgendwie, aber es ist halt auch so ein Spezialproblem

01:18:36.890 --> 01:18:38.950
und man kann das halt auch mit Spezialgeschichten

01:18:38.950 --> 01:18:41.010
gut anpacken.

01:18:41.650 --> 01:18:42.750
Mir schwant böse, das ist mir schon böse.

01:18:44.150 --> 01:18:45.010
Aber man hat

01:18:45.010 --> 01:18:47.130
diese Probleme ja auch in anderen Bereichen, wo man dann jetzt nicht so viel

01:18:47.130 --> 01:18:48.790
Energie reinstecken möchte, wie es

01:18:48.790 --> 01:18:49.970
nicht ist bei der Erkennung,

01:18:50.750 --> 01:18:53.010
sondern man hat halt ein paar hundert eigene

01:18:53.010 --> 01:18:54.950
Datenpunkte oder so und kriegt dann plötzlich

01:18:54.950 --> 01:18:56.510
Ergebnisse hin, die man

01:18:56.510 --> 01:18:58.910
ansonsten, wo man sonst viel

01:18:58.910 --> 01:19:01.170
Engineering hätte reinstecken müssen oder viel, viel mehr Daten.

01:19:01.610 --> 01:19:02.030
Und das

01:19:02.030 --> 01:19:04.450
ist natürlich schon eine super interessante Geschichte.

01:19:05.290 --> 01:19:05.410
Ja,

01:19:06.870 --> 01:19:08.910
genau. Also da kommen, machen wir auch

01:19:08.910 --> 01:19:10.750
bestimmt noch Sachen zu. Das wird noch cool.

01:19:11.450 --> 01:19:13.010
Ach, das wird auch cool.

01:19:13.010 --> 01:19:14.810
Ich bin schon mal gespannt, weil diese Dinge

01:19:14.810 --> 01:19:16.150
auszuprobieren. Ja, ich hatte da

01:19:16.150 --> 01:19:18.410
einige Horrorgeschichten vielleicht noch, die man jetzt

01:19:18.410 --> 01:19:20.090
daran direkt anschließen kann, weil es gibt ja dann

01:19:20.090 --> 01:19:22.450
die Möglichkeit, ja leider, also auch

01:19:22.450 --> 01:19:24.510
das war ja Stanford irgendwie, ImageNet

01:19:24.510 --> 01:19:26.210
und dann, ich weiß jetzt nicht, wovon das Dings

01:19:26.210 --> 01:19:28.410
Sprachnetz herkam, aber es gibt

01:19:28.410 --> 01:19:30.690
die Player da momentan

01:19:30.690 --> 01:19:32.050
sind Google, Facebook,

01:19:32.650 --> 01:19:34.370
also Facebook ist ExcelNet, Google ist

01:19:34.370 --> 01:19:34.590
Bird,

01:19:37.110 --> 01:19:37.830
dann

01:19:37.830 --> 01:19:40.410
genau, OpenAI hat

01:19:40.410 --> 01:19:42.130
GPT-2 gemacht,

01:19:42.610 --> 01:19:44.150
aber ich weiß nicht so, aber die großen

01:19:44.150 --> 01:19:46.230
habe ich am MIT so eine lustige Sache gesehen,

01:19:46.290 --> 01:19:48.430
die haben etwas an die Gesichtsmuskeln

01:19:48.430 --> 01:19:49.890
angeschlossen, dass dann die

01:19:49.890 --> 01:19:52.230
Bewegung des Gesichtes auf

01:19:52.230 --> 01:19:53.390
deine innere Stimme

01:19:53.390 --> 01:19:56.170
metten kann. Und so könnte man tatsächlich

01:19:56.170 --> 01:19:58.070
dann irgendwie so lesen, was für Sätze diese

01:19:58.070 --> 01:20:00.090
Menschen denn gerade denken, wenn man sie irgendwie

01:20:00.090 --> 01:20:01.750
so mitfilmen würde. Und daraus dann

01:20:01.750 --> 01:20:04.130
solche Sachen zu bauen, ist ein bisschen gruselig.

01:20:05.190 --> 01:20:06.410
Alter Ego heißt das Projekt, glaube ich.

01:20:06.430 --> 01:20:08.030
Ja, aber da bin ich mir sehr skriptisch, wenn Leute

01:20:08.030 --> 01:20:10.050
solche Sachen behaupten. Pettiford-Klinik?

01:20:10.550 --> 01:20:11.930
Ja, ja, nein, aber ich meine

01:20:11.930 --> 01:20:13.970
überhaupt, wenn es darum geht, vorher zu sagen, was

01:20:13.970 --> 01:20:16.250
weil, also da

01:20:16.250 --> 01:20:17.990
geht sozusagen so der

01:20:17.990 --> 01:20:20.290
Internet-Bullshit-Alarm los,

01:20:20.770 --> 01:20:22.790
weil das natürlich etwas ist, was alle super gerne hätten,

01:20:22.930 --> 01:20:24.590
dass sie halt irgendwie Gedanken lesen können.

01:20:25.350 --> 01:20:26.510
Auf der anderen Seite aber

01:20:26.510 --> 01:20:28.790
man, also Menschen nicht gut können.

01:20:29.330 --> 01:20:30.230
Und Menschen sind ziemlich gut.

01:20:30.790 --> 01:20:32.930
Also die Quote,

01:20:33.150 --> 01:20:34.710
zum Beispiel bei erfahrenen Polizisten, die glauben alle,

01:20:34.830 --> 01:20:36.530
die könnten das, aber wenn du das testest,

01:20:37.330 --> 01:20:38.530
also die Studien jedenfalls, gut,

01:20:38.530 --> 01:20:40.490
ich bin ja jetzt auch kein Experte dafür, aber ich habe da

01:20:40.490 --> 01:20:42.450
auch so Sachen gesehen, wo halt die Quote von

01:20:42.450 --> 01:20:44.410
guten Polizisten

01:20:44.410 --> 01:20:46.650
irgendwie Lügner zu erkennen

01:20:46.650 --> 01:20:48.370
in Verhören ist so knapp über

01:20:48.370 --> 01:20:50.050
50 Prozent. Also wenn die eigentlich wahrscheinlich

01:20:50.050 --> 01:20:52.590
gute Polizisten sind. Ich weiß es nicht so genau,

01:20:52.770 --> 01:20:54.430
aber... Und wenn die das schon nicht können, ja, wie soll

01:20:54.430 --> 01:20:56.290
das ein Modell hinkriegen? Ja, aber die haben halt so ein Ding

01:20:56.290 --> 01:20:58.530
auf dem Gesicht, ne? Also das ist sehr interessant, guck dir das mal an.

01:20:58.650 --> 01:21:00.230
Alter Ego heißt das mit MIT-Projekten.

01:21:00.250 --> 01:21:02.650
Okay, muss ich mir mal anschauen.

01:21:02.650 --> 01:21:03.970
Ja. Das ist wirklich spannend.

01:21:05.070 --> 01:21:06.310
Ja, also ich glaube, wir waren fast am Ende

01:21:06.310 --> 01:21:08.210
mit den Classify, aber du hast noch eine Sache, hast du noch

01:21:08.210 --> 01:21:10.290
gebaut, du hast noch eine andere, nach

01:21:10.290 --> 01:21:11.330
der Vektormaschine, was

01:21:11.330 --> 01:21:13.150
anderes getestet.

01:21:13.170 --> 01:21:13.930
Das war Spacey.

01:21:14.630 --> 01:21:17.190
Das war so ein neuronales Netz.

01:21:18.730 --> 01:21:19.490
Also es ist tatsächlich

01:21:19.490 --> 01:21:21.330
ein bisschen besser als NaiveBase. Es ist ein bisschen schlechter

01:21:21.330 --> 01:21:23.830
als die lineare Support-Vector-Maschine

01:21:23.830 --> 01:21:25.590
und verbraucht

01:21:25.590 --> 01:21:26.730
aber wahnsinnig viel mehr

01:21:26.730 --> 01:21:28.630
Rechenleistung natürlich.

01:21:29.390 --> 01:21:30.870
Macht ja natürlich auch viel kompliziertere Sachen.

01:21:31.270 --> 01:21:32.390
Aber das ist halt auch so ein Ding.

01:21:32.690 --> 01:21:35.370
Wenn die Daten das halt nicht hergeben und an der Stelle tun sie es

01:21:35.370 --> 01:21:36.810
wahrscheinlich nicht, dann nützt einem das halt nichts.

01:21:37.350 --> 01:21:39.570
Sondern man braucht halt dann auch entsprechende Trainingsdaten,

01:21:39.810 --> 01:21:41.250
um halt diese ganzen Parameter,

01:21:41.330 --> 01:21:43.190
diesen Modell halt auch ordentlich zu fitten oder so.

01:21:43.490 --> 01:21:45.270
Aber ich könnte mir halt, also was mich jetzt interessieren würde,

01:21:45.370 --> 01:21:46.790
ist, was ist denn jetzt, wenn ich

01:21:46.790 --> 01:21:49.470
jetzt so ein vortrainiertes

01:21:49.470 --> 01:21:51.250
Language-Modell nehme und dann nochmal

01:21:51.250 --> 01:21:53.330
gucke, vielleicht

01:21:53.330 --> 01:21:55.150
wird das dann nochmal deutlich besser. Wobei mit dem

01:21:55.150 --> 01:21:56.230
Dataset, naja.

01:21:56.950 --> 01:21:57.310
Aber

01:21:57.310 --> 01:22:01.370
das zeigt halt

01:22:01.370 --> 01:22:02.990
zum Beispiel auch, finde ich, dass wenn man jetzt,

01:22:03.210 --> 01:22:04.930
also Spacey gilt so als

01:22:04.930 --> 01:22:07.150
State-of-the-Art und ich finde, das ist ja auch gut

01:22:07.150 --> 01:22:09.030
und so. Und wenn man das jetzt aber so

01:22:09.030 --> 01:22:11.050
naiv benutzt für so ein Problem, wo man jetzt

01:22:11.050 --> 01:22:13.050
halt irgendwie selber nicht so

01:22:13.050 --> 01:22:14.110
viele Daten hat,

01:22:15.310 --> 01:22:17.130
dann, also

01:22:17.130 --> 01:22:18.790
ich würde sagen, da jetzt einfach so naiv

01:22:18.790 --> 01:22:20.970
Spacey genommen zu haben, wäre wahrscheinlich nicht unbedingt der richtige Weg

01:22:20.970 --> 01:22:21.550
gewesen, sondern

01:22:21.550 --> 01:22:24.890
ja. Lieber naiv Base.

01:22:24.950 --> 01:22:26.770
Man muss manchmal so Dinge ausprobieren und manchmal

01:22:26.770 --> 01:22:28.930
und es ist oft, zumindest um eine

01:22:28.930 --> 01:22:30.950
Baseline zu haben, eine sehr sinnvolle

01:22:30.950 --> 01:22:33.010
Sache, ein ganz einfaches Verfahren, was man gut versteht,

01:22:34.150 --> 01:22:34.970
zumindest mal implementiert

01:22:34.970 --> 01:22:36.930
zu haben und zu sehen, ob man nicht irgendwo fundamental

01:22:36.930 --> 01:22:38.810
was kaputt macht oder was nicht verstanden hat.

01:22:39.630 --> 01:22:40.670
Und für sowas

01:22:40.670 --> 01:22:42.250
ja, das ist eigentlich ganz gut.

01:22:42.990 --> 01:22:44.810
Cool. Ja, ich glaube, damit sind wir

01:22:44.810 --> 01:22:46.370
eigentlich schon praktisch mit der Geschichte.

01:22:46.650 --> 01:22:48.650
Ja, na, E-Space haben wir erklärt. Es fehlt eigentlich noch

01:22:48.650 --> 01:22:50.550
der Pick der Woche und schöne Wünsche

01:22:50.550 --> 01:22:52.830
fürs, ja, leider ist es erst Montag,

01:22:52.890 --> 01:22:54.250
Wochenende, aber

01:22:54.250 --> 01:22:56.130
vielleicht ist es ja bei euch.

01:22:57.150 --> 01:22:58.650
Ja, das wird auch noch ein bisschen dauern, bis die Sendung

01:22:58.650 --> 01:23:00.690
nicht, bis die Sendung raus ist. Aber ja, wir wissen

01:23:00.690 --> 01:23:01.530
noch nicht genau, wann sie erscheinen.

01:23:02.450 --> 01:23:04.210
Ja, was ist denn dein Pick der Woche?

01:23:04.210 --> 01:23:05.730
Du hast dir ja auch was Schönes rausgesucht.

01:23:06.070 --> 01:23:08.290
Äh, genau. Ist mir letztens irgendwie über den Weg gelaufen.

01:23:08.670 --> 01:23:09.170
Ice Sword.

01:23:10.350 --> 01:23:14.390
Und zwar geht es dabei darum, dass halt...

01:23:14.390 --> 01:23:15.310
Importe sortieren?

01:23:15.670 --> 01:23:18.910
Ja, man kann ja...

01:23:18.910 --> 01:23:20.270
Man kann natürlich auch gefahrene Sachen machen,

01:23:20.410 --> 01:23:21.610
man automatisiert seine Importe.

01:23:22.110 --> 01:23:23.750
Eine Standardform bringen ja mit Black und so,

01:23:24.070 --> 01:23:27.630
aber das ändert jetzt zum Beispiel die Reihenfolge von Importen halt nicht.

01:23:27.810 --> 01:23:30.350
Und wenn man das komisch gemacht hat, dann...

01:23:30.350 --> 01:23:31.590
Also Black ist ein Autovermetter,

01:23:31.650 --> 01:23:33.330
den man in seinem Editor zum Beispiel einstellen kann

01:23:33.330 --> 01:23:36.370
oder mit dem man dann Dateien später so formatiert,

01:23:36.490 --> 01:23:37.690
dass auch eure Kollegen das lesen können,

01:23:37.690 --> 01:23:39.730
weil die eure ganzen Gewohnheiten zunichte machen

01:23:39.730 --> 01:23:41.210
und das so formatieren, wie man es normalerweise tut.

01:23:41.590 --> 01:23:43.730
Genau, aber wenn man jetzt viele Imports irgendwie hat,

01:23:44.010 --> 01:23:45.830
dann ist es auch vielleicht nicht

01:23:45.830 --> 01:23:47.490
schlecht, da eine Struktur drin zu haben und da

01:23:47.490 --> 01:23:49.810
guckt halt Black höchstens,

01:23:49.950 --> 01:23:51.790
dass die Zeilen nicht zu lang werden oder

01:23:51.790 --> 01:23:52.050
so,

01:23:52.890 --> 01:23:55.730
aber halt nicht, wie die sortiert sind, weil

01:23:55.730 --> 01:23:57.610
das spielt halt keine Rolle für

01:23:57.610 --> 01:24:00.950
Blackhands.

01:24:01.970 --> 01:24:03.690
Aber das ist halt vielleicht, wenn man da auch

01:24:03.690 --> 01:24:04.890
irgendwelche Regeln zu haben

01:24:04.890 --> 01:24:07.890
und das, also jedenfalls

01:24:07.890 --> 01:24:10.370
bringt iSort das halt auch in Standardformat.

01:24:10.450 --> 01:24:11.430
Ich glaube, wenn man das einfach ohne

01:24:11.430 --> 01:24:14.130
Config oder so benutzt, dann sortiert es das alphabetisch,

01:24:14.190 --> 01:24:15.150
dass es vielleicht auch nicht die sinnvollste

01:24:15.150 --> 01:24:18.030
Geschichte ist, aber man kann dem halt

01:24:18.030 --> 01:24:20.070
auch sagen, was es priorisieren soll oder

01:24:20.070 --> 01:24:21.550
sagen, okay,

01:24:22.270 --> 01:24:24.090
Standard-Modul

01:24:24.090 --> 01:24:25.910
aus der Standard-Bibliothek nach oben oder so. Man kann das Ding

01:24:25.910 --> 01:24:27.630
auch relativ umfangreich konfigurieren

01:24:27.630 --> 01:24:29.770
und ich fand da einfach nett zu sehen, dass es da überhaupt

01:24:29.770 --> 01:24:31.470
irgendwie eine Möglichkeit gibt, das automatisch zu machen.

01:24:31.650 --> 01:24:33.750
Ich glaube, es gab sogar so einen Hook in Black oder sowas?

01:24:34.090 --> 01:24:35.910
Nee, also da genau, das war

01:24:35.910 --> 01:24:37.630
in Black ist es so, dass

01:24:37.630 --> 01:24:39.110
irgendwelche Leute haben

01:24:39.110 --> 01:24:42.190
da ein GitHub aufgemacht

01:24:42.190 --> 01:24:43.750
und gefragt, ob Black das nicht auch machen könnte.

01:24:44.830 --> 01:24:45.770
Und dann haben sie gesagt,

01:24:45.770 --> 01:24:47.570
naja, vielleicht nicht, gibt doch IceHort.

01:24:47.710 --> 01:24:49.870
Und dann hat man irgendwelche Leute gesagt, oh, IceHort hat

01:24:49.870 --> 01:24:52.150
aber die und die und die Probleme und gerade in Kombination

01:24:52.150 --> 01:24:53.490
mit Black macht das manchmal Sachen kaputt.

01:24:54.010 --> 01:24:56.070
Daraufhin hat der Autor von IceHort

01:24:56.070 --> 01:24:57.990
da geschrieben, ja, ich sehe das

01:24:57.990 --> 01:24:59.970
auch alles irgendwie, dass das problematisch ist

01:24:59.970 --> 01:25:01.850
und ich arbeite gerade an einer

01:25:01.850 --> 01:25:04.190
Black-IceHort-Implementation,

01:25:04.730 --> 01:25:04.910
die

01:25:04.910 --> 01:25:07.250
diese Probleme dann nicht hat.

01:25:07.630 --> 01:25:09.970
Also falls ihr mittelgroße oder größere Projekte automatisch

01:25:09.970 --> 01:25:11.390
studieren wollt mit euren Modulen,

01:25:11.850 --> 01:25:12.670
guckt euch das doch mal an.

01:25:13.770 --> 01:25:15.350
Mein Pick der Woche war

01:25:15.350 --> 01:25:16.150
PPtop.

01:25:17.350 --> 01:25:19.150
Das macht sowas wie

01:25:19.150 --> 01:25:21.490
Python-Prozesse anzeigbar wie Htop,

01:25:21.550 --> 01:25:22.510
wenn ihr das irgendwie kennt oder so.

01:25:23.070 --> 01:25:25.210
Htop oder Top, irgendwie was unter Linux, so ein bisschen

01:25:25.210 --> 01:25:26.910
die Prozesse und Memory Management

01:25:26.910 --> 01:25:28.550
der einzelnen laufenden

01:25:28.550 --> 01:25:31.490
Prozess-IDs und so weiter euch zeigt.

01:25:31.770 --> 01:25:33.510
Macht das was mit Python-Prozessen, das ist relativ cool.

01:25:34.470 --> 01:25:35.470
Und ja, kann euch

01:25:35.470 --> 01:25:37.270
so eine Inspektion geben, was macht der

01:25:37.270 --> 01:25:39.150
in der Prozess eigentlich gerade. Fand ich

01:25:39.150 --> 01:25:41.030
ganz interessant, um mal so ein bisschen rumzuspielen, mal ein bisschen

01:25:41.030 --> 01:25:43.190
zu debuggen, zu gucken, was passiert

01:25:43.190 --> 01:25:43.810
denn da eigentlich?

01:25:45.210 --> 01:25:46.450
Klingt gut, muss ich mal ausprobieren.

01:25:48.490 --> 01:25:48.590
Ja.

01:25:48.770 --> 01:25:49.870
Ja, so.

01:25:50.470 --> 01:25:52.950
Haben wir es quasi fast heute wieder geschafft,

01:25:53.030 --> 01:25:55.090
würde ich sagen. Ja, also falls jemand von

01:25:55.090 --> 01:25:56.790
euch gezählt hat, wie oft wir Penis gezählt haben,

01:25:57.010 --> 01:25:57.930
können da sich eine Folge binden.

01:25:59.190 --> 01:26:01.010
Noch toller wäre es natürlich, wenn ihr einen Algorithmus schreibt,

01:26:01.010 --> 01:26:02.970
der irgendwie die Sprache analysiert und uns genau zeigt, wo das

01:26:02.970 --> 01:26:04.970
denn gewesen ist. Wir wollen euch ja mal

01:26:04.970 --> 01:26:06.910
ein bisschen motivieren, zwei Projekte, wer weiß.

01:26:07.270 --> 01:26:10.030
Ja, danke, dass ihr wieder zugehört habt.

01:26:10.270 --> 01:26:11.850
Bleibt uns gewogen, schaltet wieder rein.

01:26:13.090 --> 01:26:14.270
Ja, und ob immer auch seid.

01:26:14.530 --> 01:26:16.170
Schönen Tag, schönen Morgen, Abend, Nacht.

01:26:17.150 --> 01:26:17.830
Bis demnächst.

01:26:18.070 --> 01:26:18.810
Bis dann.

01:26:19.350 --> 01:26:19.710
Tschüss.
