Transcript: PP07 - Machine Learning am Beispiel Textklassifikation

· Back to episode

Full episode transcript. Timestamps refer to the audio playback.

Dominik

Ja, dann hallo, liebe Hörerinnen und Hörer, schön, dass ihr wieder da seid, dass ihr wieder zugeschaltet habt beim Python-Podcast in der siebten Episode heute.

Dominik

Heute geht es um Machine Learning und ja, wir haben heute wieder einen Gast dabei im Wintergarten.

Dominik

Hallo Nico.

Dominik

Hi, schön, bei euch zu sein.

Dominik

Ja, und Jochen ist natürlich auch wieder da.

Jochen

Ja, Jochen ist auch da, genau.

Jochen

Genau, ich bin der Dominik.

Dominik

Wir sollten uns, glaube ich, nochmal kurz vorstellen für den Nico, weil wir wahrscheinlich diese Folge irgendwie auch bei Nico veröffentlichen dürfen.

Dominik

auf Nicos tollen Podcast

Dominik

InnoCast heißt der noch?

Dominik

InnoTechCast, genau.

Dominik

Der InnoTechCast

Nico

ist mein Podcast-Projekt, läuft auch so seit

Nico

ein bisschen über einem Jahr jetzt

Nico

und da geht es halt nicht nur konkret um Python,

Nico

sondern um alle möglichen

Nico

Sachen, die irgendwie

Nico

Nerds und ITler interessieren könnten,

Nico

irgendwie von Containern über

Nico

irgendwie so DevOps-Geschichten,

Nico

einzelne Programmiersprachen.

Nico

Was haben wir so gemacht? Wir haben Go gemacht,

Nico

wir haben Rust behandelt,

Nico

Wir hatten auch schon mal eine Folge so ein bisschen zu peisen.

Nico

Also es ist auf jeden Fall sehr spannend, hört da mal rein.

Nico

Kann ich empfehlen, klingt gut.

Nico

Genau.

Dominik

Ja, dann fangen wir doch mal mit dem richtigen Thema an jetzt

Dominik

und gehen das Beispiel durch, was wir für das Machine Learning machen wollen.

Jochen

Ja, wahrscheinlich sollten wir erstmal so ein bisschen...

Dominik

Erstmal nochmal so allgemein vielleicht, was ist denn das überhaupt, das Machine Learning?

Dominik

Was macht das denn?

Dominik

Ja, das denke ich auch.

Dominik

Wie viel Statistik ist das eigentlich oder ist das Statistik oder was ist das

Dominik

oder macht da irgendwelche magischen

Dominik

Dinge, der Computer einfach magische

Dominik

Sachen und dann kommt irgendwie wusch

Dominik

künstliche Intelligenz daraus.

Nico

Ja, das ist ja das Gefühl, was man heute in den Medien, finde ich,

Nico

irgendwie immer bekommt. Also es ist halt so ein

Nico

Buzzword, was überall rumschwirbt, genauso wie

Nico

irgendwie künstliche Intelligenz.

Nico

Genau, aber im Wesentlichen geht

Nico

es ja darum, im Endeffekt gewisse

Nico

Strukturen in den Daten zu finden,

Nico

um eben Prognosen

Nico

über die Zukunft zu lernen.

Nico

Das heißt einfach, ich programmiere nicht mehr alles

Nico

komplett deterministisch runter, was

Nico

ich irgendwie wie von einem gewissen

Nico

Eingabewert zu einem gewissen Ausgabewert komme,

Nico

sondern ich habe halt eine gewisse

Nico

große Menge an Trainingsdaten

Nico

und habe dann Algorithmen,

Nico

die gewisse Parameter

Nico

anpassen bei solchen sogenannten

Nico

Trainingsläufen und daraus

Nico

quasi generelle Strukturen aus den Daten erkennen,

Nico

um dann damit letztendlich

Nico

Schlussfolgerungen für die Zukunft

Nico

oder für unbekannte Daten

Nico

zu ermöglichen. So hätte ich das

Nico

zusammengefasst. Ja, würde ich

Nico

prinzipiell genauso. Der Computer lernt so,

Dominik

was er mit neuen Sachen dann anfangen

Dominik

muss, aus alten Dingen.

Jochen

Genau, es gibt einmal, es gibt keine

Jochen

allgemeingültige Definition, was jetzt Machine Learning

Jochen

ist, aber also

Jochen

eine von Tom Mitchell wäre halt

Jochen

so ganz allgemein gehalten, ja,

Jochen

Machine Learning führt

Jochen

halt dazu, dass Computer oder dass Programme

Jochen

aus Erfahrung lernen irgendwie,

Jochen

mit Erfahrung besser werden.

Jochen

Genau,

Jochen

wenn man das jetzt mit traditionellem

Jochen

Programmieren vergleichen würde, dann ist es halt so,

Jochen

Dass man eben selbst, wenn man damit programmiert, sozusagen diese Zuordnung von, man bekommt irgendwelche Eingaben und dann soll halt irgendwie irgendwas rauskommen am Schluss, machen muss. Und wenn man jetzt Machine Learning verwendet, dann macht diesen Schritt halt wie ein mathematisches Optimierungsverfahren. Und das sich orientiert an Trainingsbeispielen, an Beispielen für, das ist reingegangen und das ist rausgekommen und so sollte das halt sein.

Dominik

Aber genau das ist ja auch das, was dann der Mensch dann doch wieder macht. Das heißt, der Mensch macht ja diese Vorarbeit, indem er die Trainingsdaten mit den richtigen Zuordnungen, mit den richtigen Labels bereitstellt.

Jochen

Genau, richtig. Aber es ist halt schon ein Unterschied, ob man jetzt quasi einem Computer nur zeigen muss, was er tun soll oder ob man ihm tatsächlich explizit Schritt für Schritt sagen muss, was passieren soll. Das eine ist halt deutlich einfacher als das andere. Und damit kommen halt natürlich viel mehr Probleme in den Bereich der Lösbarkeit, als man halt vorher hatte.

Jochen

Und es gibt auch diverse Probleme, die man sonst gar nicht in den Griff kriegt. Also wo man tatsächlich versucht hat, einen Algorithmus zu schreiben, der das tut, wie zum Beispiel eben sowas wie bei Bildern Katzen von Hunde unterscheiden oder so. Aber das geht halt gar nicht, weil man das halt nicht wirklich in einen Algorithmus reinbekommt.

Dominik

Man kann nicht so ein Gegenstand definieren. Eine Katze ist irgendwie so ein kleines Tier und grau und weiß und so weiter. Das ist schwer zu unterscheiden.

Nico

Ja, oder auch das Arbeiten mit Sprache finde ich ein gutes Beispiel, da hat man halt viele, viele Algorithmen entwickelt, die auch zu einem gewissen Grad funktionieren, aber man ist mit Übersetzungen halt einfach quasi dann auf so einem Plateau spähen geblieben und kam da nicht mehr weiter und dank Deep Learning Verfahren, also tiefen neuronalen Netzen ist es halt eben dann möglich geworden, dann nochmal ganz neue Lernraten zu erreichen.

Jochen

Ja, das ist genau, das ist halt auch Stichwort Deep Learning eigentlich das Ding, was in den letzten paar Jahren halt diesen Hype irgendwie befeuert hat und da ist durchaus irgendwie ordentlich was dran, also es gehen inzwischen viele Sachen, die früher überhaupt gar nicht gingen und ja, aber natürlich ist es immer schwer für Leute, die das jetzt nicht so ordentlich verfolgen können und wer tut das halt, außer die irgendwie tatsächlich damit arbeiten, zu unterscheiden, was denn jetzt irgendwie geht und was nicht geht und was eigentlich das Coole daran ist,

Jochen

Und in den Medien hat man dann doch oft das Gefühl, dass man davon ausgeht, dass das irgendwas Magisches ist, dann geht halt alles und das ist ja jetzt auch nicht so.

Dominik

Das ist genau der spannende Punkt. Du hast nämlich gerade versucht zu erklären, dass das, was da passiert, irgendwelche mathematischen Algorithmen sind und die halt zu verstehen als Mensch oder daran zu schrauben zu können, die Parameter, die man halt irgendwie bei Maschinenlöhnen noch einstellt und das halt dann so durchblicken.

Dominik

Also was das zu tun hat jetzt mit Statistik oder so, das ist vielleicht nochmal ganz spannend, weil dann würde man vielleicht auch nicht nur glauben, dass Magie, also ne, vielleicht sowas mit zu tun, wenn irgendjemand neue Sachen erfindet, irgendeine Geometrie entdeckt, dann ist das vielleicht auch ganz magisch für jemand, der sowas noch nie gesehen hat und deswegen ist halt diese künstliche Intelligenz gar nicht so künstlich, wie wir dachten, aber dann trotzdem so ein Phänomen, was gerade ja bei den Leuten, die sich damit nicht auskennen, so ankommt.

Jochen

Ja, also wenn man das guckt, wenn man sich einfach nur die Ergebnisse anschaut, dann wirkt das so ein bisschen magisch.

Dominik

Genau, also warum kann der Computer jetzt einen Hund von einer Katze unterscheiden? Wie soll das denn gehen?

Dominik

Wie, der Computer weiß, was ich da gerade gesagt habe und kann mit mir sprechen. Das ist schon phänomenal irgendwo.

Nico

Aber ist das nicht eigentlich immer so? Also wenn man halt quasi irgendein Blackbox-Modell hat und da nicht reinschauen kann, dann wirkt das wie Magie.

Nico

und wenn man halt nach und nach die

Nico

Informationen da drin versteht,

Nico

dann, ja, blickt man halt, okay, das

Nico

hat gewisse Schlussfolgerungen. Ich meine, es hat schon

Dominik

Verstehen wir die wirklich bei Machine Learning? Das habe ich jetzt nämlich auch noch nicht

Dominik

so ganz verstanden. Nee, genau,

Jochen

da gibt es natürlich einen Unterschied zwischen

Jochen

so eben Blackbox, Whitebox-Verfahren,

Jochen

bei denen man, also bei denen

Jochen

sozusagen, ja,

Jochen

Whitebox-Verfahren, sowas wie Decision Trees

Jochen

kann man prinzipiell verstehen, wie die funktionieren, weil man

Jochen

einfach sicher den Entscheidungsbaum

Jochen

aufmalen kann, dann kann man den halt von Hand durchgehen.

Jochen

Bei eben

Jochen

Blackbox-Verfahren wie so neuronalen Netzen

Jochen

oder so, kann man das prinzipiell eigentlich

Jochen

nicht wirklich. Also man kann zwar sehen,

Jochen

welche, was das Ding gemacht hat

Jochen

und

Jochen

auch irgendwie, was es erkannt hat und

Jochen

woran es sich orientiert, aber so letztlich

Jochen

genau verstehen, warum es jetzt zu einem bestimmten

Jochen

Ergebnis gekommen ist, kann man eigentlich

Jochen

nicht mehr. Und ich fürchte auch, einer der

Jochen

größten, wichtigsten Punkte,

Jochen

weshalb das so prinzipiell eine schwierige Geschichte

Jochen

ist, ist, dass die Modelle, je komplexer

Jochen

sie werden und desto mehr Parameter sie

Jochen

haben, werden sie halt auch sehr groß.

Jochen

Also wenn ich dann mehrere,

Jochen

ja, Millionen reicht ja schon, aber wenn ich

Jochen

mehrere hundert Millionen Parameter habe,

Jochen

dann ist das eine Menge, die ich

Jochen

als Mensch ja überhaupt nicht mehr überlegen kann.

Jochen

Das ist halt...

Nico

Ja, wobei es inzwischen da ja schon viel

Nico

Forschung gibt, gerade auch um

Nico

neuronale Netze

Nico

eben verständlich zu machen.

Nico

Zum Beispiel ja irgendwie

Nico

Lime ist ja da so ein Paket, was da in der Zeit

Nico

total gehypt wurde, in dem es halt

Nico

eben möglich ist, quasi an gewissen

Nico

Zumindest für gewisse Objekte zu verstehen, wie das Modell quasi zu diesem Schluss kam.

Nico

Also so blackboxig sind diese neuronalen Netze jetzt gar nicht mal mehr.

Nico

Auch da gibt es Möglichkeiten, die zu verstehen.

Nico

Aber ja, also klar, das ist natürlich deutlich komplexer als jetzt ein Entscheidungsbaum,

Nico

den ja wahrscheinlich jeder mehr oder weniger kennt, was nicht viel anders ist als ein Flussdiagramm.

Dominik

Aber vielleicht wollen wir kurz noch mal ein, zwei Schritte zurückgehen und so ein bisschen die Hörer da abholen.

Dominik

Wir wollten ja so ein bisschen das Beispiel erzählen und vielleicht kommen wir dann,

Dominik

welche Methoden man denn verwenden kann für bestimmte

Dominik

Datensätze. Darum, ob wir jetzt so ein

Dominik

neuronales Netz oder so ein Decision Tree

Dominik

verwenden möchten.

Dominik

Würde das Sinn machen? Was sagt ihr?

Dominik

Ja, also ich finde, man muss

Nico

erstmal festhalten, dass es halt irgendwie

Nico

nicht so ist, dass jetzt plötzlich

Nico

für alles man Deep Learning benutzen sollte,

Nico

nur weil es jetzt gerade gehypt ist, sondern

Nico

es gibt ganz, ganz viele Verfahren,

Nico

die schon lange existieren, die bewährt

Nico

sind und die für einige Tasks

Nico

halt auch sehr gut funktionieren. Also wenn ich

Nico

jetzt zum Beispiel einfach eine

Nico

Zeitreihe vorhersagen möchte

Nico

mit

Nico

relativ einfachen Mitteln, um vielleicht den Abverkauf

Nico

von einem Produkt vorherzusehen oder

Nico

die Temperatur oder sowas, dann

Nico

gibt es da jetzt erstmal Regressionsverfahren,

Nico

die so schon sehr gut funktionieren

Nico

und da muss man jetzt nicht zwangsläufig

Nico

irgendwie Deep Learning draufwerfen.

Nico

Ist halt eben was anderes wie bei der

Nico

Bilderkennung, die du jetzt zum Beispiel erwähnt hast.

Dominik

Regression ist natürlich immer nur so gut, wie

Dominik

die Zukunft

Dominik

der Vergangenheit entspricht. Das ist ja vielleicht

Dominik

Ja, klar, genau.

Nico

Aber das Problem haben Deep Learning Algorithmen

Nico

an der Stelle genauso.

Nico

Ja?

Jochen

Okay. Also natürlich hast du

Jochen

da nicht unbedingt dann immer so einen linearen

Jochen

Zusammenhang, aber

Jochen

ja, im Grunde natürlich

Jochen

so Dinge, die komplett neu sind.

Jochen

Ja, wenn es einmal

Dominik

Alph oder sowas ist, ein Hund oder eine Katze, weiß man nicht so genau.

Dominik

Ja, dann kommt was

Dominik

Neues auf die Welt.

Jochen

Genau, also es gibt auch

Jochen

Verfahren, die total einfach zu verstehen

Jochen

sind. Also sowas wie NaiveBase

Jochen

zum Beispiel. Das ist eine der ersten

Jochen

Geschichten, die

Jochen

also ich glaube 2004 hatte Paul Graham

Jochen

halt da irgendwie den Artikel

Jochen

veröffentlicht, The Plan for Spam.

Dominik

Jetzt musst du nochmal einmal kurz sagen, was

Dominik

NaiveBase überhaupt ist, für alle, die das noch nie gehört haben.

Jochen

Das ist auch ein Klassifikationsverfahren und zwar

Jochen

also ich, genau, ich wollte, also wenn man

Jochen

jetzt ein bisschen erklären möchte, wie funktioniert das oder wie

Jochen

funktioniert Machine Learning, dann ist der

Jochen

allereinfachste Fall, den man beschreiben kann,

Jochen

halt binäre Klassifikationen, vielleicht.

Jochen

So, womit man anfangen kann.

Jochen

Und

Jochen

ja, NaiveBase

Jochen

ist halt ein... Also binäre

Dominik

Klassifikation. Also drin oder nicht drin.

Jochen

Genau, man unterscheidet eigentlich nur zwei Klassen.

Jochen

Genau. Und

Nico

Merkst du ganz kurz, genau, wenn man

Nico

das mal zusammenfassen darf, man hat halt

Nico

vom Prinzip her Supervised Machine Learning

Nico

und Unsupervised Machine Learning, solche, wo

Nico

ich irgendwie Daten habe, wo ich quasi

Nico

Labels habe, wo ich sagen kann,

Nico

okay, das soll quasi nachher rauskommen,

Nico

das ist Supervised Machine Learning. Und es

Nico

gibt solche, wo ich diese Information nicht habe,

Nico

Das ist das Feld der Unsupervised-Machine-Learning-Sachen.

Nico

Und im Feld von Supervised-Machine-Learning

Nico

gibt es dann im Wesentlichen unterschiedliche Tasks.

Nico

Es gibt eine Regression oder es gibt eine Klassifikation

Nico

als die beiden typischsten Fälle.

Nico

Und genau, der einfachste Fall wäre dann halt eben

Nico

eine binäre Klassifikation, wo ich einfach nur sage,

Nico

in folgendem Fall, Daumen hoch, Daumen runter, ja oder nein.

Nico

Genau.

Jochen

Ich suche mal gerade, ob ich das hier...

Jochen

Ja, schau mal.

Jochen

finde, Moment.

Dominik

Wir wollten noch mal kurz erklären, was Space

Dominik

macht mit einer binären Klassifikation.

Dominik

Bevor

Dominik

wir dann vielleicht tatsächlich darauf eingehen, was für eine Möglichkeit

Dominik

man hat, jetzt so diese Klassifikation durchzuführen,

Dominik

weil, weiß ich, mehr als zwei

Dominik

Dinge, also wenn du zwei Merkmale hast, dann

Dominik

kannst du ja relativ einfach voneinander trennen, wenn die

Dominik

homogen sind untereinander

Dominik

in ihren eigenen Klassen. Und das wird ja umso

Dominik

komplexer, umso

Dominik

weniger heterogen die untereinander sind, also

Dominik

umso mehr die sich gleichen, dann hast du natürlich größere

Dominik

Probleme, dann ist es vielleicht auch so, dass du die Merkmale falsch

Dominik

anguckst oder so. Also du sollst halt schon

Dominik

unterscheidende Merkmale finden können.

Dominik

Und das ist halt im Prinzip das, was du mit Base dann relativ

Dominik

gut machen kannst. Du kannst halt dann sagen, ey, ist jetzt

Dominik

der Falter grün oder nicht? Oder schwarz

Dominik

oder so? Oder ist das halt eine Katze?

Dominik

Woran erkennt man das? Ich weiß nicht, ob sich

Dominik

jetzt Base für Katzen und Hunde schon

Dominik

eignen würde, weil das wird vielleicht schon

Jochen

schwierig. Ja, also für Bilder

Jochen

wird das sicherlich nicht gut funktionieren,

Jochen

aber wenn ich jetzt, eben

Jochen

das ist halt auch so ein klassisches Beispiel habe,

Jochen

wenn ich jetzt Spam von Nicht-Spam-Mails unterscheiden

Jochen

möchte, da ist es halt

Jochen

genauso, das war früher, waren die ganzen

Jochen

Spam-Filter irgendwie

Jochen

regelbasiert, also man erinnert sich da vielleicht noch so an

Jochen

Zeiten, ich habe das auch selber noch benutzt,

Jochen

ja, das war so ein

Jochen

Spam-Assassin,

Jochen

das hat sich dann halt die Header angeguckt

Jochen

und dann hat es halt manchen

Jochen

Providern mehr und manchen weniger vertraut

Jochen

und

Jochen

irgendwelche, insgesamt halt irgendwie

Jochen

einen Score ausgerechnet und gesagt, ah, okay,

Jochen

das hat jetzt einen Spam-Score von so und so viel

Jochen

oder so und so viel und ab einer bestimmten Grenze

Jochen

wurde dann halt abgeschnitten und gesagt, das ist Spam.

Jochen

Das hat

Jochen

ganz okay funktioniert, aber das war immer

Jochen

leicht zu unterlaufen von Spammern

Jochen

und Spam war immer eine relativ

Jochen

ärgerliche Geschichte.

Jochen

Bis dann halt eben

Jochen

Paul Graham, halt der

Jochen

ähm

Jochen

ähm

Jochen

ja, wie heißt der Inkubator, den er gegründet hat?

Jochen

Darüber ist er sehr bekannt geworden.

Jochen

habe ich jetzt gerade, ist mir entfallen,

Jochen

also der schreibt auch viele Essays und

Jochen

hat auch ein Buch geschrieben.

Jochen

Y Combinator tatsächlich.

Dominik

Vorher hat er es auf der Zunge, ich habe mich nur nicht getroffen.

Jochen

Ja, der

Jochen

schrieb dann halt irgendwie 2004

Jochen

ein Essay, so

Jochen

A Plan for Spam, also ich habe da irgendwie so eine Idee,

Jochen

wie wir dieses Problem endgültig in den Griff kriegen.

Jochen

Und da schlägt er halt vor, irgendwie so

Jochen

Naive Base zu verwenden, um

Jochen

inhaltsmäßig irgendwie

Jochen

Spams von Nicht-Spams zu

Jochen

unterscheiden, weil, naja, irgendwie

Jochen

ein Spammer muss ja reinschreiben, dass er was

Jochen

verkaufen will oder muss ja irgendwie, er kann ja

Jochen

den Content kann er im Grunde nicht wirklich

Jochen

so ändern,

Jochen

dass man das nicht mehr als Spam erkennen

Jochen

kann, weil dann kann es auch der Mensch

Jochen

nicht mehr als Spam erkennen und dann

Jochen

verfehlt das ja seinen Zweck.

Jochen

Liebe Freund, ich brauche Hilfe.

Jochen

Ja gut, okay, das ist jetzt eine bestimmte

Jochen

Art von Spam.

Dominik

Das sind die, die bei mir gerade immer durchkommen, immer wieder.

Jochen

Die kommen durch? Da ist aber irgendwas mit

Jochen

deinem Spam-Filter nicht in Ordnung. Was für ein Spam-Filter?

Jochen

Okay.

Jochen

Nein, also sie landen bei mir im Spam-Filter

Jochen

und ich kann dann immer sehen,

Dominik

okay, es war eine Message im Spam-Filter,

Dominik

was auch nicht so häufig passiert.

Dominik

Ach so, okay, gut, ja.

Jochen

Genau, und zwar das Verfahren ist halt super einfach.

Jochen

Das ist halt, mach einfach aus den Mails,

Jochen

aus dem Inhalt deiner Mails im Spam-Ordner

Jochen

eine lange Liste von Wörtern,

Jochen

zähle, wie oft ein Wort da drin halt vorkommt,

Jochen

merke die Gesamtzahl der Wörter

Jochen

und die Gesamtzahl der Mails, die da drin waren

Jochen

und mach das Ganze auch nochmal für den Ordner

Jochen

mit den Nicht-Spam-Mails

Jochen

und

Jochen

das ist schon das Training.

Jochen

Das war's. Also man hat jetzt

Jochen

quasi an jedem Wort sozusagen nur dranstehen

Jochen

quasi

Jochen

wie oft das halt

Jochen

vorkommt und man hat nochmal eine Zahl für

Jochen

wie viel

Jochen

Mails man gesammelt hat.

Dominik

Er hat Penis gesagt und dann sagt er, nee, ist wahrscheinlich Spam.

Dominik

Also so in etwa.

Dominik

Genau. Und die Klassifikation,

Dominik

also wenn man das gemacht hat,

Jochen

ist man mit dem Training schon fertig und das ist auch schon das

Jochen

Modell. Und die

Jochen

Klassifikation funktioniert jetzt so,

Jochen

wenn man jetzt eine zu prüfende Mail hat, dann zerlegt man die

Jochen

eben auch wieder in eine Liste von Wörtern.

Jochen

Man macht aus

Jochen

dieser Wortliste eine Liste von Zahlen

Jochen

und man ersetzt jetzt

Jochen

jedes Wort eben durch die Kategoriefrequenz.

Jochen

Das hatte man ja vorher schon

Jochen

ausgerechnet, sozusagen. Man wusste halt, wie oft

Jochen

jedes Wort im Spam- und im Nicht-Spam-Ordner

Jochen

vorkommt. Und

Jochen

sozusagen, ja,

Jochen

man ersetzt jetzt die Wörter eben durch die Kategoriefrequenz

Jochen

und

Jochen

multipliziert jetzt einfach alle diese Zahlen

Jochen

miteinander und

Jochen

bekommt dann halt eine Wahrscheinlichkeit, dass eine Mail Spam

Jochen

oder nicht Spam ist. Und

Jochen

ja, die Zahlen werden relativ klein

Jochen

sein, weil das sind alles relativ kleine Wahrscheinlichkeiten.

Jochen

Wenn die noch miteinander multipliziert, ist es

Jochen

super nahe Null. Das heißt,

Jochen

man muss das Ganze noch so normalisieren, dass hinterher ja halt

Jochen

irgendwie quasi

Jochen

der Wert für Spam und nicht Spam, wenn man das addieren würde,

Jochen

eins ergibt. Aber ja, ist ja auch

Jochen

kein Problem. Und das war es schon. Also es ist wirklich

Jochen

nicht, ist keine große

Jochen

Hexerei.

Jochen

Wie sagen wir, Raketenchirurgie.

Jochen

Das ist eigentlich eine ziemlich einfache Geschichte.

Nico

Genau, das kann man ja einfach sich eigentlich auch noch so

Nico

in einem Algorithmus darstellen. Da braucht man

Nico

ja, keine komplexen

Nico

Selbstlernverfahren eigentlich noch, nicht wahr?

Nico

Ja, also gut, das Ding

Nico

lernt ja tatsächlich. Also wenn ich jetzt sage,

Jochen

eben, ich habe bisher nur

Jochen

Mails,

Jochen

die mir Produkte zur

Jochen

Vergrößerung meiner primären Geschlechtsmerkmale

Jochen

irgendwie mir so ein Zeugs andrehen

Jochen

wollen, bekommen und ich kriege jetzt zum ersten Mal

Jochen

ein Nigeria-Spam, wo mich jemand halt

Jochen

dazu bringen will, einen kleinen Betrag

Jochen

ihm zu geben,

Jochen

um einen viel größeren zu bekommen,

Jochen

dann würde ich halt

Jochen

das halt auch mit in die Spams

Jochen

reintun und dann müsste ich halt wieder neu

Jochen

diese Zahlen

Jochen

ermitteln. Genau, die müssen halt

Nico

wieder neu gebildet werden, aber

Jochen

dann würden sich die Frequenzen wahrscheinlich zum Beispiel

Jochen

für so ein Wort wie Prinz oder so oder Schweizer

Jochen

Bankkonto entsprechend verändern

Jochen

und dann hoffentlich beim nächsten Mal werden wieder so

Jochen

eine Mail dieser Art... Ziemlich ärgerlich für Prinzen mit Schweizer

Jochen

Bankkonto. Ja, die haben

Jochen

ein Problem mit, die werden

Jochen

ja,

Jochen

die haben mit Meldern keinen Spaß mehr seitdem.

Jochen

Genau

Jochen

und das, ja, und dann

Jochen

passt sich das durchaus halt

Jochen

quasi neuen Mustern an, wenn

Jochen

die nächste Masche um die Ecke kommt, dann braucht man halt nur die

Jochen

ersten paar

Jochen

sozusagen richtig zu sortieren und dann sollte das

Jochen

automatisch funktionieren und mitlernen.

Jochen

Ja.

Dominik

Ja, jetzt haben wir kurz an Base-Klassifikationen erklärt. Wir sind aber immer noch nicht bei dem Beispiel angekommen, was wir irgendwie den Menschen, also wie macht man das denn überhaupt?

Nico

Wir haben versprochen, dass wir irgendwie praktisch durchgehen wollen. Da hätte ich mal gesagt, lass uns das mal machen. Wir packen mit Sicherheit unter die Folgen mal einen Link zu dem Repository, was wir dafür benutzen wollen. Das ist vom Jochen. Da hat er halt eben eine Schulung drin, eine Data Science Schulung, woraus wir jetzt vor allem gleich mal das Beispiel nehmen wollen für die Text-Klassifikation.

Nico

und genau, wenn man da drauf geht,

Nico

sieht man in dem Readme auch erstmal irgendwie alle

Nico

Informationen, wie man sich das Ganze zieht, also

Nico

man klont sich halt erstmal das Git-Repository

Nico

soweit, so gut

Nico

und dann kommen auch schon die ersten Python-spezifischen

Nico

Sachen, denn dann müssen

Nico

wir uns erstmal irgendwie mit Conda

Nico

eine entsprechende Umgebung aufsetzen. Jochen,

Nico

sag doch mal, warum sollte man das immer machen?

Nico

Und warum denn Conda?

Jochen

Ja, also Conda ist

Jochen

sozusagen der Paketmanager

Jochen

des Teils

Jochen

von Python,

Jochen

der sich mit so Data-Science-Maschinen-Learning-Geschichten beschäftigt.

Jochen

Da steckt halt auch so eine Firma dahinter, Continuum Analytics.

Jochen

Das sind auch die, oder die Leute, die die Firma gegründet haben,

Jochen

sind auch die, die ursprünglich mal NumPy mitentwickelt haben und so.

Jochen

Und ja, es ist, früher hatte man ja irgendwie mal so die Hoffnung,

Jochen

dass die Distribution, das ganze Paket-Installations-Ding

Jochen

halt irgendwie überflüssig machen würden

Jochen

Und sich halt um Abhängigkeiten und sowas kümmern und das ist irgendwie nicht passiert. Also stattdessen ist es so, dass irgendwie jede Programmiersprache so gefühlt irgendwie ihren eigenen Paketmanager hat.

Jochen

Und bei Python ist es ein bisschen

Jochen

besonders schlimm, weil da gibt es halt nicht nur einen,

Jochen

sondern mehrere. Je nachdem, in welcher

Jochen

Community man sich da aufhält.

Jochen

Wenn man irgendwie eher Web-Entwicklung oder sonst

Jochen

wie Python-Entwicklung macht,

Jochen

dann ist es eher Pip und

Jochen

als Repository für Pakete

Jochen

halt PyPI.

Nico

Lass dir sagen, das Problem hat nicht nur Python.

Nico

Rust ist da auch ganz schlimm, habe ich schon

Nico

gelernt, aber ja.

Nico

Ja, es ist auf jeden Fall ziemlich

Dominik

anstrengend. Ich weiß gar nicht, ob ich Conda so verwenden

Dominik

würde, so außerhalb von Daten.

Jochen

Ne, würde ich glaube ich auch nicht, mache ich auch nicht.

Jochen

Also wenn ich Web-Projekte mache, dann nehme ich

Jochen

eher PIP und

Jochen

tatsächlich funktionieren

Jochen

die meisten Sachen auch, wenn man sie mit PIP installiert.

Jochen

Also tatsächlich auch die ganzen

Jochen

Datensachen funktionieren über PIP?

Jochen

Ja, schon.

Jochen

Sie

Jochen

funktionieren zumindest gut genug, als dass man das

Jochen

meistens einfach so verwenden kann. Wenn ich jetzt

Jochen

irgendwie tatsächlich

Jochen

ein Modell trainieren wollte,

Jochen

aber das will man halt, wenn man

Jochen

wenn es einen Web-Server hat, der irgendwie auch nur

Jochen

Pandas noch mitbraucht, um halt irgendwelche

Jochen

Sachen anzunehmen, oder

Jochen

selbst ein Web-Server, der jetzt halt hinter

Jochen

irgendeinem ARP-Modell hat, was irgendwas vorhersagt

Jochen

oder was irgendwas klassifiziert und dann die Ergebnisse zurückgibt,

Jochen

da ist es im Grunde egal, da kann man

Jochen

das bei PIP installieren, aber wenn ich jetzt

Jochen

irgendwie was trainieren wollte,

Jochen

dann würde ich eher

Jochen

die Conda-Pakete nehmen

Jochen

oder vielleicht sogar

Jochen

spezielle Docker-Images oder sowas.

Jochen

Ja, aus meiner Sicht

Nico

hatte halt Conda vor allem zwei Vorteile. Zum einen

Nico

ist es halt schon mal

Nico

zusammen das, was sonst

Nico

PIP und Virtual Env ist. Also ich habe die

Nico

Möglichkeit, sowohl eine virtuelle Umgebung

Nico

mit zusammenzubauen und dann

Nico

halt eben in die die Pakete mit rein zu installieren.

Nico

Was man häufig möchte,

Nico

wenn man gerade zum Beispiel so ein Experiment macht,

Nico

dann möchte ich vielleicht meine

Nico

Basis-Version an Paketen so lassen,

Nico

wie ich sie hatte und dann halt mal für jetzt

Nico

eine Konferenz zum Beispiel mir nochmal eine zweite

Nico

daneben stellen. Das müsste ich ja sonst mit

Nico

Virtual-End-Pip quasi in zwei

Dominik

Schritten machen. Ja gut, aber normalerweise

Dominik

machst du ja Virtual-End-Wrapper, dann einen Befehl

Dominik

und dann ist das Ding ja oben. Genau.

Dominik

Ich habe tatsächlich einen Python-Skript für sowas

Dominik

geschrieben, der auch genau das gleiche macht, wenn ich das will.

Nico

Aber ja. Genau, und der zweite Punkt ist,

Nico

Conda kann halt

Nico

einfach ja noch ein bisschen mehr als Pip.

Nico

Es kann halt vor allem auch quasi Abhängigkeiten,

Nico

die außerhalb von Python-Paketen

Nico

liegen, lösen, was dann halt auch

Nico

interessant wird, wenn es halt um Treiber-Support und so weiter

Nico

geht.

Nico

Genau, aber ich glaube, du hast schon recht,

Nico

dass es auch so ein Stück weit ein Community-Ding ist,

Nico

dass es sich halt im Data-Science-Umfeld

Nico

auch durch den starken Support von Continuum da

Nico

und den finanziellen Mitteln, die dahinter stecken,

Nico

so durchgesetzt hat.

Nico

Ja, ja, also ich...

Dominik

Weil es so einfach zu installieren ist auch.

Dominik

Es gibt halt auch, glaube ich, nur Windows-Binarys einfach

Dominik

und da ist dann alles mit dabei an Modulen, was man so hat

Dominik

und man muss das gar nicht mehr groß bedienen.

Dominik

Ich glaube, das ist auch so ein low-leveliger Ansatz.

Dominik

Das ist ein Grund, warum sie das so verbreitet hat.

Dominik

Wobei ich jetzt ehrlich gesagt zum Beispiel

Jochen

die große Anaconda-Distribution habe ich nie benutzt,

Jochen

habe ich nie installiert.

Jochen

Also das Anaconda-Distribution ist

Jochen

eigentlich sozusagen das eigentliche

Jochen

Ding, was irgendwie da produziert

Jochen

wird. Ich habe immer Miniconda verwendet

Jochen

und dann halt das installiert, was ich

Jochen

gerade gebraucht habe. Also der Unterschied ist, Anaconda

Nico

bringt halt schon mal irgendwie alle möglichen Pakete mit,

Nico

die man potenziell so gebrauchen könnte und Miniconda

Nico

ist halt erstmal klein und schlank und

Nico

dann muss man halt alles quasi mit

Nico

dazu installieren, was man dann noch gerne hätte.

Jochen

Ja, und eben

Jochen

der Vorteil gegenüber PIP oder

Jochen

sagen wir mal so, das ist halt auch nicht mehr so

Jochen

ganz, das war früher ein Riesen

Jochen

Unterschied, ist heute nicht mehr ganz so relevant,

Jochen

ist halt, dass man halt binäre Geschichten

Jochen

bei Conda auch installieren kann. Also man kann

Jochen

halt auch Bibliotheken, die unten

Jochen

drunter liegen, also eben nicht nur Python-Pakete,

Jochen

sondern eben auch sowas, man kann auch theoretisch sowas wie

Jochen

Libc irgendwie mit Conda

Jochen

installieren und die dann halt

Jochen

in einem Conda-Environment verwenden

Jochen

und muss halt, also das ist

Jochen

auch so ein Problem, wenn man jetzt auf größeren

Jochen

Servern unterwegs ist, die halt

Jochen

unter Umständen irgendwie

Jochen

so eine antike Debian-Version

Jochen

irgendwie haben und eine uralte Lib C

Jochen

und die funktioniert dann mit neueren

Jochen

anderen

Jochen

Bibliotheken nicht mehr gut, dann

Jochen

habe ich, hatte auch schon den Fall, dass ich dann

Jochen

per Conda irgendwie eine neue Lib C

Jochen

in meinem Environment installiert habe, um überhaupt

Jochen

irgendwie bestimmte Sachen benutzen

Jochen

zu können. Und das geht halt mit Conda und mit

Jochen

PIP wäre man da halt relativ aufgeschmissen.

Jochen

Daher, ja,

Jochen

für so

Jochen

wirkliche Data Science Projekte ist das

Jochen

halt schon irgendwie deutlich netter.

Jochen

Es ist ein bisschen schade, dass jetzt man halt

Jochen

zwei Repositories von Paketen hat und

Jochen

ja, manchmal ist es halt auch so ein bisschen

Jochen

kompliziert, dann sich zu überlegen, was man gerade

Jochen

machen will, aber ich würde die

Jochen

Faustregel einfach nehmen, wenn es ein reines

Jochen

Data-Science-Projekt ist, ja dann

Jochen

Conda und wenn es irgendwie eine Web-Geschichte ist oder

Jochen

was ganz anderes, eher Pip.

Dominik

Ist das denn immer genauso aktuell in Conda

Dominik

wie auf PyPy?

Jochen

Nee, Conda ist nicht so aktuell.

Jochen

Es gibt dann noch CondaForge, also sozusagen

Jochen

ein...

Jochen

Da kann man sich selber Sachen bauen.

Jochen

Ja, das kann man sowieso, aber

Jochen

es gibt halt einmal die Pakete,

Jochen

die sozusagen von der Firma

Jochen

gebaut werden und ein Repository

Jochen

von Paketen, das halt

Jochen

also eine Distribution, die halt

Jochen

sozusagen redaktionell von

Jochen

Continuum Analytics gepflegt

Jochen

wird und es gibt halt

Jochen

ein Community-basiertes Repository,

Jochen

das nennt sich dann CondaForge

Jochen

und man kann das halt

Jochen

in dem, man hat immer so ein Konfigurations-File

Jochen

und da kann man

Jochen

halt die Channels sozusagen

Jochen

aus denen man Pakete bekommt, halt eintragen

Jochen

und ja, die meisten verwenden

Jochen

ContaForge. Es ist jetzt auch irgendwie so,

Jochen

dass, glaube ich,

Jochen

Anaconda selber irgendwie auf ContaForge umgestellt

Jochen

hat oder so. Ja, genau, die haben sich tatsächlich umgestellt.

Dominik

Das haben wir gehört auf dem Parkcamp jetzt.

Dominik

Ja, richtig, das hatte ich

Jochen

auch gar nicht klar, aber ja.

Nico

Das fand ich manchmal auch echt so ein bisschen nervig, wenn man ein Paket

Nico

installieren wollte, habe ich dann doch meistens mal gegoogelt,

Nico

was ist denn jetzt hier das richtige

Nico

Repo dafür und das ist jetzt aber

Nico

seitdem quasi weg.

Nico

Ja, ist tatsächlich anstrengend, wenn man halt schon

Dominik

unterschiedliche Paketmente hat und dann auch seine eigene Source

Dominik

dafür irgendwie bestimmen muss.

Dominik

Ich kann mich da an andere Experimente

Dominik

erinnern mit so Paketsachen und Sources.

Dominik

Alles nicht einfacher, aber

Jochen

hatten wir das schon erwähnt, warum man das überhaupt machen

Jochen

sollte? Ja, das Problem ist eben, dass die

Jochen

Pakete in der Distribution halt

Jochen

nicht wirklich aktuell sind meistens.

Jochen

Also, wie sagte Barry Varsaw,

Jochen

glaube ich, einer

Jochen

Python-Core-Entwickler

Jochen

sagt man mal, the first rule of Python

Jochen

is, you don't use system Python.

Jochen

Das ist halt einfach

Jochen

üblicherweise veraltet bei vielen

Jochen

Distributionen, weil sie halt auch das,

Jochen

weil sie Python halt auch für so

Jochen

distributionsinterne Zwecke benutzen, mit halt

Jochen

Python 2 irgendwie noch als Default-Interpreter

Jochen

bei Mac auch. Es gibt einen

Dominik

Counter für Python 2 mittlerweile, habt ihr den gesehen?

Dominik

Desk Clock, ja, gibt's.

Nico

Bin mal gespannt, wann die Vertriebssysteme es dann auch mal

Nico

sich trauen, also schon ein bisschen halbern so langsam.

Nico

Ja, die haben halt alle Angst davor,

Jochen

dass irgendwie, wenn sie das

Jochen

ändern, irgendwie ihre Installationsroutinen

Jochen

nicht mehr funktionieren, weil die halt Python brauchen und

Jochen

vielleicht noch nicht umgestellt sind. Und die sind halt

Jochen

alle uralt. Ja, doof.

Jochen

Und daher muss man

Jochen

sowieso eigentlich immer einen anderen

Jochen

Python-Interpreter verwenden, als der, der vorinstalliert

Jochen

ist. Und dann ist es

Jochen

halt so, wenn man unterschiedliche Projekte hat,

Jochen

dann haben die halt unterschiedliche

Jochen

Abhängigkeiten, was bestimmte Bibliotheken

Jochen

angeht. Und die

Jochen

widersprechen sich halt. Und das kriegt man halt auch,

Jochen

wenn man in einem Filesystem ist.

Jochen

und das kriegt man halt nicht irgendwie unter einen Hut.

Jochen

Und daher macht man normalerweise pro Projekt

Jochen

ein eigenes sozusagen virtuelles Environment,

Jochen

in dem man halt irgendwie alle Abhängigkeiten installiert,

Jochen

die man braucht.

Jochen

Ist dir schon mal vorgekommen,

Dominik

dass du für ein Projekt zwei Virtual Environments brauchtest,

Dominik

weil da innerhalb des Projektes

Dominik

sich unterschiedliche Module besprachen?

Dominik

Nee, das geht auch gar nicht.

Jochen

Oder ja, also natürlich doch, stimmt,

Jochen

man könnte es theoretisch machen,

Jochen

aber nee, das ist mir jetzt auch noch nicht untergekommen.

Jochen

Was meinst du innerhalb von einem Projekt?

Jochen

Ja, es könnte ja irgendwie sein,

Jochen

dass es zwei Module in einem Projekt gibt,

Dominik

die unterschiedliche Versionen brauchen,

Dominik

Python-Version, weil die Module das sonst nicht können

Dominik

und die man dann irgendwie pipen muss, damit die

Dominik

man da reden kann. Und um das dann zu bauen,

Dominik

müsste man halt dann zwei Versionen benutzen.

Jochen

Nehmen wir zum Beispiel mal an, man hätte

Jochen

ein OCR-Projekt und man möchte jetzt

Jochen

irgendwie ein aktuelles

Jochen

Ding gegen was Älteres

Jochen

wie Oceropi oder

Jochen

Kraken oder so verwenden.

Jochen

Angenommen, Kraken kann auch Python 3, aber

Jochen

Oceropi kann nur, oder Oceropus

Jochen

kann nur Python 2. Und jetzt möchte man

Jochen

halt das Ding aber testen gegen was Neues,

Jochen

was halt vielleicht nur Python 3 kann. Und dann müsste man

Jochen

zwei Interpreter halt haben, irgendwie

Jochen

in dem, ja, das wäre

Jochen

hässlich.

Nico

Aber ich glaube, so kompliziert müssen wir es gar nicht

Nico

machen.

Nico

Also wenn ihr euch inzwischen das Repo ausgeklont

Nico

habt, dann ist jetzt vielleicht der

Nico

richtige Moment, einmal corner.env.create

Nico

auszuführen, um die Umgebung euch aufzusetzen.

Nico

Was an der Stelle ja passiert ist,

Nico

er zieht sich von lokal eben

Nico

eine hinterlegte

Nico

Environment-Datei, die

Nico

die ganzen Pakete und die jeweiligen

Nico

Versionen beinhaltet, die man bitte

Nico

zu installieren hat.

Nico

Und danach kann man das dann eben aktivieren

Nico

und hat das dann quasi als sein

Nico

Default-Python-Interpreter gesetzt.

Dominik

Also Connor M. Great macht dann genau das,

Dominik

dass er einfach ein Environment setzt, die heißt dann

Jochen

Great, oder was? Ne, das steht in dem

Jochen

in dem File halt

Jochen

auch mit drin. Der Name von dem?

Jochen

Von dem

Jochen

Environment, genau.

Jochen

Warte mal.

Jochen

Das ist auch einfach ein YAML-File

Jochen

und da steht dann eben das erste Name

Jochen

ds-tutorial

Dominik

ds-tutorial und dann dependencies,

Dominik

ach, und dann werden die Pakete danach geploppt.

Jochen

Und, achso, ist auch so, man kann halt

Jochen

auch Sachen

Jochen

per PIP installieren.

Jochen

Ja, das ist auch sowas, also es ist halt irgendwie,

Jochen

ja, Conda ist quasi

Jochen

eine echte Obermenge von PIP,

Jochen

man kann halt Conda und halt auch PIP,

Jochen

aber umgekehrt geht es halt nicht, PIP kann halt nicht

Jochen

Conda Sachen installieren.

Jochen

Ja, und manche Sachen installiere ich

Jochen

via PIP, weil das einfach aktuellere Versionen

Jochen

dann sind.

Nico

Ja, oder halt, wenn man was sehr Spezielles

Nico

will, ist es vielleicht auch nicht unbedingt immer

Nico

in jedem Conda-Repository eben drin.

Nico

Da ist PIP, glaube ich, einfach ein bisschen

Dominik

größer. Also ich kann auch einfach die Version angeben,

Dominik

wie bei PIP auch, mit gleich oder sowas.

Dominik

Genau.

Nico

Genau. Und danach müsst ihr, um das Repo

Nico

quasi so ausführen zu können, noch mal

Nico

das lokale Paket bauen

Nico

und zwar mit "-e".

Nico

Warum wollen wir denn

Nico

erstmal überhaupt ein lokales Paket

Nico

und warum wollen wir "-e"?

Jochen

Ja, ein lokales Paket

Jochen

deswegen, weil man in

Jochen

vielen Notebooks halt, also ich habe das

Jochen

Ganze quasi ein bisschen in unterschiedliche

Jochen

Notebooks aufgeteilt und da gibt es dann

Jochen

einige, die halt immer wieder den gleichen

Jochen

Code enthalten. Und jetzt könnte man

Jochen

natürlich auch in jedes Notebook irgendwie reinkopieren,

Jochen

aber wenn man dann gemerkt hat, oh, ich habe hier

Jochen

einen blöden Fehler gemacht, dann muss man das halt auch

Jochen

in allen Notebooks wieder ändern, was ja ein bisschen

Jochen

umständlich wäre. Und Code, den man halt

Jochen

in mehreren unterschiedlichen Notebooks

Jochen

benötigt, den

Jochen

kann man ja aber auch einfach eine

Jochen

Bibliothek und das ist halt im Grunde

Jochen

dieses Paket, was man da installiert,

Jochen

rausziehen und

Jochen

den importiert man dann halt einfach nur in

Jochen

allen Notebooks und wenn man da jetzt einen Fehler

Jochen

fixt, dann ist der halt

Jochen

in allen Notebooks gleichzeitig gefixt

Jochen

und Minus E installiert man

Jochen

deswegen, um Änderungen,

Jochen

wenn man da jetzt eine Änderung macht,

Jochen

die sofort sichtbar

Jochen

werden zu lassen. Also ansonsten müsste man

Jochen

ja eigentlich, wenn man ein Paket

Jochen

zum Beispiel via PyPI oder so

Jochen

installiert oder normal installiert sozusagen,

Jochen

jedes Mal, wenn man was ändert, ein neues Paket bauen

Jochen

und dann dieses Paket wieder installieren.

Jochen

Und am besten auch nochmal das Notebook neu starten.

Jochen

Und das ist natürlich ein bisschen umständlich.

Jochen

Und wenn man sagt pip install –i,

Jochen

dann macht das sozusagen keine wirkliche Paketsinstallation,

Jochen

sondern legt nur einen Link auf das entsprechende Verzeichnis

Jochen

sozusagen mit nach Side-Packages.

Jochen

Und wenn sich da irgendwas ändert am Code,

Jochen

dann ist das halt sofort irgendwie sichtbar.

Jochen

Und dann kann man das auch für alle einstellen

Jochen

oder für einige auf Notebook-Seite kann man zum Beispiel sagen,

Jochen

A-Import statt Import, ein bestimmtes Modul,

Jochen

dann wird halt die Aktualisierung auch sofort wirksam,

Jochen

ohne dass man das neu starten muss, was ja auch praktisch ist.

Jochen

Also man kann das sehr feigengranulär einstellen.

Jochen

Man will das vielleicht auch nicht für alle Module machen, aber wenn man das richtig eingestellt hat, sozusagen, kann man halt, wenn man jetzt beispielsweise bei einem Code-Teil, der halt in vielen Notebooks verwendet wird, einen Teil ändert, dann ist die Änderung sofort da und bei der nächsten Ausführung einer Zelle hat man halt auch schon den geänderten Code mit ausgeführt und muss da nichts neu installieren, neu starten oder so.

Nico

Da kann ich auch jeden nur zu ermutigen,

Nico

zu gehen. Also ich habe mich da am Anfang lange

Nico

vorgescheut und habe einfach quasi

Nico

am Anfang von meinem Notebook einfach immer

Nico

mit der Runmagic quasi

Nico

in ein anderes Notebook gestartet, wo ich alle diese

Nico

Sachen initialisiert habe. Das geht auch.

Nico

Aber das muss man halt dann doch, wenn man

Nico

in einem anderen Notebook was ändert, immer noch einmal ausführen.

Nico

Und so viel

Nico

Zauber ist es gar nicht, quasi sich selber

Nico

so ein Paket zu erstellen. Vor allem ist es auch ein ganz cooles

Nico

Gefühl. Man kann es danach auch wirklich direkt mal weitergeben

Nico

und weiterleiten und es

Nico

verleitet zu ein bisschen besserer

Nico

Ja, Art Software-Code dann auch zu schreiben

Nico

an der Stelle. Man kann dann eine ordentliche

Nico

IDI dafür vielleicht auch benutzen und

Nico

entwickelt dann diese ausgelagerte

Nico

Funktionalität vielleicht nicht direkt im Notebook.

Nico

Welche IDI benutzt du?

Nico

PyCharm, halt ganz klassisch, wie die meisten, glaube ich.

Nico

Wir sind beides umgestiegen auf Visual Studio.

Nico

Studio Code? Ah ja, okay.

Jochen

Ich benutze immer noch alles. Also ich benutze

Jochen

auch immer noch, also vor allen Dingen häufig

Jochen

eigentlich Wim.

Jochen

Ich benutze auch PyCharm und auch VS Code.

Dominik

Ich hatte das mir auch gezeigt.

Jochen

Ja, ist schon ziemlich gut, muss man sagen.

Jochen

Genau. Ich meine, am Anfang ist so ein bisschen

Nico

overhead mit dem Anlegen von so einer Klasse da,

Nico

aber ihr benutzt, glaube ich, so

Nico

Cookie-Cutter-Templates. Ja.

Nico

Ich benutze PyScaffold,

Nico

was ein Projekt ist, was von Kollegen

Nico

von mir entwickelt wird, was mir da sehr geholfen

Nico

hat, einfach am Anfang quasi so

Nico

Scaffolding, mir

Nico

mein Gerüst einmal aufzusetzen, da kenne ich mich

Nico

dann direkt drin aus und dann dränge ich dann noch meine zwei, drei

Nico

Zeilen ein und ja, bin gleich

Nico

da und das hat mir so ein bisschen

Nico

die Angst davor genommen, eigene Pakete

Nico

an der Stelle zu schreiben.

Nico

Ja, genau.

Nico

Gut, und dann

Nico

können wir letztendlich wirklich unser

Nico

Notebook starten.

Nico

Du benutzt noch Jupyter

Nico

Notebooks. Ja, stimmt.

Nico

Magst du JupyterLab lieber, also

Nico

warum magst du kein JupyterLab?

Jochen

Doch, stimmt, mag ich auch.

Jochen

Das ist jetzt auch nur so reine Gewohnheit eigentlich.

Jochen

Aber ja, eigentlich im Grunde

Jochen

müsste ich auch mal auf JupyterLab umsteigen.

Jochen

Ja.

Nico

Genau, also gerade die neuen Versionen mit den Plugins

Nico

finde ich, es kommt, also am Anfang

Nico

haben wir noch ein paar Funktionalitäten von JupyterNotebooks

Nico

gefehlt, aber jetzt

Nico

gerade mit dem sich ausbreitenden

Nico

Plugin-System gibt es da echt coole

Nico

Sachen, zum Beispiel, was ich total liebe

Nico

gerade, ist halt die Sublime Keybinding

Nico

Magic-Funktionalität, die man jetzt einfach

Nico

sich so in die JupyterLab

Nico

Notebooks reinladen kann.

Nico

Und so. Aber genau.

Nico

Ja, ja, ja, nee,

Jochen

das, genau, das hatte ich auch, habe ich auch schon lange vor.

Jochen

Ich habe es halt bisher nur immer ausprobiert, aber noch nicht

Jochen

wirklich verwendet.

Jochen

Und genau, ja, nee, sieht sehr, sehr gut aus.

Jochen

JupyterLab ist, ja.

Jochen

Genau.

Nico

So, egal, ob ihr jetzt ein

Nico

Jupyter Notebook oder ein ehemaliger,

Nico

ja, egal, ob ihr jetzt ein Jupyter

Nico

Notebook oder halt schon JupyterLab gestartet

Nico

habt, müsstet ihr jetzt quasi

Nico

eine Reihe an

Nico

Ordnern sehen und

Nico

im DS-Tutorial,

Nico

nee, im

Nico

Ordner Notebooks gibt es halt eben

Nico

das Projekt Text Classification

Nico

und dem wollen wir uns mal ein bisschen widmen.

Nico

Genau. Ja,

Nico

vielleicht kann man einfach direkt mal das

Jochen

Explorer Data Notebook aufmachen.

Jochen

Das ist

Jochen

das Dataset, also

Jochen

ist man natürlich auch mal ein bisschen darauf angewiesen, dass es

Jochen

halt irgendein frei verfügbares

Jochen

Dataset gibt, das ich

Jochen

da verwendet habe, ist

Jochen

Reuters

Jochen

21578

Jochen

Textklassifikations

Jochen

Dataset, das ist so ein klassisches Ding,

Jochen

wo

Jochen

irgendwie eben entsprechend viele

Jochen

21578

Jochen

so Ticker

Jochen

Meldungen drin sind

Jochen

und die sind halt klassifiziert

Jochen

in

Jochen

unterschiedliche Kategorien und

Jochen

bei dem Set geht es auch

Jochen

im Grunde darum, Modelle zu

Jochen

bauen oder das benutzt man eigentlich mal

Jochen

als Trainingsdatum

Jochen

für

Jochen

Textklassifikationsmodelle,

Jochen

weil man halt dann damit vorhersagen kann,

Jochen

versucht zu vorhersagen, wenn man jetzt

Jochen

eine neue Tickermeldung reinbekommt, welche Kategorie ist

Jochen

das? Also es ist im Grunde so ähnlich wie das

Jochen

Spam-Klassifikationsbeispiel

Jochen

von eben, nur dass man halt nicht

Jochen

nur zwischen Spam und Nicht-Spam unterscheiden

Jochen

können will, sondern halt zwischen

Jochen

allen Kategorien, in denen halt

Jochen

so eine Tickermeldung liegen kann

Jochen

beziehungsweise auch noch ein Unterschied ist,

Jochen

es ist nicht, man würde,

Jochen

das wäre jetzt Multiclass, wenn es nur eine gäbe,

Jochen

aber das ist eigentlich ein Multilabel

Jochen

Dataset, das heißt, man möchte

Jochen

alle Kategorien, in denen so

Jochen

eine Ticker-Meldung

Jochen

drin liegt, rausfinden.

Jochen

Also vielleicht halt auch, es gibt welche,

Jochen

die halt, wo es

Jochen

nicht nur um Politik geht oder Sport, sondern auch

Jochen

Sport und Politik oder sowas.

Jochen

Genau.

Nico

Das Erste, was man, finde ich, bei so einem Datascience-Projekt

Nico

ja am Anfang immer machen muss, vor

Nico

lauter Tools und Frameworks und sonst was.

Nico

Das Wichtigste sind immer noch die Daten.

Nico

Und wenn die Daten nicht passen, dann hilft es nicht.

Nico

Und da muss man sich halt echt erstmal reinknien

Nico

und richtig verstehen, was haben wir denn da überhaupt alles.

Nico

Und

Nico

ich weiß nicht, da gibt es so ein paar Befehle, die ich immer

Nico

als erstes so benutze. Also ich lad

Nico

mir mein Dataset irgendwie

Nico

in Pandas DataFrame rein.

Nico

Und

Nico

dann nutze ich darauf erstmal

Nico

meist ein Head, um einfach mal zu gucken, was

Nico

habe ich überhaupt drin. Dann

Nico

D-Types, um mir anzugucken,

Nico

okay, welche Spalten haben denn hier

Nico

welchen Typ? Und danach

Nico

mache ich dann eben einen Describe,

Nico

was mir dann für alle numerischen

Nico

Spalten da drin schon mal so ein bisschen

Nico

eine erste Übersichtsstatistik gibt.

Nico

Also irgendwie, wie viele Einträge habe ich?

Nico

Was ist der Mittelwert?

Nico

Was sind quasi die Maximalwerte?

Nico

Und so weiter. Machst du das ähnlich?

Nico

Oder wie gehst du? Ja, ja, doch, durchaus.

Jochen

Also ich habe das jetzt auch hier

Jochen

gerade nochmal ausgeführt.

Jochen

Genau, ja, also wenn man jetzt zum Beispiel einige der ersten Zeilen ausgeführt hat, dann hat man hier auch eben ein Data-Frame, in dem all die Dokumente halt drin sind und wenn man DF-Head macht, dann sieht man halt eine Spalte Mod-Update, das ist halt sozusagen so der klassische Split in Trainings- und Testdaten.

Jochen

Das ist halt auch ganz praktisch bei dem Dataset, dass man das nicht selber machen muss, weil das ist halt auch noch, eigentlich müsste man dann irgendwie erklären, was Cross-Validation ist und wie man K-Fault-Cross-Validation, hier ist das schon fertig.

Jochen

Da muss man sich dann keine Gedanken mehr drum machen,

Jochen

sozusagen. Das ist vielleicht ganz gut.

Jochen

Dann gibt es eine Spalte mit den

Jochen

Kategorien drin. Das ist dann einfach nur eine Liste der

Jochen

Kategorien,

Jochen

in denen halt diese

Jochen

Meldung halt drin ist.

Jochen

Und genau, das Ganze nochmal

Jochen

sozusagen nicht als

Jochen

Textkategorie, sondern eben

Jochen

numerisches Label, weil

Jochen

wenn man später das an irgendwelche Modelle

Jochen

verfüttert, dann brauchen die das halt als

Jochen

ja, als

Jochen

Zahl und am besten auch

Jochen

als Zahlen, die halt keine Lücken haben.

Jochen

Sonst geht das halt nicht gut, weil man

Jochen

das halt, One-Hot-Encoded

Jochen

nimmt man das sozusagen, hinterher kriegt

Jochen

halt jedes Label eine eigene

Jochen

Spalte und das geht eigentlich natürlich nur dann

Jochen

gut, wenn das halt irgendwie keine Lücken hat.

Jochen

Ja, dann gibt es da irgendwie

Jochen

noch ein Datum, was da dran ist,

Jochen

einen Titel, irgendeine komische

Jochen

Dateline, ich weiß jetzt gar nicht genau, was das ist und ein Body

Jochen

von dem Artikel,

Jochen

dann noch eine ID und

Jochen

ich glaube, das habe ich irgendwie mal dran gebastelt,

Jochen

einfach nur um,

Jochen

weil die Idee war halt,

Jochen

dass in dieser

Jochen

Machine Learning-Schulung

Jochen

man

Jochen

ja, als Übung sozusagen

Jochen

vielleicht ein paar neue Features dazu tun sollte,

Jochen

um zu gucken, ob das irgendwie die

Jochen

mit, ob das den Score irgendwie

Jochen

verbessert, der Modelle. Und da war

Jochen

halt so ein erstes Beispiel, man könnte einfach mal

Jochen

den Wochentag reinschreiben, der

Jochen

an dem das irgendwie erschienen ist

Jochen

und vielleicht steckt da ja irgendwelche Informationen drin.

Jochen

ja genau, DF-Info

Dominik

Wenn ihr irgendwie wissen wollt, wie man

Dominik

mit diesen Data-Frame-Operationen noch

Dominik

ein bisschen besser einen Einstieg findet, da gibt es ein ganz spannendes

Dominik

Buch von Jake Wanderplast zu

Dominik

Data Science mit Python, das hat er

Dominik

auch frei auf seinem GitHub-Account

Dominik

veröffentlicht und auf einer Webseite

Dominik

findet ihr irgendwie, da kann man auch mit

Dominik

Dupade der Notebooks das tatsächlich auch mal live noch an anderen

Dominik

Datensätzen üben, also gerade für Pandas

Dominik

Einführung ist da nochmal ein großes Kapitel

Jochen

Ja, also die Pandas-Dokumentation

Jochen

ist auch ziemlich gut, die ist halt nur etwas

Jochen

länglich und trocken, aber ansonsten ist sie auch super

Jochen

zu empfehlen.

Jochen

Und ja, ich finde

Jochen

die Modern Pandas

Jochen

Blogartikel-Serie von Tom Augsburger

Jochen

auch super.

Jochen

Was ich ansonsten immer noch ganz gerne

Nico

mache, wenn ich am Anfang so ein Dataset habe, es gibt

Nico

eine Library, die nennt sich Pandas Profiling.

Nico

Der wirft so einfach so ein DataFrame rein

Nico

und die generiert dir daraus so einen

Nico

kleinen HTML-Report,

Nico

worin man dann quasi so ein paar

Nico

Summary-Statistiken nochmal ein bisschen hübscher aufbereiten

Nico

bekommt. Das sieht ja auch super aus.

Nico

Wie viele Zeilen hast du, wie viele

Nico

Spalten natürlich. Aber dann schaut die halt eben

Nico

auch quasi, wie viel Prozent der Daten sind jetzt

Nico

halt irgendwie fehlen, sind Nullwerte.

Nico

Du kriegst

Nico

eine Übersicht quasi, welche Typen

Nico

hat das Ganze und der sucht auch quasi

Nico

nach Korrelationen in den Daten. Also wenn du jetzt

Nico

zwei Spalten hast, wo du eben zum Beispiel

Nico

schon so ein Feature Engineering gemacht hast und

Nico

hast, keine Ahnung,

Nico

den Tag und dann nochmal

Nico

irgendwie den Tag um ein Jahr

Nico

verschoben oder so, dann korrelieren diese

Nico

beiden Spalten ja komplett, sowas würdest du dann

Nico

da drin direkt sehen und der würde dich zum Beispiel

Nico

vorwarnen.

Dominik

Ja, das wäre ganz praktisch, wenn man die cleanen muss, dann irgendwie

Dominik

erstmal so zu gucken, ah ja, das könnte ja ein Problem

Dominik

sein, dann fangen wir doch mal an da oder so.

Dominik

Genau.

Nico

Genau, das ist immer irgendwie, finde ich, ganz praktisch,

Nico

um so einen ersten

Nico

Übersicht zu bekommen.

Dominik

Was würdet ihr dann machen? Würdet ihr dann die Daten, die dann da

Dominik

zum Beispiel fehlen, irgendwie versuchen zu füllen?

Dominik

Oder lässt man dann einfach

Dominik

erstmal die Spalten weg, weil die irgendwie Quatsch sind?

Dominik

Ja.

Dominik

Kommt halt komplett drauf an.

Dominik

Ja.

Dominik

Also, was du jetzt ansprichst,

Nico

ist ja Ausreißerbereinigung im Wesentlichen

Nico

und Nullwerte füllen.

Nico

Die Frage ist, warum fehlen die Werte

Nico

und kannst du sie sinnvoll ersetzen?

Nico

Also, im Endeffekt hat man drei Optionen.

Nico

Man wirft die Daten einfach weg.

Nico

Man versucht sie zu füllen

Nico

mit einem Art von statistischem Maß,

Nico

was quasi zum Beispiel den Durchschnitt

Nico

von allen Spalten wiedergibt.

Nico

Oder, vielleicht habe ich ja nur die beiden Optionen.

Nico

Ich dachte, ich hätte nur eine dritte.

Nico

Ja, man könnte ja irgendwie.

Jochen

Es gibt diverse, also man kann auch bei,

Jochen

also es gibt dann Cyclic Learn zum Beispiel,

Jochen

das ist so eine Bibliothek für Maschinen und Geschichten,

Jochen

diverse, unterschiedliche, also da ist die Oberklasse quasi

Jochen

für all diese Verfahren im Pewter

Jochen

und man kann halt diverse unterschiedliche benutzen,

Jochen

um eine Strategie dafür zu haben,

Jochen

weil eben, es kommt halt darauf an,

Jochen

wofür man die, was der Grund dafür ist,

Jochen

warum das fehlt und wie man das am besten ausgleicht.

Jochen

die dann sozusagen da irgendwas reinschreiben

Jochen

oder irgendwas mit den Daten machen, ja.

Dominik

Ja, die Frage ist halt, ob man die rausrechnen kann,

Dominik

die Daten oder nicht, also ob das sinnvoll ist

Dominik

und was man halt mit der Spalte sonst macht

Dominik

oder mit den Datensätzen, die fehlen oder Korrelationen,

Dominik

ob man da einen Dummy reinsetzt, weil man den noch irgendwie braucht

Dominik

und dann immer merkt, oh, das ist das bei dem Dummy so.

Nico

Ja, und auch, wie rum droppst du sie, wenn du sie droppst?

Nico

Also schmeißt du die Zeilen raus oder schmeißt du die Spalten raus?

Nico

Hängt halt immer von dem Tast ab.

Nico

Ja, aber das sieht man genau gerade.

Dominik

man hat ja irgendwie die Warnings gesehen, wie viel irgendwie

Dominik

das ganz viele aus einer Teile oder

Dominik

Spalte dann da fehlen oder so bei irgendwelchen Einträgen.

Dominik

War bei den Warnings irgendwie mit dabei. Wie hieß das nochmal?

Nico

Ich hab das... Pandas Profiling.

Nico

Profiling, okay. Genau. Interessant.

Nico

Muss auf jeden Fall auch in die Shownotes.

Nico

Mach ich.

Nico

Ja, genau.

Nico

Also, hängt halt

Nico

dann immer auch von den Operationen ab,

Nico

die man halt danach drauf irgendwie anwenden möchte.

Nico

Genau. Ansonsten ist, glaube ich,

Nico

so eine gute Möglichkeit, am Anfang

Nico

sich auch nochmal so ein bisschen einfach erstmal zu plotten.

Nico

Also irgendwie diese statistischen Maße

Nico

sind immer irgendwie ganz nett, um

Nico

ein erstes Gefühl zu bekommen, wie groß ist

Nico

denn meine Spanne an Werten und so weiter.

Nico

Aber

Nico

da können halt einzelne Ausreißer das Ganze

Nico

eben ja komplett verziehen.

Nico

Oder ich habe zum Beispiel so einen leichten Shift

Nico

in den Daten, sowas in Kennzahlen zu erfassen

Nico

geht zwar, aber ist irgendwie immer nicht ganz so

Nico

eingängig. Und dann hilft halt meist

Nico

erstmal irgendwie so ein Histogramm oder so.

Jochen

Ja, genau. Würde ich auch sagen,

Jochen

dass

Jochen

Das ist das nützlichste Ding, wenn man so ein bisschen sehen will, wie das eigentlich verteilt ist.

Jochen

Oft ist es halt, sich ein Histogramm von der Werte anzugucken.

Jochen

Vor allen Dingen auch, wenn man jetzt unterschiedliche Klassen hat, einfach mal die Histogramme gegeneinander zu plotten.

Jochen

Das ist etwas, was ich mir oft angucke, um zu sehen, ob das irgendwas ist, wo interessante Informationen für Klassifikationen oder so drinsteht.

Jochen

dass man halt sagt so, okay, man plottet

Jochen

das Histogramm der einen Klasse gegen das der anderen

Jochen

und man halt sieht, okay, da gibt es einen großen Unterschied, dann ist

Jochen

schon mal, oder auch selbst ein kleiner

Jochen

Unterschied ist natürlich schon hilfreich irgendwie.

Jochen

Wenn man sieht, die sind genau gleich verteilt, dann ist das natürlich doof.

Jochen

Aber genau.

Jochen

Genau, in dem

Nico

Explore-Data-Monbook sieht man auch ganz unten

Nico

eben, finde ich, ein ganz klassisches, aber

Nico

sehr, sehr hilfreiches Diagramm an der Stelle,

Nico

wo du einfach mal so die

Nico

Länge der Texte

Nico

abgetragen hast, den Zeichen,

Nico

und da sieht man auch so ein ganz typisches Verhalten.

Nico

Man hat halt irgendwie so einen Peak der Daten, der relativ am Anfang liegt. Also irgendwie, wir haben ja jetzt, würde ich sagen, wahrscheinlich mal 80 Prozent irgendwie im Bereich von 0 bis 600 Zeichen oder bis 750, glaube ich, sind das. Und dann wird es weniger und dann gibt es so einen Longtail hinten mit so ein paar einzelnen Einträgen, die dann halt irgendwie 3.000, 4.000, 5.000, 6.000 plus Einträge haben.

Dominik

Irgendwann hat ja jemand sein Buch bei Reuters hochgeladen, oder?

Nico

Ja, genau. Aber das ist so ein ganz klassisches Problem, was man halt im echten Welt-Data-Science halt immer hat, dass es halt irgendwie so Ausreißer gibt, die die Degagramme verzerren und die dann auch immer den Aufwand beim Programmieren eigentlich bedeuten, weil das dann immer die Fälle sind, an die man vielleicht so nicht gedacht hat.

Jochen

Ja, genau. Ja, wir sehen hier, dass es halt so irgendwie ungefähr 10.000 Dinge gibt, die irgendwie Test oder Training zugeordnet sind. Also dieser Mod-Up-Split teilt diese Ticker-Meldung halt in die, auf denen man trainieren kann und die sozusagen, die man hinterher benutzt, um zu evaluieren, wie gut denn jetzt die Modelle funktioniert haben.

Jochen

es gibt 119 Klassen, aber

Jochen

tatsächlich sind es

Jochen

deutlich weniger, wenn man jetzt

Jochen

alle

Jochen

Also gibt es so

Dominik

Meta-Superklassen quasi, die bestimmte Dinge

Dominik

beinhalten, sowas wie Sport und dann gibt es

Dominik

Unterkategorien, Fußball, Hockey.

Jochen

Es gibt einige, die deutlich häufiger sind,

Jochen

aber es ist halt so, dass

Jochen

wenn man jetzt alle rausnimmt,

Jochen

auch alle Beispiele rausnimmt,

Jochen

alle Kategorien rausnimmt, zu denen es nicht mindestens

Jochen

ein Trainings- und ein Testbeispiel

Jochen

gibt, weil das ist ja auch irgendwie so ein bisschen sinnlos.

Jochen

Also Sachen, die man nicht gesehen hat, kann man auch schlecht vorhersagen.

Jochen

Dann sind es

Jochen

nochmal deutlich weniger, sind es irgendwie nur 90 Kategorien,

Jochen

die übrig bleiben, glaube ich, und halt irgendwie

Jochen

Vielleicht sind die Kategorien herausgefallen, so Donziges oder so.

Jochen

Ja, ich weiß

Jochen

es gar nicht genau. Ich habe es mir auch nicht

Jochen

angeguckt, was das genau für Kategorien sind, aber

Jochen

ja, also

Jochen

das sind tatsächlich die Zahlen für alle, aber

Jochen

in Wirklichkeit

Jochen

ist es halt nochmal ein bisschen weniger.

Jochen

Also die dann hinterher tatsächlich

Jochen

zum Trainieren verwendet werden, dann

Jochen

eben durchschnittliche Anzahl

Jochen

von Wörtern ist halt irgendwie auch so 90

Jochen

und

Jochen

genau, die

Jochen

also es gibt so eine Quote

Jochen

Anzahl der Beispiele,

Jochen

also das ist sozusagen Anzahl der Zeilen im DataFrame

Jochen

geteilt durch die Anzahl der Wörter

Jochen

pro

Jochen

Tickermeldung, ist halt auch

Jochen

eine ganz

Jochen

interessante Zahl, die man später benutzen kann,

Jochen

um halt irgendwie rauszukriegen,

Jochen

welche Art von Modell da irgendwie besser

Jochen

funktionieren könnte.

Jochen

Ja,

Jochen

genau, also überhaupt diese ganze,

Jochen

also das ist halt irgendwie explorative Phase

Jochen

irgendwie bei so einem Projekt.

Jochen

Man versucht halt rauszukriegen, gibt es

Jochen

irgendwelche interessanten Regelmäßigkeiten,

Jochen

wie groß sind die Daten,

Jochen

was prinzipiell kann ich da eigentlich

Jochen

für Modelle verwenden und so.

Dominik

Also erstmal visualisieren ist glaube ich tatsächlich

Dominik

die beste Idee. Auch verschiedene Arten, mal gucken,

Dominik

Wordcloud bauen vielleicht oder so und dann

Dominik

schauen, was ist das denn.

Nico

Und nebenher finde ich durchaus irgendwie nochmal so ein Scratchpad

Nico

offen haben und wenn man da irgendwie eine

Nico

Auffälligkeit hat, die immer gleich

Nico

reinschreiben. Also man verfällt dann

Nico

finde ich auch relativ leicht in so einem

Nico

Liebe zu Charts, weil

Nico

so Charts basteln ist was, was ich

Nico

zum Beispiel total gerne mache. Also ich finde es

Nico

total spannend, dann mir die Daten

Nico

irgendwie so in Diagrammen zu visualisieren

Nico

und die irgendwie hübsch zu machen und mächtig

Nico

von ihrer Aussagekraft und so weiter, aber

Nico

dabei verfalle ich da manchmal

Nico

so ein bisschen in der Liebe zum Tun

Nico

und eigentlich geht es ja darum

Nico

Insights zu generieren. Deswegen

Nico

finde ich es dann immer relativ wichtig, sich irgendwo

Nico

nochmal so eine Liste runterzuschreiben mit den Auffälligkeiten,

Nico

wo man so gedacht hat, ah ja, stimmt,

Nico

das ist ja interessant und das ist interessant,

Nico

weil im Endeffekt sind das nachher dann Sachen,

Nico

aus denen man dann Ideen bekommt,

Nico

um zum Beispiel Features zu generieren,

Nico

die dann eben meinem Modell wirklich

Nico

weiterhelfen könnten.

Nico

Ja, also das ist halt an der Stelle auch definitiv

Nico

dann ein iterativer Prozess,

Nico

wo man quasi

Nico

sich die Daten anschaut, man entwickelt

Nico

eine Idee dafür, man probiert sie aus und

Nico

Man geht dann wieder zurück und guckt sich mal wieder die Daten an und guckt, ah ja, jetzt habe ich aber ja ein besseres Verständnis dafür bekommen, weil ja, da ist so viel Information in so einem Datensystem, dass es eine ganze Zeit lang braucht, bis man wirklich versteht, was man damit alles machen könnte.

Dominik

Da muss man sich natürlich auch immer das Problem erstmal so ein bisschen reindenken, damit man irgendwie dann mit den Daten überhaupt was anfangen kann.

Jochen

Ja, genau und ja.

Dominik

Dabei hilft halt diese explorative Sache.

Dominik

Und ja,

Dominik

neben diesem ganzen Histogramm, ich glaube,

Dominik

wir haben angefangen erstmal mit, wie man die Daten noch bekommt.

Dominik

Damit waren wir noch gar nicht so durch.

Dominik

Achso, richtig. Ja, stimmt.

Dominik

Wir sollten irgendwie noch so die Art und Weise der Methode,

Dominik

wir haben jetzt irgendwie das Describe von DataFrames

Dominik

ein bisschen gemacht, aber wie bekomme ich denn die Daten

Dominik

überhaupt irgendwie so rein? Das ist ein guter Punkt, ja.

Dominik

Ja, also

Jochen

das ist irgendwie eine

Jochen

URL, die da irgendwo

Jochen

mit drin steht. Moment, ich glaube,

Jochen

das ist jetzt mittlerweile gut versteckt irgendwie

Jochen

in dem

Jochen

DS-Tutorial-Paket

Jochen

Datasets, da gibt es so ein

Nico

Pfeil. Genau, normalerweise in der echten Welt

Nico

würde ich sagen, ist der Pfeil meist, entweder

Nico

habe ich den CSV irgendwo rübergeworfen bekommen,

Nico

dann lese ich die einfach über Pandas ein, oder

Nico

ich habe halt irgendwie für ein Spielprojekt

Nico

eine Web-URL, dann ziehe ich es mir direkt

Nico

von dort. Kann man ja

Nico

direkt auch mit Pandas, glaube ich.

Dominik

Oder eigene Webdaten-Scrapes mit einer eigenen Datenbank oder

Dominik

sowas. Oder von irgendwelchen Sendoren,

Dominik

die Sachen in irgendeine Datenbank packen.

Nico

Eine Datenbank-Anbindung ist natürlich auch ein guter Punkt,

Nico

definitiv. Ist irgendwie in der

Nico

echten Welt gefühlt zu selten bei so

Nico

Notebooks. Irgendwie landen die Dateien dann doch immer

Nico

als Datei da, aber

Nico

genau, in dem Fall ist es ja relativ

Nico

tief im Code direkt versteckt, wie du es lädst.

Nico

Also wenn die Dateien da laden,

Dominik

also wirklich big ist die Datei dann aber irgendwie noch nicht.

Dominik

Nee, das hier ist alles

Dominik

super, super small.

Nico

Man will in so einem Notebook auch kein Big Data

Nico

haben. Kann man

Nico

schon, aber... Kann man schon,

Nico

aber ich weiß nicht,

Nico

Also meine Präferenz an der Stelle ist

Nico

vor allem immer erstmal auch Latenz niedrig zu halten

Nico

und schnell mit Daten zu iterieren

Nico

und lieber erstmal ein kleines Sample ziehen

Nico

und erstmal viel Zeit mit diesem kleinen Sample

Nico

zu verbringen und dann

Nico

natürlich sehr bewusst wählen,

Nico

wie wähle ich jetzt mein Sample? Mache ich es wirklich

Nico

komplett random oder habe ich eine Zeitreihe? Muss ich jetzt gewisse

Nico

Aspekte dabei berücksichtigen?

Nico

Aber erstmal darauf eine Weile iterieren

Nico

und dann sich nachher

Nico

die Modelle auf dem Kompletten ausprobieren.

Nico

Machst du das anders?

Jochen

Nee, nee, also genau. Subsamplen

Jochen

ist halt auch, wenn die Daten groß sind, auf jeden Fall

Jochen

eine super Strategie, um halt

Jochen

schnell integrieren zu können.

Jochen

Man kann aber, wenn man jetzt

Jochen

tatsächlich irgendwie

Jochen

größere Daten hat

Jochen

und das auch nicht irgendwie vielleicht

Jochen

kleiner machen will,

Jochen

sich zum Beispiel von, dann importiert

Jochen

man sich halt ein DataFrame nicht direkt von Pandas

Jochen

sozusagen, sondern man importiert das halt von

Jochen

Dask und

Jochen

das Ding

Jochen

verteilt dann automatisch

Jochen

irgendwie die Sachen, die man da drauf tut, halt auf

Jochen

zum Beispiel, das ist schon

Jochen

ziemlich cool, das hat eine Anbindung an

Jochen

Kubernetes und halt auch an die ganzen

Jochen

Cloud-Geschichten wie so

Jochen

Google Computer Engine und so

Jochen

und da kann man dann halt einfach sagen,

Jochen

okay, ich nehme mir jetzt mal so hier 100 Maschinen

Jochen

und füge die dann

Jochen

hinzu und man kann auch

Jochen

während Sachen da drauf laufen, also

Jochen

während man auf einem DataFrame halt irgendwas

Jochen

gruppiert oder so, kann man sagen, okay, ach,

Jochen

das geht mir zu langsam, nochmal 10 Maschinen dazu oder so

Jochen

und dann wird das

Jochen

automatisch halt irgendwie,

Jochen

werden die mit reingenommen und

Jochen

werden die Sachen halt irgendwie magisch schneller

Jochen

und man sieht halt auch irgendwie sehr schön,

Jochen

was da passiert.

Jochen

Habe ich jetzt normalerweise kein Beispiel für, aber

Jochen

das geht

Jochen

durchaus auch und das

Jochen

Benutzerinterface ist sozusagen da auch nicht anders,

Jochen

als wenn man das jetzt auf einer lokalen Maschine macht,

Jochen

sondern ist auch immer ein Notebook eigentlich.

Jochen

Ich glaube, zu diesem Big-Data-Ding

Jochen

müssen wir nochmal eine eigene Folge machen, so mit

Dominik

Kubernetes, das ist ja nochmal spannend.

Dominik

Genau, an der Stelle kann ich mal meine

Dominik

Kubernetes-Folge droppen.

Dominik

Ja, genau. Es gibt eine zu Docker

Dominik

und eine zu Kubernetes.

Jochen

Ja, und das Schöne ist halt,

Jochen

dass die Sachen dann auch, wenn man sie nicht mehr braucht, wieder verschwinden.

Jochen

Während halt, das ist ja auch etwas, was man sonst,

Jochen

also gibt es dann vielleicht auch irgendwie,

Jochen

in vielen Firmen gibt es dann halt so ein Cluster,

Jochen

wo man Sachen machen kann, aber die Maschinen sind dann halt da

Jochen

und man braucht

Jochen

sie aber irgendwie nur, irgendwie, man braucht

Jochen

eigentlich so alle halbe Stunde mal so wirklich volle Power

Jochen

und, aber ansonsten braucht man das eigentlich nicht.

Jochen

Und,

Jochen

ja, das ist

Jochen

glaube ich auch irgendwie, also das ist schon ein sehr

Jochen

gutes Argument für diese ganzen Cloud-Geschichten,

Jochen

weil man zahlt halt tatsächlich nur in dem

Jochen

Moment, wo man halt die Rechenzeit

Jochen

braucht.

Nico

Also du hast Dasks jetzt auch schon öfter

Nico

eingesetzt und das funktioniert für dich gut? Ja,

Nico

für mich funktioniert das eigentlich ziemlich gut. Ich habe damit nämlich praktisch

Nico

so noch keine Erfahrung. Ich habe nur irgendwie

Nico

im Hinterkopf, dass man dafür einiges umschreiben

Nico

muss, dass das nicht komplett kompatibel ist mit den Pandas.

Nico

Nicht komplett, aber also

Jochen

das meiste geht eigentlich schon.

Jochen

Es gibt also ein paar, ja natürlich,

Jochen

es gibt natürlich immer so ein paar Ecken,

Jochen

Ja, intern ist es halt so, dass der das auf eine Menge

Jochen

Data Frames aufteilt und das

Jochen

muss man halt irgendwie, die unterschiedlichen

Jochen

Teile liegen halt auf unterschiedlichen Rechnern und

Nico

ja. Ansonsten, wenn man

Nico

Pandas einfach nur Multicore

Nico

betreiben möchte, was ja Pandas

Nico

per Default jetzt aktuell noch nicht bietet,

Nico

gibt es auch ein paar nette Projekte. Da gibt es

Nico

einmal Modin, das ehemalige

Nico

Pandas on Ray,

Nico

was quasi einfach über einen Import

Nico

einfach nur,

Nico

du änderst den Import und dann kannst du prinzipiell

Nico

Multicore für die allermeisten

Nico

Pandas-Operationen.

Nico

Wenn du sehr in die Nische kommst, geht's

Nico

da vielleicht dann irgendwann nicht mehr. Und was ich

Nico

heute kennengelernt habe und noch nicht ausprobiert habe, ist

Nico

Pandarallel.

Nico

Also so wie Panda

Nico

und dann Parallel

Nico

quasi. Und das unterstützt

Nico

halt eben auch quasi oder verspricht ein Multicore-Processing

Nico

für Pandas-Operationen.

Nico

Genau. Also bevor man vielleicht

Nico

wirklich auf den Cluster muss, ist das

Nico

noch eine gute Option.

Nico

Ja.

Nico

Ja, ja, ja.

Nico

Nee, das kann ich auch noch nicht. Also, ja.

Nico

Das ist interessant.

Nico

Genau, aber wir waren hier bei dem...

Nico

Wie bekomme ich eigentlich meine Daten?

Jochen

Ich hatte einfach das entsprechende Notpunkt nicht aufgemacht.

Jochen

Das heißt hier

Jochen

Preparing Data.

Jochen

Und das ist einfach

Jochen

das Ding, also David Lewis,

Jochen

das ist auch der, der den Mod-Up-Display gemacht hat

Jochen

und auch überhaupt der, der das ganze Dataset

Jochen

kuratiert hat, hat das halt irgendwie auf seiner

Jochen

Seite liegen. Und

Jochen

genau, dann

Jochen

ja.

Nico

Was du auch benutzt an der Stelle im Notebook

Nico

ist ja die

Nico

die Path Library.

Nico

Ja.

Nico

Habe ich auch noch nicht so lange in Benutzung, aber ist eigentlich

Nico

mega cool. Ja, genau. Sag dazu doch nochmal zwei Sätze.

Nico

Ja, also

Jochen

früher habe ich das auch mal mit

Jochen

OS und ListDir und

Jochen

OS Path Join und so gemacht, aber das ist alles

Jochen

ganz schön, genau, glaube

Jochen

ganz schön umständlich und

Jochen

da

Jochen

gibt es halt, ich weiß gar nicht,

Jochen

seit wann das in der Standard-Library ist, aber

Jochen

also es gibt da

Jochen

ein Modul namens Parslip

Jochen

und

Jochen

da kann man

Jochen

also

Jochen

es geht hier los mit Pars.home

Jochen

ist halt sozusagen dann ein Pfad

Jochen

und das Ding

Jochen

funktioniert im Grunde, wenn man jetzt Pfade erweitern möchte

Jochen

oder so über so Operator

Jochen

Overloading und

Jochen

die haben dann halt einfach das

Jochen

den Slash überladen und jetzt kann man

Jochen

halt schreiben, irgendwie pass.home

Jochen

gibt einem das Home-Verzeichnis, Slash

Jochen

Data Slash TMP

Jochen

und das ist natürlich viel kürzer, als würde man jetzt

Jochen

schreiben, OS Pass Join

Jochen

Klammer auf und dann gibt man eine Liste

Jochen

oder macht irgendwie, ja irgendwie

Jochen

muss dann einen absoluten Pfad angeben

Jochen

oder man gibt irgendwie einen relativen Ankommer

Jochen

irgendwie das nächste Ding und

Jochen

das ist alles ganz schrecklich. Man kann sehr

Nico

schön Variablen quasi mit rein

Nico

betten und

Nico

man bekommt ja am Ende dann auch immer quasi ein Path-Objekt

Nico

wieder raus, was dann auch nochmal so

Nico

Operationen bietet, wie

Nico

okay, jetzt verrat mir von dem noch bitte die

Nico

Subdirectories oder

Nico

ja, halt Operationen dann immer direkt

Nico

auf dem Pfad ausführen. Ja, du kannst einfach

Dominik

.exist machen oder sowas, das wäre auch ziemlich cool.

Jochen

Genau. Ja, und ansonsten

Jochen

hätte man immer os-path-exist und so verwenden

Jochen

müssen und dann, also das ist

Jochen

wirklich viel, viel angenehmer

Jochen

damit zu arbeiten und

Jochen

ja, also sonst hat man immer so, also ich hatte sonst

Jochen

immer das Problem, dass irgendwie diese ganzen

Jochen

Geschichten wurden immer relativ festlich und auch die

Jochen

Zeilen wurden sehr lang und das Problem ist

Jochen

irgendwie weg, seitdem ich Parslip verwende und das

Jochen

ist schon mal echt ein Vorteil. Vielleicht um das

Jochen

zu kurz zu zeigen, ich lösche jetzt einfach mal die Daten,

Jochen

die ich hier bei mir lokal habe.

Jochen

Data,

Jochen

TMP.

Jochen

Ja, genau.

Jochen

Muss man echt mit aufpassen.

Nico

Ja, ja. Ja, wenn du willst so ein Git-Repo

Nico

löschen oder so, machst dann irgendwie Punkt-Slash

Nico

oder so und dann immer aus Versehen löscht man den Punkt

Nico

weg, dann machst du r-r-slash

Nico

und dann

Nico

ja, dann

Dominik

immer alles als Super-User machen. Muss man hoffen,

Jochen

dass nicht nur das Backup immer funktioniert hat,

Jochen

sondern dass das Restore auch mal funktioniert

Jochen

ist.

Jochen

Ja, genau.

Jochen

Ja, ich verwende

Jochen

hier einfach so irgendwie

Jochen

so Download-from-URL

Jochen

Funktion, die benutzt

Jochen

tqdm, um

Jochen

das ist eine sehr schöne Library, mit der man

Jochen

halt so Progress-Bars ganz gut hinkriegt.

Dominik

Man kann eigentlich alle Iteratoren irgendwie damit rappen.

Jochen

Ja, man braucht nur ein Iterat-Bar und genau.

Jochen

Und das ist

Jochen

auch sehr, sehr hübsch. Dann sieht man ungefähr, wo man ist.

Jochen

Und ja,

Jochen

jetzt hat das

Jochen

irgendwie dieses Dataset halt irgendwie

Jochen

in so ein Data-Verzeichnis geschrieben.

Jochen

Dann, das ist halt auch irgendwie das

Jochen

Tolle bei Python, dass man irgendwie einen Riesenhaufen

Jochen

Funktionalität schon in der Standard-Library

Jochen

mit drin hat. Ist eben auch

Jochen

sowas drin wie tar-File, dass man halt

Jochen

mit tar

Jochen

Archiven halt direkt irgendwie umgehen

Jochen

kann und dem kann man dann halt

Jochen

einfach sagen, okay, pack doch mal alles aus

Jochen

und

Jochen

ja, dann

Dominik

Dann haben wir einen Pickel gebaut oder du hast einen Pickel gebaut?

Jochen

Genau, dann parse ich das Ganze auf und

Jochen

pickel das wieder raus sozusagen,

Jochen

damit ich dieses Parsen nicht jedes Mal machen muss. An der Stelle

Jochen

hier ist es relativ egal, weil das ist so schnell.

Dominik

Also Pickel speichert einfach das Python-Objekt in der

Dominik

Binary einfach, also als Binärdaten

Dominik

auf der Platte in einem Objekt und kann es genauso wieder einlesen.

Jochen

Pickel ist auch ein Modul aus der Standard-

Jochen

Bibliothek, genau, und es serialisiert

Jochen

einfach Python-Objekte, beliebige

Jochen

Python-Objekte einfach auf, ja, in ein

Jochen

Format, das man dann halt auf die Platte schreiben

Jochen

kann und hinterher auch wieder lesen kann.

Jochen

Und es ist halt relativ schnell. Also

Jochen

CSV, genau, ist oft

Jochen

das, was man bekommt und das, was am

Jochen

meisten verwendet wird und, ja,

Jochen

Pandas Reals CSV-Funktion ist sicherlich so

Jochen

eine der wichtigsten.

Jochen

Aber das ist halt nicht schnell,

Jochen

sondern das ist halt irgendwie so,

Jochen

ja, sagen wir mal,

Jochen

weiß ich nicht, vielleicht 50 MB

Jochen

pro Sekunde oder so, was da so durchgeht,

Jochen

kommt darauf an, wie komplex das CSV ist.

Jochen

Und gut, für die meisten Datensätze

Jochen

ist das vielleicht auch, oder was die meisten Leute so haben,

Jochen

auch schnell genug, dass das halt irgendwie

Jochen

nicht so furchtbar merkbare

Jochen

Wartezeiten erzeugt, aber

Jochen

wenn man jetzt so ein paar Gigabyte einlesen

Jochen

will, dann ist das schon, dann muss man bei CSV schon

Jochen

immer warten. Und was

Jochen

ich da oft auch mache, ist halt die, wenn ich

Jochen

CSVs habe, die

Jochen

zuerst irgendwie in DataFrame einzulesen

Jochen

mit ReadCSV und dann halt nochmal

Jochen

irgendwie einen Pickle-File davon zu cachen.

Jochen

weil das Pickel liest halt quasi mit Plattengeschwindigkeit, also da kann man auch so einen Gigabyte pro Sekunde lesen, dann dauert das halt, wenn man halt so einen Data-Frame, der halt irgendwie zwei, drei Gigabyte groß ist, liest, den man auf der Platte gepickelt hat, das dauert dann halt irgendwie auch nur so ein, zwei Sekunden und nicht mehr irgendwie anderthalb Minuten, wenn man das per CSV machen würde und ja, das ist halt auch ganz praktisch.

Nico

natürlich trotzdem Sinn, dass man irgendwie

Nico

eine CSV nimmt zum Teilen, weil

Nico

in so einem Pickel kann halt eben alles dran sein.

Nico

Das ist halt ein Binary-File und

Nico

dementsprechend wahrscheinlich nicht das Beste, um es irgendwie

Nico

im Internet als Austauschformat zu benutzen.

Dominik

Das ist auf jeden Fall ein Sicherheitsrisiko,

Dominik

weil wenn du da irgendwelche Sachen reinlädst

Dominik

und da habe ich dann mein Code reingeschrieben.

Jochen

Also wenn man das für einen eigenen Cache benutzt, ist es

Jochen

okay, weil das zieht ja sonst keiner, aber stimmt.

Jochen

So verteilen soll. Es gibt natürlich auch

Jochen

Formate, die dafür gedacht sind, dass man irgendwie

Jochen

da größere Datenmengen drin hat

Jochen

und das halt auch

Jochen

irgendwie teilt.

Jochen

Ja, HDF5

Jochen

oder NET,

Jochen

wie heißt denn das noch, Nachfolger davon?

Jochen

Keine Ahnung.

Jochen

Oder halt eben sowas wie Parquet-Files

Jochen

oder so. Aber

Jochen

genau, CSV ist wahrscheinlich immer noch das

Jochen

üblichste.

Jochen

Ja, genau, ich habe das jetzt einfach

Jochen

nochmal so gemacht, um das zu demonstrieren, wie das geht.

Jochen

In dem Fall ist es halt völlig überflüssig, weil

Jochen

eigentlich sind das so wenig Daten.

Jochen

Das merkt man gar nicht.

Jochen

Und dann hat man halt sozusagen die

Jochen

Daten in einem Format, dass man

Jochen

damit irgendwie arbeiten kann.

Dominik

Ja, das können wir describen und reingucken.

Jochen

Genau, genau, genau. Und dann halt dieses

Jochen

Explorer-Notebook sozusagen ausführen.

Nico

Genau, und dann halt eben Daten visualisieren.

Nico

Wir haben vorher jetzt nicht so drüber geredet,

Nico

was für eine Bibliothek man dafür am besten benutzt.

Nico

Was ist denn euer Favorite?

Nico

C-Bone, meiner. Ja, würde ich auch.

Jochen

C-Bone ist mal das, was ich normalerweise am Anfang

Jochen

verwende.

Dominik

Also Seaborn ist auf Matplotlib

Dominik

drauf und macht es noch ein bisschen hübscher.

Dominik

Ja. Genau, also finde ich

Nico

auch so zum Explorieren ziemlich gut

Nico

am Anfang, sobald meine, ich finde

Nico

man hat für so Grafik-Tools

Nico

ja ganz unterschiedliche Anforderungen. Am Anfang

Nico

willst du irgendwie einfach schnell erstmal

Nico

irgendwie ein bisschen was bekommen, dass es

Nico

irgendwie dir ein Gefühl dafür gibt.

Nico

Dann gibt es den Anwendungsfall, dass man

Nico

irgendwelche High-Resolution-Charts

Nico

machen möchte am Ende, um

Nico

sie zu präsentieren, die dann irgendwie,

Nico

wo dann wichtig ist, dass die Achsbeschriftung stimmt,

Nico

für irgendwie ein Meeting mit

Nico

einem Vorstand oder für eine Publikation

Nico

oder so. Und ich persönlich

Nico

habe dann immer nochmal so einen dritten Anwendungsfall,

Nico

wo ich so ein Diagramm benutze,

Nico

um damit irgendwie kontinuierlich zu arbeiten,

Nico

um irgendwelche Modellmöglichkeiten

Nico

zu visualisieren und die

Nico

dürfen dann gerne auch sehr mächtig und

Nico

ja, teils überladen sein und so weiter.

Nico

Und da finde ich Sibon zum Beispiel

Nico

jetzt irgendwie auch

Nico

zu kompliziert, um jetzt viele verschiedene

Nico

Sachen zu machen. Ich benutze Alt-R sehr gerne

Nico

zum Beispiel.

Nico

kann ich sehr empfehlen, das ist halt die Möglichkeit

Nico

dann quasi

Nico

Alter, Alter, Alter,

Nico

genau, baut

Nico

unten drunter auch Vega auf,

Nico

von der Visualisierungs-Engine

Nico

und folgt halt

Nico

diesem Paradigma von

Nico

Grammar of Graphics, wo man

Nico

halt quasi verschiedene Charts quasi

Nico

übereinander kombinieren kann,

Nico

relativ einfach und

Nico

genau, die benutze ich

Nico

jetzt seit ein paar Monaten sehr, sehr gerne.

Nico

Ja,

Nico

Kennt jemand von euch Buki?

Nico

Ja, ja, genau.

Nico

Habe ich zu meiner Welle mitgearbeitet, irgendwie bin ich da nie so richtig reingekommen, aber das kann auch an mir liegen.

Jochen

Ja, Buki ist halt eine so, ist für interaktive Geschichten halt sehr schön, das ist halt eine der beiden Möglichkeiten, um Plots so ein bisschen interaktiver hinzubekommen, andere wäre Plotly.

Jochen

Genau, die benutze ich dann lieber.

Jochen

Ja, genau, ich auch. Aber Buki ist, glaube ich, auch nicht so schlecht. Also zum Beispiel die Visualisierung, was gerade auf dem Cluster passiert, bei Dask ist halt auch basiert auf Buki.

Jochen

Und das ist auch relativ beeindruckend, was die damit

Jochen

machen. Aber

Jochen

ja,

Jochen

nee, Plotly ist auch das, was ich ein bisschen

Dominik

lieber finde. Hat jemand das mit DJI JS dann irgendwie noch

Dominik

gemoddet irgendwie oder so? Könnte das sein?

Dominik

Genau, ich glaube, das basiert unten drunter

Dominik

auf die drei. Ja, ich meine auch.

Dominik

Eben gerade, weil man das halt eben auch

Jochen

dann auch auf Webseiten gut verwenden kann.

Jochen

Und zum Beispiel, wenn man jetzt

Jochen

irgendwie ein Dashboard hat,

Jochen

dann

Jochen

kann man halt relativ simpel

Jochen

irgendwie mit Plotly halt auch die

Jochen

Visualisierung, die man sonst normalerweise im Notebook

Jochen

hätte oder so, halt einfach auf eine Webseite packen.

Jochen

Und das ist natürlich auch sehr praktisch.

Jochen

Genau.

Jochen

Ja,

Jochen

im D3 kann man aber auch

Jochen

verwenden, man kann auch in Notebooks irgendwie

Jochen

halt die Daten,

Jochen

das kann man natürlich nicht mit unendlich vielen Daten tun, aber

Jochen

man kann die halt auch in

Jochen

JavaScript reinbringen.

Jochen

Also man kann ja auch sozusagen

Jochen

im Browser

Jochen

via JavaScript Dinge im Notebook

Jochen

ausführen, dann sagt man halt der Zelle

Jochen

sozusagen, du bist jetzt eine JavaScript-Zelle

Jochen

und

Jochen

hier kommen die Daten von Python her, also

Jochen

es gibt unterschiedliche Wege, wie man die Daten von Python

Jochen

dann zu JavaScript irgendwie rüberschaufelt

Jochen

und dann kann man da auch

Jochen

mit D3 irgendwelche Dinge machen, wenn man zum Beispiel

Jochen

so einen Forced

Jochen

Graphen, wenn man so einen Graphen-Layout

Jochen

hat, was man irgendwie darstellen möchte,

Jochen

und man möchte jetzt an irgendeinem Knoten

Jochen

ziehen und dann soll das so rumwobbeln oder so, gibt's

Jochen

häufig, dann geht das natürlich mit

Jochen

also ich wüsste jetzt nicht,

Jochen

dass es da irgendwas in Python gibt, was man da nehmen

Jochen

kann. Kann sein, dass es mittlerweile auch

Jochen

mit Buket oder so geht, keine Ahnung.

Jochen

Aber mit D3 geht das natürlich schön. Da gibt's

Jochen

einige sehr, sehr witzige, interaktive

Jochen

Visualisierungsgeschichten

Jochen

und das kann man halt auch im Notebook verwenden.

Jochen

Aber es ist so ein bisschen

Jochen

fummelig, aber geht auch.

Nico

Habt ihr eine Lieblingslösung, um dann noch mal

Nico

so ein bisschen komplexer, wirklich so Dashboards zu

Nico

bauen, die für euch gut funktioniert?

Nico

Nee,

Jochen

ich habe davon gehört, dass,

Jochen

wie hieß das noch?

Nico

Das ist quasi die Variante, die da so

Nico

kommt, aber irgendwie

Jochen

habe ich bisher nicht so wirklich

Jochen

verwendet, weil ich ja also in der

Jochen

Django-Welt

Jochen

zu Hause bin und da habe ich das halt immer selber gebaut

Jochen

bisher, also meistens mache ich halt irgendwelche

Jochen

APIs, so Rest-APIs oder so,

Jochen

hinter denen dann halt irgendein Modell ist und dann

Jochen

meistens auch irgendwie ein View, der dann halt

Jochen

ein Dashboard ist, was die Modelle

Jochen

so getan haben über die Zeit.

Jochen

Ja, und nee, aber

Jochen

genau, eigentlich,

Jochen

was man gerne hätte, wäre sowas wie Shiny

Jochen

für R, aber ich glaube da...

Nico

Ja, Dash versucht genau das zu sein,

Nico

aber aktuell ist es das, finde ich, noch nicht.

Dominik

Ja, ich bastel auch gerade an so einem

Dominik

eigenen Visualisierungsding da rum, aber

Dominik

das ist noch nicht soweit.

Dominik

Ja.

Nico

Ja gut, haben wir unsere Daten

Nico

ausreichend visualisiert, würde ich sagen.

Nico

Genau. Wollen wir uns mal dem Modelltraining

Nico

widmen? Ja.

Nico

Okidoki.

Nico

So. Ja.

Nico

Wie trainieren

Dominik

wir denn das Modell? Also wir haben

Dominik

jetzt die ganzen Daten, wir haben den schon mal angeguckt,

Dominik

wir wissen so ein bisschen was, du hast ja rausgeschrieben, was man

Dominik

damit so alles anstehen könnte.

Dominik

Warum, wieso, weshalb man irgendwelche Features braucht

Dominik

und wir wissen natürlich, was wir vielleicht

Dominik

rausbekommen wollen oder wissen wir es nicht.

Dominik

Also hier dabei wissen wir, dass wir irgendwelche Zusammenhänge

Dominik

finden möchten, aber. Genau und wir

Nico

haben ja jetzt in dem Fall ein

Nico

Super-West-Machine-Loading-Problem, weil

Nico

wir wissen halt eben für diese ganzen

Nico

Artikel, welche Tags

Nico

da hinten nachher dranstehen sollen. Also

Nico

wir versuchen ja quasi für einen Artikel

Nico

einen gewissen Tag zu identifizieren

Nico

und den

Nico

kennen wir. Wenn wir den nicht kennen würden,

Nico

dann wäre es quasi unbekannt, dann könnten wir

Nico

nur versuchen, irgendwie ähnliche Artikel

Nico

zusammen zu gruppieren,

Nico

aber dadurch, dass wir die kennen,

Nico

können wir jetzt halt eben versuchen,

Nico

einige von denen zu

Nico

nehmen, da so zu tun, als würden

Nico

wir sie nicht kennen, auf den anderen, wo wir sie

Nico

kennen, unser Modell zu trainieren und

Nico

dann eben quasi auf den, wo wir sie

Nico

quasi weggestrichen haben, eine Prognose zu machen und

Nico

es zu vergleichen. Das ist halt eben

Nico

wesentlich, was man tut mit einem Training

Nico

und eben so einem sogenannten Test-Set.

Nico

Genau.

Jochen

Ja, also da gibt es zum Beispiel

Jochen

das Notebook einfach nur

Jochen

Linear-Model

Jochen

und genau,

Jochen

wenn man da sozusagen die ersten paar

Jochen

Zeilen ausführt, sieht man auch schon nochmal

Jochen

quasi, da hat man die Trainings- und

Jochen

Testdaten

Jochen

und das sind irgendwie 7.770

Jochen

Trainingsdokumente,

Jochen

3.000 Testdokumente

Jochen

in dem vorgegebenen Split

Jochen

und

Jochen

ja, man hat ja jetzt

Jochen

sozusagen die

Jochen

Labels eher als Liste

Jochen

von Klassen, in denen

Jochen

also wenn ich mir jetzt

Jochen

zum Beispiel Train Labels

Jochen

mal anschaue,

Jochen

Dann ist es halt eine Liste von Listen und jedes Element dieser Liste, der großen Liste außenrum, ist halt sozusagen eine Liste der Tags, die halt zu dem entsprechenden Dokument gehören.

Nico

Das ist halt in dem Fall jetzt so, weil wir jetzt eben so ein Multiclass-Multilabel-Problem haben. Also Multiclass besagt ja einfach nur, dass wir eben diese verschiedenen Klassen haben.

Nico

Also wenn wir nicht nur Ja oder Nein sagen, sondern hier halt eben diese 90 Texte, die es gibt, quasi haben, dann haben wir erstmal nur ein Multiclass-Problem.

Nico

Aber jetzt kann es halt auch sein, dass einer dieser Artikel eben mehreren von diesen Texten zugewiesen ist.

Nico

In dem Moment haben wir dann halt eben auch ein sogenanntes Multilabel-Problem.

Jochen

Ja, und diesem Format kann ich halt die Labels in einem Modell nicht geben.

Jochen

Also ich gebe dem Modell, was ich jetzt trainieren möchte, immer eben zwei Sachen.

Jochen

Ich gebe dem einmal eine Feature, eine Matrix der, Feature-Matrix nennt sich das, also quasi eine Matrix, in der die Zeilen, die einzelnen Beobachtungen, Samples sind.

Jochen

Und die Spalten sind halt die unterschiedlichen Features und die Labels oder Targets oder wie auch immer man das nennt, die irgendwie eine Information darüber enthalten, was denn jetzt sozusagen da richtig rauskommen sollte, wenn man sich diese Zeile anguckt.

Jochen

und wenn man jetzt

Jochen

ein Multilabel-Dataset hat, dann

Jochen

man kann jetzt das nicht

Jochen

sozusagen als diese Liste von Listen übergeben.

Jochen

Listen wären sowieso schlecht,

Jochen

weil Listen sind halt, brauchen in Python

Jochen

relativ viel Hauptspeicher und

Jochen

im Grunde, wenn man jetzt, also

Jochen

bei Scikit-Learn ist es jedenfalls so, aber

Jochen

eigentlich orientieren sich fast alle

Jochen

anderen Maschinen-Learning-

Jochen

Bibliotheken, die es so gibt, auch

Jochen

an der entsprechenden API

Jochen

von Scikit-Learn,

Jochen

das ist die Estimator-API für Modelle eben,

Jochen

da übergibt man immer Arrays, also NumPy-Arrays.

Jochen

Und sowas wie Listen oder so kann man da nicht übergeben.

Jochen

Das heißt, man muss erst mal das so in Format bringen,

Jochen

dass man das überhaupt den entsprechenden Modellen übergeben kann.

Jochen

Und für Multilabel ist es eben so,

Jochen

dass das richtige Format dann halt ist,

Jochen

ein NumPy-Array zu haben,

Jochen

das halt auch wieder genauso viele Zeilen hat,

Jochen

wie man in der Feature-Matrix hat

Jochen

oder eben genauso viele Zeilen,

Jochen

wie es eben Dokumente gibt,

Jochen

die zum Training-Set gehören

Jochen

und dann so viel spalten,

Jochen

wie es Kategorien gibt oder Labels gibt,

Jochen

in denen ein Dokument liegen kann

Jochen

und sozusagen die,

Jochen

für jede Spalte gibt es dann halt sozusagen,

Jochen

also jede Spalte ist halt eine Kategorie

Jochen

und wenn dann ein Null drin steht,

Jochen

bedeutet das im Grunde, das Dokument liegt

Jochen

nicht in dieser Kategorie oder hat dieses Tag eben nicht.

Jochen

Wenn da 1 drin steht, dann heißt das,

Jochen

okay, ja, das ist sozusagen die richtige

Jochen

Kategorie für dieses Dokument.

Jochen

Und

Jochen

genau, dafür gibt es

Jochen

aus dem Scikit-Learn

Jochen

Pre-Processing-Modul halt ein Ding,

Jochen

das nennt sich Multilabel-Binarizer

Jochen

und dem gibt man einfach diese Liste von Listen

Jochen

und dann spuckt das halt eine richtig formatierte

Jochen

richtig formatiertes NumPy-Array aus.

Jochen

Also das ist auch sowas, das muss man,

Jochen

also diese ganze Transformation, das muss man nicht selber machen.

Jochen

Da gibt es eigentlich für alle Geschichten, die man da so

Jochen

haben kann, fertige

Jochen

Lösungen schon.

Dominik

Man kann sich, glaube ich, auch aussuchen, was da mit den Werten,

Dominik

die da nicht reinpassen, irgendwie geschehen soll und sowas.

Dominik

Ja,

Jochen

bestimmt. Ich weiß jetzt gar nicht genau, was der

Jochen

Multilabel-Bannerizer da sonst auch so macht.

Nico

Und langfristig ist es vor allem auch nicht sinnvoll,

Nico

sich das zu machen. Also am Anfang, wenn man das noch nie gemacht hat,

Nico

denkt man so, also man muss ja

Nico

schon auch einmal erstmal durchsteigen, wie das

Nico

überhaupt alles funktioniert mit diesen

Nico

Prozessen und den Modellen und so weiter

Nico

und dann denkt man, ich will doch eigentlich nur so ein Modell

Nico

benutzen, ich kann den ganzen Rest auch von Hand machen

Nico

und fängt damit gerne erstmal

Nico

an, weil man auch gerne ein bisschen programmiert

Nico

und nicht ewig Doku liest,

Nico

aber faktisch ist man halt letztendlich

Nico

dann doch viel schneller, wenn man sich das halt einmal

Nico

aneignet, wie denn diese Binarizer und so weiter

Nico

funktionieren.

Nico

Genau, ja.

Nico

Und dann

Jochen

hat man quasi das gleiche Problem,

Jochen

nur irgendwie ein bisschen anders.

Jochen

auf der Feature-Matrix-Seite halt eben

Jochen

auch, da man hatte erstmal Text.

Jochen

Den kann man jetzt so in ein Modell

Jochen

nicht reinwerfen, weil

Jochen

ja, ist halt

Jochen

also

Jochen

letztlich ist eine Feature-Matrix eigentlich immer

Jochen

sollten das eigentlich immer mehr oder weniger

Jochen

Float-Werte sein, die da letztlich drin landen

Jochen

und das ist halt ein NumPy-Array von

Jochen

irgendwie Float-Geschichten und das ist Text

Jochen

halt nicht. Man muss jetzt erstmal Text irgendwie

Jochen

in Zahlen

Jochen

irgendwie umwandeln und das ist halt

Jochen

schon so eine Art, man nennt das halt

Jochen

Feature-Extraktion.

Jochen

Also man macht

Jochen

sozusagen aus Text

Jochen

irgendwie eine

Jochen

Reihe von Features,

Jochen

also Spalten in einer Feature-Matrix.

Jochen

Und

Jochen

so eine ganz

Jochen

alte Standard-Methode,

Jochen

wie man das halt tun kann, ist

Jochen

einmal man repräsentiert

Jochen

Text halt als Back of Words

Jochen

nennt sich das. Das bedeutet,

Jochen

man

Jochen

wirft die Reihenfolgeinformation

Jochen

der Wörter weg, was irgendwie schlimm klingt, aber

Jochen

dann doch nicht so schlimm ist

Jochen

und merkt sich

Jochen

sozusagen, also

Jochen

jede, man kann sich das ungefähr so

Jochen

vorstellen, man hat jetzt, ja,

Jochen

weiß nicht, ob das eine gute Idee ist,

Jochen

zu sagen, man sollte sich das wie eine Excel-Tabelle vorstellen.

Jochen

Wahrscheinlich eher nicht.

Jochen

Das hat jemand schon niemals

Dominik

gesehen. Also warum nicht?

Jochen

Ja, es ist auch so ein bisschen so ähnlich wie bei den Labels.

Jochen

Es ist auch so eine Art One-Hot-Encoding.

Jochen

Man hat halt pro Spalte quasi, also man macht eine Spalte pro Wort.

Jochen

Und wenn das Wort in dem Text vorkommt, dann macht man da eine Eins rein,

Jochen

ansonsten macht man da eine Null rein in die Spalten.

Jochen

Also man hat sozusagen so viele Spalten, wie es überhaupt unterschiedliche Worte

Jochen

im gesamten Dokument-Korpus gibt, also über alle Dokumente drüber.

Nico

Wobei Back of Words macht doch schon auch die Anzahl gleich rein, oder?

Jochen

Ja, ich weiß nicht, man kann auch die Anzahl direkt rein, also der einfachste Fall wäre, dass man einfach nur reinschreibt, ist es da oder nicht, binär.

Jochen

Und genau, dann die nächste etwas, also das funktioniert auch schon erstaunlich gut, aber das hat halt auch diverse Probleme.

Jochen

Unter anderem ist es halt so, dass längere Texte natürlich viel, bei denen steigt die Wahrscheinlichkeit, dass sie in allen möglichen Kategorien sind. Einfach deswegen, weil eine Menge Worte darin auftauchen, die halt in allen möglichen Kategorien auftauchen.

Dominik

Oder derjenige, die den Nachrichtenbeitrag geschrieben hat, war SEO-Experte oder so.

Jochen

Ja, ja, genau. Das wäre halt etwas, was man versuchen wollen würde zu verhindern, dass das halt so eine große Auswirkung hat, wenn da irgendwie eine lange Liste von vielen unterschiedlichen Wörtern drinsteht. Und das ist eine klassische Methode, die man da verwendet. Es kommt auch aus dem Information Retrieval Bereich, ist halt einmal zu zählen, wie oft ein Wort drin vorkommt.

Jochen

Das braucht man halt vor allen Dingen deswegen, weil man damit mit der Information, wie oft kommt ein Wort in einem Text vor plus wie lang ist der Text, kann man halt die Frequenz ausrechnen, also sozusagen wie ist die Frequenz von dem Wort in dem Text. Das ist einfach nur wie oft kommt es vor, geteilt durch die Länge des Textes und das funktioniert dann schon besser, also da könnte man dann irgendwie einen Count Vectorizer nehmen, der würde halt dann zählen, nicht nur binär irgendwie einen großen Vektor bauen, in dem 1 und 0 drinstehen, je nachdem ob ein Wort drin ist.

Jochen

kommt oder nicht. Das wäre dann schon die

Jochen

Term-Frequency, oder? Ja, damit

Jochen

hätte man erstmal nur die Counts und dann

Jochen

ich weiß nicht, ob es noch einen, aber es gibt

Jochen

keinen Vectorizer, der dann nur

Jochen

Term-Frequenz macht, sondern dann

Jochen

würde man direkt sowas nehmen wie TF-EDF

Jochen

Vectorizer. Das Problem

Jochen

bei der Term-Frequenz ist halt... Ich glaube,

Dominik

das habt ihr alle ein bisschen abgehängt. Erstmal, was ist ein

Dominik

Term-Vectorizer, was ist ein TF-ID?

Dominik

Ja, also

Jochen

im Grunde kann man eigentlich direkt mit dem TF-EDF

Jochen

einsteigen.

Jochen

Das ist halt sozusagen eine

Jochen

Wenn man sich jetzt einen Vektor anguckt, wo nur drinsteht, ob ein Wort in einem Text vorkommt oder nicht, da stehen nur Einsen und Nullen drin, dann ist das halt schlecht.

Jochen

Man möchte eigentlich ein anderes Gewicht darin stehen haben für Worte, weil manche Worte sind halt wichtiger oder charakteristischer für eine Kategorie als andere.

Jochen

Also wenn ich die Kategorie Politik habe und da kommt irgendwie Parlament drin vor, dann ist das sozusagen dafür irgendwie eine aussagekräftigere Geschichte, als wenn jetzt das Wort das drin vorkommt oder so, was einfach in jedem Text vorkommt.

Jochen

Und wenn man jetzt einfach nur ein 1 und ein 0 reinschreibt, dann würde das aber gleich behandelt irgendwie und das kann ja nicht so richtig sein. Und die Methode, mit der man das versucht, besser zu machen, ist uralt, ich glaube mittlerweile über 40 Jahre alt.

Jochen

Ich glaube, Anfang der 70er oder so, dass

Jochen

Karen Speck-Jones, glaube ich, irgendwie sich mal

Jochen

überlegt. Ich weiß es nicht genau.

Jochen

Eben, TF-EDF

Jochen

vor allen Dingen für Suchmaschinen entwickelt.

Jochen

Da möchte man das halt auch haben.

Jochen

Man hat halt ein Query und möchte dazu

Jochen

die relevantesten Dokumente irgendwie

Jochen

rausfiltern.

Jochen

Und

Jochen

dieses Gewichtungs...

Jochen

Dieses Gewichtungsding nennt sich halt

Jochen

TF-EDF, also Term Frequency

Jochen

mal

Jochen

Inverse Document Frequency.

Jochen

Term Frequency ist einfach nur die

Jochen

Frequenz von dem Wort

Jochen

in dem Text. Also das ist einfach nur Count,

Jochen

wie oft kommt das Wort vor

Jochen

in dem Text, geteilt durch, wie lang ist der Text,

Jochen

mal

Jochen

Logarithmus von

Nico

Ja, genau. Ich kann den an der Stelle auch nicht genau

Jochen

geteilt durch, wie oft kommt

Jochen

das Wort irgendwie

Jochen

in allen Texten vor, sozusagen. Also

Jochen

das Ding wird halt höher. Je höher, desto

Jochen

seltener es ist. Also sozusagen

Jochen

und man nimmt dann mal den Logarithmus,

Jochen

damit es nicht ganz so schlimm wird, damit es halt so ein bisschen

Jochen

ein bisschen flacher wird. Genau.

Jochen

Weil man möchte halt auch nicht so total krasse

Jochen

Unterschiede haben.

Jochen

Es sollte sich so ein bisschen auswirken, aber

Nico

Genau. Das ist vom Prinzip her die Spezifität

Nico

des Wortes. Also

Nico

wie charakteristisch, wie

Nico

ist das ein Wort, was ständig vorkommt oder was halt eben

Nico

relativ selten vorkommt. Gewichtet

Nico

mit wie häufig kommt dieses Wort in dem Text vor.

Nico

Gibt halt ein ganz gutes Maß darüber.

Nico

Ja, ist das speziell

Dominik

für diese Kategorie? Da oder nicht?

Dominik

Da müsste man tatsächlich aber auch

Dominik

eine Datenbank haben, der alle Wörter irgendwo

Dominik

schon in gewisser Häufigkeit vorkommen, also zumindest

Dominik

die, die so allgemein rausfallen.

Jochen

Das ist natürlich so eine interessante Geschichte.

Jochen

Wie kommt man an diese Gewichte

Jochen

eigentlich ran? Und wenn man jetzt zum Beispiel

Jochen

irgendwie das mit dem Cross-Validation und

Jochen

Trennen in Trainings- und Test-Sets selber machen

Jochen

würde, dann läuft man direkt in solche

Jochen

Probleme rein. Wo berechnet man eigentlich

Jochen

die Gewichte? Nimmt man alle Daten, die man hat, um die

Jochen

auszurechnen?

Jochen

Liegt man da nicht

Jochen

die Tester, dann legt man nicht die

Jochen

Informationen über das Test-Dataset schon

Jochen

in das Training mit rein? Darf man das machen?

Jochen

Ja, vor allem ist halt auch die Frage, wie gut sind deine

Dominik

Tester? Sind die halt verteilt? Sind die homogen? Hast du da

Dominik

eine schiefe Verteilung zum Beispiel oder sowas?

Dominik

Das wäre dann auch irgendwie doof, weil

Dominik

dann die Sachen, die schief drin liegen,

Dominik

dann überprofessionell drin vertreten sind und du

Dominik

vielleicht von den Sachen, die da

Dominik

selten drin sind, nicht so viele. Genau, aber

Nico

dieses Problem, was du gerade sagst mit dem Training

Nico

und den Testarten, ist halt wirklich so ein klassisches.

Nico

Also du hast eigentlich nur zwei Optionen.

Nico

Entweder ich sage,

Nico

ich trainiere mein TF-IDF

Nico

auf allen meinen Daten, auch

Nico

vom Test-Set, dann habe ich halt alle Wörter

Nico

wirklich drin, die potenziell vorkommen können

Nico

nachher, aber dann habe ich halt eben

Nico

die Gefahr von Information Leakage,

Nico

also das heißt einfach, die Daten, die mir

Nico

eigentlich ja potenziell unbekannt sind, ich will ja nachher

Nico

auf Daten generalisieren, die

Nico

ich noch wirklich gar nicht kenne. Das Test-Set

Nico

ist ja nur eine Abstraktion, um irgendwie am Anfang

Nico

damit trainieren zu können.

Nico

Dann

Nico

tue ich so, als würde ich diese Informationen

Nico

eigentlich nicht kennen, aber in Wirklichkeit habe ich sie ja

Nico

doch irgendwie verarbeitet. Auf der anderen

Nico

Seite, wenn ich das nicht mache, passiert es mir halt, dass

Nico

ich im Testset irgendwelche Wörter habe, die ich

Nico

so gar nicht habe und dann habe ich dazu quasi

Nico

keinen IDF-Score, keinen validen.

Nico

Genau.

Nico

Und dann gibt es halt im Endeffekt, brauchst du halt

Nico

entweder ein sehr, sehr großes Datenset, dass du das

Nico

irgendwie selber machen kannst und

Nico

hast oder du kannst halt auch quasi

Nico

ein Datenset benutzen,

Nico

quasi, also für so eine Generalität

Nico

von Wörtern könntest du jetzt auch ein

Nico

öffentliches Datenset benutzen. Wikipedia

Nico

oder sowas. Genau, aber dann ist es halt nicht so spezifisch

Nico

aus deinem Anwendungsfall wahrscheinlich und

Nico

vielleicht ist das Wort

Nico

Enzyklopädie in der

Nico

Wikipedia selbst irgendwie viel häufiger

Nico

und viel unspezifischer,

Nico

als es bei dir jetzt im Wort vielleicht wäre.

Nico

Bei dir in deinen Daten vielleicht wäre.

Nico

Genau, also es ist auch

Nico

wieder so ein Abwägungsding, wie geht man damit um?

Nico

Ja.

Jochen

Und ja, hier ist es zum Glück halt

Jochen

irgendwie alles schon sozusagen

Jochen

sind diese Geschichten vorgegeben und wir

Jochen

ermitteln die Zahlen halt sozusagen nur auf den

Jochen

Trainingsdaten und

Jochen

fitten das halt nur auf den Testdaten, also

Jochen

ja.

Jochen

Fitten das nur auf den Trainingsdaten

Jochen

und transformieren nur die Testdaten, also

Jochen

sozusagen, ja.

Jochen

Und es ist gerade spannend,

Dominik

mir kommt gerade der Gedanke, ist es denn

Dominik

tatsächlich dann so, dass nicht ein größeres

Dominik

Daten-Set eine bessere Methode

Dominik

verursacht, sondern tatsächlich das richtige

Dominik

Daten-Set, was das Wichtige ist, als

Dominik

die Menge an Daten?

Dominik

Hört es sich gerade ein bisschen so an, also ich fette jetzt

Dominik

intuitiv andersrum gedacht.

Dominik

Das heißt, je mehr Testdaten

Dominik

ich zur Verfügung hätte, auf denen ich meinen Algorithmus

Dominik

testen kann, desto besser wird mein Ergebnis

Dominik

und das, was gerade so ein bisschen durchgehen war,

Jochen

dass Trainingsdaten sind

Jochen

das, was dein Modell besser macht.

Dominik

Ja, genau. Testdaten. Also das meinte ich

Jochen

mit. Achso, gerade nochmal verwechselt wahrscheinlich.

Jochen

Ja, okay, ja, genau. Ja, ja, je mehr

Jochen

Trainingsdaten hast, desto besser, aber. Also weil dann würde man

Dominik

Wikipedia zum Beispiel schon nehmen können, wenn das korrekt

Dominik

gelabelt ist. Ja, dann würde das dazu

Dominik

führen, selbst wenn da mehr

Jochen

Aber Wikipedia ist ja jetzt für deinen Anwendungsfall

Jochen

nicht gelabelt.

Dominik

Wenn ich das gelabelt hätte, das war ja dann das.

Jochen

Und das ist natürlich wahrscheinlich eben anders. Das ist halt das Problem.

Jochen

Das ist anders verteilt als

Jochen

das, was du irgendwie benutzen

Dominik

willst. Also es ist dann aber doch halt nicht die Menge der Daten,

Dominik

sondern die müssen halt schon matchen. Also ich brauche halt so den Scope

Dominik

in die richtige Richtung schon. Das heißt, da kann halt

Dominik

ein Riesenproblem daraus entstehen, wenn ich irgendwas

Dominik

rausfinden will, was ich überhaupt nicht beschrieben habe in den Daten.

Dominik

Dann ist Murks. Genau. Und ein Stück weit

Nico

muss man da jetzt auch nochmal unterscheiden. Wir haben ja gerade so ein bisschen

Nico

davon geredet, wie kriege ich denn die

Nico

Spezifizität von den Wörtern, da geht es ja darum,

Nico

wie überführe ich unseren Text

Nico

überhaupt erstmal in so eine Zahlenmatrix,

Nico

auf den wir dann basierend unser Training

Nico

ausführen können. Und um das

Nico

transformieren von den

Nico

Textdaten zu so einer Zahlenmatrix

Nico

zu machen, da kann ich vielleicht durchaus einen

Nico

größeren, globalen

Nico

Korpus nehmen, den ich da quasi für die Wörter

Nico

benutze zum Umwandeln.

Nico

Wenn ich dann allerdings wirklich mein Modell trainiere, dann

Nico

macht es natürlich überhaupt keinen Sinn, das irgendwie mit Wikipedia

Nico

Daten zu machen, wenn ich eigentlich dann

Nico

meine Art Artikel machen möchte,

Nico

weil das ist wahrscheinlich dann anders.

Nico

Ja.

Jochen

Das gibt es auch noch in diversen

Jochen

anderen,

Jochen

also

Jochen

das Problem kriegt man halt auch immer wieder, also wenn man jetzt

Jochen

zum Beispiel

Jochen

das jetzt TF-IDF ist

Jochen

halt auch so ein klassisches Verfahren und

Jochen

man kann es auch noch relativ leicht verstehen, insofern

Jochen

ist das eigentlich, glaube ich, ein ganz guter Kandidat, um das

Jochen

da zu benutzen, was man jetzt, wenn man

Jochen

ein echtes Problem hätte, auf jeden Fall

Jochen

wahrscheinlich auch noch machen wollen würde,

Jochen

ist sogenannte

Jochen

Word Embeddings. Also man würde halt

Jochen

nicht nur, einfach nur

Jochen

sozusagen pro Wort eine Dimension nehmen, sondern

Jochen

man würde

Jochen

ja, diese

Jochen

Worte halt aus

Jochen

jedem Wort mehrere Dimensionen erzeugen

Jochen

und die sozusagen eingebettet in so ein

Jochen

Ja, also was man

Nico

mit Word Embeddings macht, ist man

Nico

projiziert jedes Wort

Nico

in einen mehrdimensionalen Vektorraum

Nico

und dadurch, dass in diesem

Nico

Vektorraum alle Wörter irgendwie abgebildet sind,

Nico

kann ich jetzt mathematische Operationen darauf abbilden

Nico

und kann vor allem gucken, ob sich zwei

Nico

Wörter ungefähr im selben Bereich dieses Vektorraums

Nico

befinden

Nico

und damit kriege ich sowas hin,

Nico

wie das irgendwie Kirche und

Nico

Kathedrale plötzlich irgendwie vergleichbar

Nico

sind, obwohl die jetzt in einem normalen Text natürlich

Nico

jetzt irgendwie nichts gemein haben, das sind komplett unterschiedliche

Nico

Wörter, auch wenn sie halt eine ähnliche

Nico

inhaltliche Bedeutung haben

Nico

und das ist halt was, was halt eben mit

Nico

Wörter-Empendings vor irgendwie

Nico

drei, vier, fünf Jahren irgendwie

Nico

sehr, sehr populär wurde und

Nico

ja, inzwischen überall... Wie kommen die da an die gleiche

Dominik

Stelle in diesem Vektorraum? Das habe ich jetzt noch nicht ganz...

Nico

Ja, das ist ein relativ kompliziertes Verfahren.

Nico

Ich muss da halt vorher quasi

Nico

trainieren und was ich vom Prinzip her mache, ist so eine Art

Nico

Color-Vertical-Filtering, glaube ich.

Nico

Aber ich glaube, das würde an der Stelle jetzt

Nico

zu weit führen. Also die würde man jetzt an der Stelle auch

Nico

vor allem nicht selber trainieren. Wenn, würdest du

Nico

die einfach laden aus dem Internet

Nico

und die quasi dann für jedes

Nico

der Wörter, die ich habe, quasi nachgucken, okay,

Nico

was ist denn diese Dimensionalität?

Nico

Weil um so ein Word-Embedding wirklich selber zu

Nico

trainieren, dann brauchst du zum einen sehr, sehr viele

Nico

Trainingsdaten und zum anderen halt auch wirklich viel

Nico

Rechenleistung für eine ganze Weile. Wo

Nico

würde ich solche Modelle runterladen?

Jochen

Ja, es gibt zum Beispiel Word2Vec, das Modell von

Jochen

Google, das kann man halt benutzen.

Jochen

Das ist nett.

Jochen

Ja, genau.

Jochen

Ja, und es hängt aber dann,

Jochen

ist halt die Frage, worauf das dann trainiert ist.

Jochen

Also wahrscheinlich ist viel Wikipedia dabei, aber

Jochen

bei Google ist bestimmt auch noch

Jochen

diverse Webseiten mit drunter.

Jochen

Ja, und das sind halt so ein paar Gigabyte,

Jochen

die man dann so runterladen kann.

Jochen

Und das verbessert halt,

Jochen

wenn man jetzt eben statt TF-IDF,

Jochen

oder normalerweise würde man nicht sagen statt,

Jochen

sondern man nimmt die TF-IDF-Scores

Jochen

natürlich auch mit dazu als Features

Jochen

und nimmt dann aber auch die Vektoren

Jochen

aus den Word-Embeddings für jedes Wort mit dazu,

Jochen

dann verbessert das halt irgendwie

Jochen

so ein Klassifikationsergebnis schon deutlich.

Jochen

Also, aber

Jochen

da hat man halt auch das Problem, man weiß halt

Jochen

dann nicht, wenn man das jetzt einfach so, diese vortrainierten

Jochen

Geschichten benutzt.

Dominik

Ja, aber das ist ja schon wieder, das Nussen der Schwarmintelligenz,

Dominik

das ist ja keine eigene Entwicklung in dem Sinne, sondern

Dominik

man nutzt halt das, was irgendwie einer der Großen

Dominik

dann schon angestellt hat mit seiner Hardware,

Dominik

auf so einer ganzen Sprache, auf so einer ganzen

Dominik

Grammatik und das Knowledge, das man dann irgendwie

Jochen

Sagen wir mal so, wenn du genug Trainingsdaten hättest

Jochen

und auch genug

Jochen

Rechenkraft, um das dann halt alles auszurechnen, wäre es

Jochen

wahrscheinlich besser, wenn du das auf deine eigenen Daten machst

Jochen

und nicht die auf Wikipedia trainiert

Dominik

nimmst. Wie viel, also hast du gesagt,

Dominik

es waren bei der Reuters-Daten drin 20.000 irgendwie

Dominik

Datensätze und das heißt, das war nicht historisch, weil

Dominik

da sind sicher mehr.

Jochen

Das ist ein bestimmter

Jochen

Ausschnitt. Ich weiß nicht genau, nach welchen Kriterien

Jochen

die jetzt ausgewählt worden sind, aber es sind ein paar

Jochen

halt nur. Es gibt jetzt auch ein neueres Dataset

Jochen

RCV1 und das heißt irgendwie, da sind dann

Jochen

800.000 drin oder so.

Jochen

Ja.

Nico

Genau, aber wie gesagt, an der Stelle

Nico

würde man halt in der Stelle jetzt eigentlich

Nico

erstmal diesen Back-of-Words-Ansatz

Nico

wählen oder halt vielleicht auch mit

Nico

Wörter-Embeddings, aber

Nico

genau, wir waren ja so ein bisschen

Nico

stehen geblieben bei den Label-Binarizern

Nico

und ich finde, man sollte

Nico

da nochmal so dieses Interface ein bisschen beschreiben,

Nico

was wir benutzen, weil das ist

Nico

sowas ganz generisch, was sich auch inzwischen alle

Nico

möglichen Bibliotheken auch außerhalb von

Nico

Circuit Learn eigentlich abgeschaut haben.

Nico

Da gibt es halt immer im Wesentlichen zwei Operationen.

Nico

Es gibt eben Fit

Nico

und Transform.

Nico

Und Fit nimmt quasi gewisse Daten und trainiert darauf jetzt mein Modell. Das heißt, dieser Multilabel-Binarizer guckt sich alle Daten an und berechnet für sich daraus, okay, aus jedem dieser Labels, die ich habe, muss ich folgende Zahl nachher rausgenerieren.

Nico

Und wenn ich das einmal gemacht habe, gefittet habe, dann kann ich danach halt diesen Label-Binarizer immer transformieren auf irgendeinen beliebigen Text.

Nico

Und der nimmt dann quasi diese selbe Abbildungsmatrix von Wörtern zu Zahlen und überträgt die auf den neuen Text.

Nico

Und ich kann natürlich auch beides gleichzeitig anwenden, dann mache ich halt eben so wie in dem Notebook hier Fit-Transform.

Nico

Dann fittet er erst darauf und dann transformiert er auch gleich die Eingangsdaten.

Jochen

Genau. Ja, das ist jetzt halt inzwischen echt so ein super Standard-Interface geworden und das Schöne ist halt, dass ich im Grunde jedes Modell, wenn ich jetzt eine Klasse habe in Python, die diese Methoden implementiert, ich brauche vielleicht noch ein bisschen mehr, muss man nochmal gucken,

Jochen

aber kann ich die halt auch in allen, dazu kommen wir dann später auch nochmal, Pipelines und so verwenden.

Jochen

Und Modelle, die halt diese API implementieren, werden dadurch austauschbar.

Jochen

Das ist halt auch total toll, weil ich dann halt sozusagen einfach nur über eine Liste von Modellen gehen kann

Jochen

und dann werfe ich die da rein und gucke, ob hinterher was rauskommt.

Jochen

Und ich muss das halt nicht für jedes Modell irgendwie einzeln nochmal anpassen.

Jochen

Ja, genau. Was wollten wir machen? Wir wollten Texte vektorisieren.

Nico

Ja, jetzt haben wir eigentlich unsere Zahlmatrix. Eigentlich sind wir jetzt bereit, um darauf Modelle langsam zu trainieren, oder?

Jochen

Genau, ich habe hier einen TF-EDF-Vectorizer sozusagen instanziiert, dann den gefittet auf den Trainingsdaten.

Jochen

Dem kann man auch noch alle möglichen Optionen mitgeben, was ich jetzt hier nicht getan habe, aber man kann eben noch sagen, wie er trainieren soll.

Nico

Ein gewisses Top-Wörter-Rauswerfen, was man auf jeden Fall machen würde, aber ja.

Jochen

Ja, genau. Aber halt irgendwie, dass man irgendwie smoothen soll oder man kann, welche Norm, man kann alles Mögliche da angeben.

Jochen

Und genau, den habe ich im Trainingsdaten gefüttert und ich benutze jetzt die Transform-Methode, um damit sozusagen die Texte aus den Trainingsdaten und aus den Testdaten in so Feature-Matrizen zu verwandeln.

Jochen

Das sind dann hinterher

Jochen

das ist auch nochmal so eine kleine Spezialität.

Jochen

Das ist jetzt natürlich

Jochen

das, was dabei rauskommt, hat relativ

Jochen

die Matrix, die da rauskommt. Normalerweise würde man jetzt denken, da kommt einfach nur ein NumPy

Jochen

Array raus, irgendwie Zahlen so viel wie es Dokumente gibt,

Jochen

Spalten so viele wie es Wörter gibt. Das Problem dabei ist natürlich so ein bisschen

Jochen

die allermeisten

Jochen

Werte in dieser Tabelle sind null, weil

Jochen

ja die allermeisten Worte halt nicht

Jochen

in allen Texten vorkommen, sondern

Jochen

ja,

Jochen

also

Jochen

pro Text habe ich halt eine Teilmenge der Worte, die

Jochen

überhaupt vorkommen, aber eben nicht alle

Jochen

und die allermeisten kommen halt

Jochen

nicht in den Text vor.

Dominik

Je mehr Nullen, je mehr Texte man hat?

Nico

Ja. Je mehr unterschiedliche Wörter

Nico

man hat. Ja, genau, richtig.

Dominik

Ja, genau, es ist ja dann mehr wahrscheinlicher, dass du mehr Texte hast,

Dominik

dass du mehr unterschiedliche Wörter hast.

Nico

Ja, wobei, also genau, wenn ich dann Texte habe, die alle sehr, sehr ähnlich sind, habe ich dann natürlich auch viele Einser vom Prinzip her. Das heißt einfach quasi wie sparse ist meine Matrix das Wort dafür.

Jochen

Genau, sparse.

Jochen

Die Daten sind halt sehr sparse

Jochen

und das ist halt

Jochen

ein Problem oder

Jochen

ist halt sehr verschwenderisch, was Hauptsprecher angeht,

Jochen

wenn man tatsächlich die Werte speichern würde.

Jochen

Und es gibt dann so

Jochen

aus dem SciPy

Jochen

Modul

Jochen

irgendwie gibt es dann Klassen, die sich halt

Jochen

mit sparse, mit dem

Jochen

Speichern von sparsen Matrizen irgendwie

Jochen

beschäftigen.

Jochen

Und

Jochen

ja, da

Jochen

der Trick ist im Grunde, dass man halt die ganzen Nullen

Jochen

einfach nicht speichert. Was man sagt,

Jochen

man speichert nur, an welchen

Jochen

Stellen irgendwie Zahlen sind. Alles andere

Jochen

ist halt

Jochen

defaultmäßig null und muss man halt auch nicht speichern.

Jochen

Und man kann sich das auch im Grunde so

Jochen

vorstellen, also die interessante Operation,

Jochen

die man jetzt auf sowas ausführt, zum Beispiel wenn man jetzt

Jochen

eine Suchmaschine hat, würde man irgendwie

Jochen

eine Cosinus-Distanz

Jochen

ausrechnen zwischen einem Dokument

Jochen

und einer Query.

Jochen

Das heißt sozusagen einfach nur das Scalar-Produkt.

Jochen

man würde den Query in Vektor verwandeln,

Jochen

ein Dokument

Jochen

in Vektor verwandeln und dann bildet man

Jochen

einfach das Skalarprodukt zwischen den beiden

Jochen

und dafür muss man ja sozusagen nur

Jochen

die Teile miteinander multiplizieren,

Jochen

die nicht Null sind, weil

Jochen

die anderen sind alle EU-Null,

Jochen

das wird aufsummiert, also

Jochen

es ist einfach weg und

Jochen

daher ist das natürlich toll, wenn man eine Struktur

Jochen

hat, wo sowieso nur die Teile gespeichert

Jochen

sind, die nicht Null sind und dann

Jochen

muss man nicht so viel speichern und

Jochen

hat trotzdem alles, was man braucht,

Jochen

um halt damit rechnen zu können.

Jochen

Ja, das

Jochen

funktioniert auch

Jochen

tatsächlich irgendwie als Eingabe

Jochen

für diverse Modelle, aber halt

Jochen

auch nicht für alle. Also da muss man dann halt auch wieder

Jochen

aufpassen, das ist so ein bisschen blöd. Also es gibt

Jochen

halt Modelle, die gut damit klarkommen, wenn man

Jochen

den Feature-Matrizen

Jochen

gibt, die sparse sind.

Jochen

Es gibt auch welche, bei denen das nicht geht.

Jochen

Und da muss man halt unter Bestimmten auch nochmal ein bisschen was

Jochen

machen, was man

Jochen

üblicherweise tun würde, also was ein Modell,

Jochen

was immer gut funktioniert, was man

Jochen

normalerweise immer braucht, aber was halt nicht

Jochen

klarkommt mit sparsen Daten, wäre halt sowas wie

Jochen

XGBoost zum Beispiel,

Jochen

so ein

Jochen

Decision Tree Modell.

Jochen

XGBoost?

Jochen

XGBoost, für Extreme

Jochen

Gradient Boosting.

Jochen

Ah, okay.

Jochen

Und

Jochen

da

Jochen

macht man das eigentlich, oder

Jochen

für alle, ich meine auch, was auch nicht mit

Jochen

Neuronalen Netze kommen auch normalerweise nicht mit Spasen

Jochen

Eingaben klar.

Jochen

Was man da vorher macht, ist, man reduziert

Jochen

die Dimensionen. Also wenn

Jochen

das, ich weiß jetzt nicht, was das,

Jochen

was ich glaube auch irgendwas, 25.000 Wörter gibt es da drin

Jochen

oder so.

Jochen

Wenn man jetzt aus diesen 25.000 Dimensionen

Jochen

etwas machen möchte, was

Jochen

dense, was dicht ist, dann

Jochen

projiziert man halt das aus dem

Jochen

aus diesem hochdimensionalen

Jochen

Vektorraum halt runter auf irgendwas

Jochen

mit 200 Dimensionen oder 300 oder so.

Jochen

Und dafür gibt es dann unterschiedliche Verfahren, aber das, was man

Jochen

normalerweise immer verwendet, ist Singular Value

Jochen

Decomposition

Jochen

und dann auch die Truncated-Variante

Jochen

davon, also Truncated Singular Value

Jochen

Decomposition. Das ist halt immer so das Ding,

Jochen

was man dann nutzt und projiziert, um

Jochen

die Sachen runter zu projizieren.

Nico

Es muss einem halt irgendwie mal klar sein, wenn man halt so einen

Nico

Korpus hat und dann hat man jetzt in

Nico

seinen Daten irgendwie

Nico

eine Million Dokumente und

Nico

diese Millionen Dokumente haben halt irgendwie

Nico

30.000 unterschiedliche

Nico

Wörter, dann habe ich halt nachher prinzipiell

Nico

erstmal eine Matrix, wenn ich jetzt nichts davon wegwerfe

Nico

oder so, von

Nico

1.000.000 mal 30.000

Nico

und das kann natürlich dann beliebig

Nico

mit größeren Datensätzen noch größer

Nico

werden und der Gedanke

Nico

an der Stelle ist einfach, mit

Nico

so einer Dimensionalitätsreduktion

Nico

verliere ich theoretisch Informationen,

Nico

aber

Nico

es gibt halt viele Dimensionen

Nico

oder viele dieser Spalten, die sich sehr, sehr ähnlich

Nico

verhalten werden. Also

Nico

der Optimalfall für eine

Nico

Dimensionalitätsreduktion ist, dass zwei

Nico

Spalten oder zwei Zahlen

Nico

quasi komplett gleich sind,

Nico

weil dann verliere ich quasi keine

Nico

Informationen darüber, wenn ich einfach sage, dass

Nico

diese beiden Spalten, wenn ich

Nico

die beiden quasi zusammenlege.

Nico

Und wenn zwei

Nico

Spalten sehr, sehr stark korreliert

Nico

sind, dann

Nico

verliere ich auch nicht viele Informationen in dem Moment,

Nico

wo ich die beiden irgendwie zusammen auf 1 abbilde.

Dominik

Also die, wenn die Spalten ja Wörter

Dominik

sind, dann ist ja gleiche Wörter relativ

Dominik

unwahrscheinlich, aber dann muss man tatsächlich diese

Dominik

Kombination finden aus der Grammatik, die

Dominik

wir eben hatten, halt das Modul laden dann, was war das?

Dominik

Word Conf, irgendwas

Dominik

von Google. Achso,

Dominik

WordSpec, aber. WordSpec, genau.

Dominik

Das könnte man ja nehmen als Information, um irgendwie

Dominik

so eine Kovarianz in den Wörtern festzustellen

Dominik

und die halt dann so zu gruppieren, dass

Dominik

die halt dann zusammenfassen. Theoretisch kann es aber

Nico

auch vorher der Fall sein. Also mal angenommen, ich habe

Nico

zum Beispiel einen Namen drin, mit einem Vornamen

Nico

und einem Nachnamen und der kommt halt tatsächlich nur in einem

Nico

der Texte vor. Dann habe ich da

Nico

natürlich zwei Spalten für.

Nico

Einmal der Vorname, einmal der

Nico

Nachnamen und die haben genau einmal eine 1 für ein Dokument,

Nico

dann sind

Nico

diese beiden Spalten natürlich perfekt korreliert.

Nico

Und dann können die natürlich auch beliebig

Nico

von der Dimensionalität

Nico

auf einer projiziert werden.

Nico

Also würde man da nur einen von beiden

Dominik

wegschmeißen oder sagt man einfach, ja, das ist eigentlich nur

Dominik

in einem Dokument, ist eigentlich egal?

Nico

Letztendlich machst du das selber gar nicht, sondern der Algorithmus

Nico

überlegt sich einfach selbstständig, wo

Nico

verliere ich am wenigsten Informationen, indem ich die

Nico

runtergebe und was ich von außen nur sage, ist

Nico

auf welche Zieldimension will ich gerne?

Dominik

Also dass da einfach 300 reicht.

Nico

Genau. Und der projiziert es für dich runter,

Nico

aber das ist die Logik, die dahinter steht.

Nico

Genau.

Nico

Und dabei geht praktisch

Jochen

nur sehr wenig Information verloren.

Jochen

Das funktioniert halt ziemlich gut.

Jochen

Genau.

Jochen

Also das ist halt auch so. Aber das ist halt irgendwie

Jochen

dann doch so eine Geschichte, wo man

Jochen

nicht immer irgendwie alles gleich

Jochen

verwenden kann. Weil es gibt halt Modelle, die kommen halt

Jochen

mit Spasen-Daten klar und manche halt nicht.

Jochen

Ja.

Jochen

Genau, genau, genau.

Jochen

Gut, aber jetzt wollen wir mal ein Modell trainieren.

Jochen

Ja, ein Modell trainieren, genau. Dafür gibt es dann halt auch

Jochen

irgendwie einmal

Jochen

eine Abstraktionsgeschichte, um halt dieses

Jochen

Multilevel-Ding

Jochen

Es gibt einige Modelle, die automatisch Multiclass können,

Jochen

aber Multilabel, da braucht man halt noch so einen Wrapper außenrum.

Jochen

Und eine einfache Art, wie man halt sozusagen aus einem Modell,

Jochen

also was alle Modelle können, ist halt binäre Klassifikation.

Jochen

Das ist halt auch das Einfachste.

Jochen

Und man kann jetzt natürlich aus binärer Klassifikation

Jochen

quasi automatisch eine Multilabel-Klassifikation machen,

Jochen

indem man einfach für jede Klasse eins gegen alle anderen ein Modell trainiert,

Jochen

was dann binäre Klassifikation macht.

Jochen

Und dann, das muss man aber auch nicht selber machen, sondern da gibt es dann halt schon ein vorgefertigtes Ding aus Scikit-Learn Multiclass, das Ding heißt One Versus REST Classifier und der tut das dann und man kriegt das gar nicht mit, sondern steckt einfach nur das eigene Modell, was man verwenden möchte, da rein und dann passiert das automatisch.

Jochen

Und dann gibt es halt noch aus dem Scikit-Learns-Metrics-Modul eine Classification-Report-Funktion, die einem dann so eine ganz schöne Übersicht gibt, was dann jetzt passiert ist mit den Testdaten, wenn man die dann nochmal durch das trainierte Modell durchgibt.

Jochen

Und ja, so eines der ersten Modelle, die man immer so ausprobieren würde, denke ich mal, ist so Logistic Regression. Das ist ein Klassifikationsmodell. Das heißt bloß Regression, das ist nicht so.

Nico

Ja, das ist auch total, habe ich am Anfang auch lange Zeit verwirrt, dass eine Methode, die Regression im Namen hat, in Wirklichkeit eine Klassifikation ist, aber das ist halt der Algorithmus, der im Endeffekt dahinter steht, da sollte man nicht zu tief drauf reingehen.

Nico

Genau, genau.

Jochen

Und das ist halt so ein Standardding.

Jochen

Das ist immer etwas, was man immer am Anfang verwendet,

Jochen

weil das ist halt, funktioniert auf

Jochen

vielen Sachen ganz gut. Es ist sehr schnell.

Jochen

Ja.

Jochen

Daher

Jochen

man kann gut verstehen, was es macht.

Jochen

Daher

Jochen

man würde gar nicht mit so totalen

Jochen

Fancy-Verfahren anfangen, sondern

Jochen

eher so mit simplen und dann erstmal gucken, was da überhaupt

Jochen

passiert. Und dann kann man ja immer

Jochen

noch kompliziertere Dinge machen, wenn das halt nicht reicht.

Jochen

Ja.

Jochen

Genau, Model ist jetzt sozusagen einfach nur Run-versus-Rest-Classifier und da das Logistic Regression-Modell reingesteckt und dann einmal Fit auf, um das Modell zu trainieren und dann einmal Predict, um die Voraussagen zu bekommen für die Testdokumente.

Nico

Ich finde, das ist ein sehr gutes Beispiel für, wie so ein echtes Welt-Data-Science-Projekt aussieht, weil wenn man jetzt irgendwie sagt, also wenn man von außen dann naiv drauf schaut und denkt sich so, so schwer kann es doch nicht sein, du machst irgendwie Hello World, irgendwie Regression oder Klassifikation, dann findest du halt einfach, irgendwo werden Daten vorgefertigt, richtig geladen und dann nimmst du dieses Modell, importierst es, machst ein Fit, machst ein Predict und hast dein Ergebnis.

Nico

Also das eigentliche Modell trainieren ist kein Problem, aber wir reden jetzt hier schon eine Stunde, eine halbe oder so darüber, wie wir da hinkommen und das ist die Schwierigkeit bei dem Ganzen, dass es halt in Wirklichkeit dann doch nicht so trivial ist, dass man halt eben irgendwie Multiclass oder Multilabel hat oder sehr große Matrizen oder Dimensionalitäten reduzieren muss und Features ingenieren und genau, dieser Weg dahin ist das Komplizierte.

Nico

Ja, und dann haben wir aber jetzt eine Prognose raus und müssen uns überlegen, wie gehen wir mit der um, wo es auch wieder anfängt komplizierter zu werden.

Jochen

Genau, es wäre wahrscheinlich ein bisschen unübersichtlich beim Classification Report das halt über alle 90 Kategorien zu machen, deswegen habe ich jetzt einfach mal die Top 10 Kategorien genommen. Das ist auch so, wenn man sich dafür interessiert, gibt es halt die Doktorarbeit von Thorsten Joachim, die ist glaube ich eines der meist zitierten Papers sozusagen im Textklassifikationsbereich, irgendwie ist es anderthalb tausend Mal zitiert worden oder so.

Jochen

Der hat sich damit zuerst 1998 irgendwie beschäftigt und das Ding gibt es als Buch oder man kann halt irgendwie zu so einer Schattenbibliothek gehen, da gibt es das auch.

Jochen

Und da kann man sich halt auch, da guckt man sich auch mal die Top 10 Kategorien an und kann das einfach mal vergleichen, die Zahlen, die er da rauskriegt mit dem, was man da selber irgendwie dann sozusagen da als Ergebnis hat und ja, sieht eigentlich alles ganz gut aus.

Jochen

Genau, was man da in Spalten in dem Klassifikationsreport drinstehen hat, sind halt einmal die Namen der Kategorien, dann Precision, Recall, F1-Score und ja, wie viele Beispiele es gab.

Nico

Genau, und das ist was, womit man den Umgang auf jeden Fall wirklich lernen muss.

Nico

Da hat mich ganz am Anfang, als ich angefangen habe mit Data Science, konnte ich mit den ganzen Zahlen auch nicht wirklich was anfangen.

Nico

Was man ja immer im Wesentlichen hat, ist, man hat prinzipiell vier Fälle.

Nico

Ich kann einfach, bei einer binären Klassifikation, was so das Einfachste ist,

Nico

da kann es sein, dass ein Ergebnis quasi wahr ist.

Nico

Und ich habe auch gesagt, dass es wahr ist, das ist das Einfachste.

Nico

Dann habe ich ein True Positive.

Nico

Es kann auch sein, dass es falsch ist.

Nico

Und ich habe aber gesagt, dass es wahr ist.

Nico

Dann habe ich ein false positive.

Nico

Ich kann sein, dass ich richtig gelegen habe

Nico

und es negativ ist.

Nico

Dann habe ich ein true negative.

Nico

Oder es kann negativ sein

Nico

und ich lag auch noch daneben.

Nico

Dann habe ich ein false negative.

Nico

So, und jetzt gibt es quasi Kombinationen

Nico

von diesen Feldern für Precision und Recall.

Nico

Und die inhaltliche Bedeutung davon ist vom Prinzip,

Nico

also man kann sich das auch in den Formeln anschauen,

Nico

ich finde das hilft aber weniger,

Nico

als einfach zu sagen, die Precision ist, wie viele von meinen Daten,

Nico

wo ich gesagt habe, dass sie wahr sind, sind auch wirklich wahr.

Nico

Und Recall ist, wie viele von denen, die prinzipiell wahr sind,

Nico

die ich quasi prognostizieren wollte, habe ich denn auch erwischt.

Nico

Das sind so die beiden.

Nico

Und dazwischen habe ich so einen Trade-off.

Nico

Und da muss ich halt abwägen.

Nico

Und das ist, was der F1-Score im Endeffekt macht.

Nico

der tut nämlich einfach quasi

Nico

die beiden so verrechnen,

Nico

dass nachher ein Zahlenwert rauskommt

Nico

zwischen 0 und 1 und wenn ich quasi die

Nico

1 habe, dann habe ich quasi sowohl Precision

Nico

als auch Recall perfekt bei 1

Nico

und wenn ich bei 0 habe, lag ich bei beiden

Nico

komplett falsch und der gibt so

Nico

eine Art Bonus, durch das wie er

Nico

berechnet wird, dass ich quasi die beiden

Nico

auch relativ ausgewogen habe. Also wenn ich

Nico

da quasi die Precision auf 1 habe, aber den

Nico

Recall bei 0, dann bin ich da nachher trotzdem

Nico

bei einer 0.

Nico

Das sind die drei wesentlichen

Nico

Metriken dieses Reports und dann gibt es halt

Nico

eben noch den Support, der einfach quasi

Nico

aussagt, okay, wie häufig ist denn der Fall

Nico

überhaupt, um mir so eine Absolut-Skala

Nico

zu geben, weil diese Zahlenwerte sind jetzt

Nico

natürlich alles relativ, wenn ich nur ein Beispiel

Nico

habe und das habe ich richtig klassifiziert, dann

Nico

habe ich einen F1-Score von 1 und alles ist super,

Nico

aber wenn es halt nur ein Beispiel war, dann hilft

Nico

mir das real im echten Leben natürlich wenig.

Nico

Deswegen ist dieser F1-Score, äh, dieser

Nico

Support dann so eine Matrix für, wie

Nico

wichtig ist es denn in absoluten Zahlen.

Nico

Ja, ja, ja, ne, finde ich

Jochen

genau, super erklärt.

Jochen

also so F1-Core finde ich

Jochen

es mal, also man braucht das

Jochen

sowas in der Art häufig, wenn man jetzt

Jochen

zum Beispiel Modelle ranken möchte, man möchte

Jochen

jetzt das beste Modell haben, wo man jetzt Precision

Jochen

und Recall-Werte hat, dann ist es halt blöd, man kann halt nicht so

Jochen

richtig gut nach, wenn man jetzt 2-Werte

Jochen

hat, irgendwie, wie will man dann sortieren?

Jochen

Daher

Jochen

muss man das halt irgendwie

Jochen

in einen Wert

Jochen

zusammenfassen und dann nimmt man halt einen F1-Wert,

Jochen

man kann das auch irgendwie anders ausrechnen, aber

Jochen

das ist halt das, was meistens gemacht wird.

Jochen

Ja, und einer der Gründe, weshalb man da sowas überhaupt machen muss, man kann sich jetzt nicht einfach vorstellen, warum immer nicht einfach Accuracy oder so, ja, das geht halt nicht so gut, also Accuracy funktioniert halt dann gut, wenn alle Klassen irgendwie die gleiche Anzahl von Beispielen haben und so, dann geht das vielleicht, aber das wird auch schwer sich vorzustellen, wenn man jetzt irgendwie was anderes hat als nur zwei.

Jochen

Aber es hat auch sonst irgendwie blöde Eigenschaften. Also wenn man sich jetzt nochmal das Beispiel mit dem Spam und Nicht-Spam vorstellt. Also bei dir scheint das ja nicht so zu sein. Du kriegst ja auch nicht so viel Spam, aber bei mir mag das schon so mit dem, was andere Leute auch beobachten, übereinstimmen, dass halt 99% der Mails, die ich bekomme, sind halt Spam.

Dominik

was dann noch darunter fällt vielleicht.

Dominik

Ja.

Dominik

Also ich habe sozusagen eine sehr ungleiche

Dominik

Verteilung der

Jochen

der Klassen und wenn ich

Jochen

jetzt sozusagen Accuracy

Jochen

nehme als Maß oder als Metrik dafür,

Jochen

wie gut ist das jetzt,

Jochen

dann könnte ich jetzt einen Classifier bauen, der sagt

Jochen

irgendwie immer, es ist Spam.

Jochen

Und der hätte dann Accuracy von 99%.

Jochen

Klingt doch super, voll gut. Aber der macht

Jochen

ja eigentlich gar nichts oder macht auf jeden Fall

Jochen

nichts Sinnvolles, weil hinterher kriege ich

Jochen

halt gar keine Mail mehr und

Jochen

diese Irrtumswahrscheinlichkeit

Dominik

ist tatsächlich, glaube ich, relativ relevant, auch für den

Dominik

Untersuchungsgegenstand, den man hat. Ich weiß nicht, ob wir

Dominik

Alpha- oder Beta-Fehler nennt man das, glaube ich, so in der klassischen

Jochen

Statistik. Ja, oder viele Erste Ordnung

Jochen

oder Zweite Ordnung oder sowas.

Jochen

Und das ist ja schon

Dominik

sehr entscheidend, also was für Untersuchungsgegenstand

Dominik

man hat. Manchmal ist 5% Abweichung

Dominik

dann ganz okay, weil 95 Treffer Wahrscheinlichkeit ist

Dominik

ausreichend irgendwie. Vielleicht bei Hund, Katze

Dominik

unterscheiden, vielleicht auch nicht ganz so wichtig. Aber

Dominik

bei anderen Dingen ist halt dann das 1%,

Dominik

1% zu viel. Also gerade, wenn man so

Dominik

Häufigkeitsverteilung hat, wie es kommt nur

Dominik

ein Prozent der Fälle sowas raus

Dominik

und dann falsch liegt es vielleicht nicht so super.

Jochen

Ja, aber eben bei Accuracy würde man

Jochen

halt gar nicht sehen, dass man da ein riesen Problem hat, wenn man

Jochen

die 99 Prozent sieht.

Jochen

Aber vielleicht muss man dann

Dominik

einen negativen Fehler nehmen, dann muss man vielleicht nicht versuchen

Dominik

einen Spam zu tracken, sondern eine richtige Mail.

Jochen

Aber wenn man jetzt Precision Recall nehmen würde,

Jochen

würde man sagen, okay, dann sieht man es halt sofort, weil

Jochen

Precision wäre null.

Dominik

Andersrum ist halt tatsächlich dieses Ding,

Dominik

wenn du halt den Spam immer versuchst zu tracken

Dominik

und er sagt immer Spam, dann müsstest du halt

Dominik

das umdrehen, musst du sagen, hey, ich möchte richtigen Text tracken

Dominik

und dann hättest du halt vielleicht eine bessere Erkennungsrate

Dominik

oder so, ja, weil du das halt

Dominik

nicht wegschmeißen würdest durch die Fehlerwahrscheinlichkeit.

Dominik

Ja,

Dominik

auf jeden Fall, also

Jochen

für so im allgemeinen

Jochen

Fall, wenn man viele Klassen oder

Jochen

Labels hat und unterschiedlich

Jochen

verteilte

Jochen

Klassen, dann sind halt

Jochen

Precision Recall halt ein viel besseres Maß

Jochen

als irgendwie

Jochen

Accuracy. Daher nimmt man das als, es gibt

Jochen

auch noch andere Metriken, die man irgendwie benutzen

Jochen

kann, aber das ist schon irgendwie so

Jochen

das verbreitetste,

Jochen

denke ich mal. Das kommt halt auch so aus

Jochen

diesem Information Retrieval-Bereich.

Jochen

Genau, und diese Metriken

Jochen

sind halt so ein bisschen,

Nico

ja, man muss damit halt lernen umzugehen.

Nico

Jedes Problem ist ein bisschen anders. Also,

Nico

wir haben jetzt hier, wie gesagt, so eine Multilabel-Klassifikation.

Nico

Wenn ich jetzt

Nico

eine Regression habe, habe ich plötzlich wieder komplett

Nico

andere Metriken, die ich da benutze.

Nico

Ich setze mich gerade das erste

Nico

Mal in meinem Leben so ein bisschen mit Recommender-Engines

Nico

auseinander, wo man quasi gleich ganze

Nico

Listen immer zurückgibt

Nico

und quasi sagt, okay, ich glaube

Nico

das Erste ist das Wahrscheinlichste, das

Nico

Zweite ist das Zweitwahrscheinlichste und so weiter, dann braucht man

Nico

auch wieder ganz andere Metriken. Also

Nico

genau, gerade in diesem Metrikenfeld

Nico

wird es dann interessant, in welchem

Nico

Bereich von Data Science man sich begibt

Nico

und was man gerne machen möchte.

Nico

Ja, da kann man

Nico

viel Zeit reinstecken. Das ist auch wichtig.

Nico

Genau, und

Jochen

das ist halt, das ist teilweise auch sehr schwer zu erklären,

Jochen

also wenn man dann irgendwie

Jochen

ja, dass dann halt

Jochen

auch Ergebnisse irgendwie

Jochen

reportet,

Jochen

ist manchmal nicht so einfach zu erklären,

Jochen

warum man das jetzt so macht und nicht irgendwie

Jochen

einen einfachen einzelnen Wert nimmt oder so.

Jochen

Ja,

Jochen

muss man halt gut sein im

Jochen

Erklären, keine Ahnung.

Nico

Genau, beim Wesentlichen sind wir jetzt die

Nico

Basispipeline ja einmal durch. Also wir haben unsere Daten

Nico

geladen, wir haben sie uns ein bisschen

Nico

angeschaut, wir haben

Nico

darauf jetzt zwar kein großes

Nico

Feature-Engineering gemacht, also wir haben jetzt nicht versucht,

Nico

irgendwie noch zusätzlich sowas

Nico

dran zu spielen, wie zum Beispiel die Textlänge, die

Nico

noch nicht vorher in den Daten so mit drin war und auf

Nico

denen mitzulernen oder sowas man machen könnte, aber wir

Nico

haben zumindest den ganzen Text umgewandelt

Nico

in eine Zahlenmatrix und die reduziert

Nico

und darauf jetzt halt eben ein Modell

Nico

berechnet und können sagen,

Nico

wie gut dieses Modell ist.

Nico

Wenn man jetzt

Dominik

einfach da eine Spalte dran hängt, geht

Dominik

das einfach so? Also wenn man das schon so ein bisschen modelliert hat,

Dominik

dass man dann sagt, hey, ich hänge jetzt sowas dran

Dominik

wie die Länge.

Jochen

Ähm, genau, also hier erzeuge ich ja sozusagen die Feature-Matrizen direkt aus dem Text, aber wenn wir uns jetzt zum Beispiel mal angucken, na, ich glaube, das Grid-Search-Ding macht das dann halt auch schon so ein bisschen anders.

Jochen

Was man da normalerweise dann hat, ist halt eben nicht so eine naive Geschichte, wo man das einfach so erzeugt, sondern man hat halt eine, die Feature Matrix wird erzeugt durch, oder überhaupt das komplette Ding ist halt eine Pipeline, ist halt auch eine Klasse aus Cycle Learn und die kombiniert im Grunde viele Schritte sozusagen zu einem Ding, das sich insgesamt wieder so verhält wie ein Modell.

Jochen

Also zum Beispiel jetzt bei dieser, in diesem Notebook ist es halt so, da sind die Schritte, aus denen die Pipeline besteht, halt, ja, das ist eine zweite Geschichte, die ich irgendwie da noch einführen muss.

Jochen

Das Ding nennt sich Feature Union und man kann sich das im Grunde so vorstellen, also Feature Union macht genau das, was du jetzt vorhattest, einfach irgendwie Dinge an die Feature Matrix spalten, an die Feature Matrix dran bauen, sozusagen.

Jochen

Ich habe unterschiedliche Spalten und ich möchte die zusammen kombinieren zu einer Feature-Matrix. Dann nehme ich Feature-Union, das fügt die Spalten zusammen und die Pipeline integriert die ganzen Schritte, die nötig sind, um irgendwas zu tun.

Jochen

halt, also

Jochen

Feature-Extraktionen,

Jochen

unterschiedliche Arten von Feature-Extraktionen

Jochen

und halt am Schluss irgendwie ein Modell

Jochen

trainieren und

Jochen

ja, auf den Testdaten

Jochen

halt Predictions machen.

Jochen

Sodass das Ganze sich wieder als ein

Jochen

Modell irgendwie benutzen lässt.

Jochen

Und was das hier tut, ist

Jochen

ja, ich übergib

Jochen

der Feature-Union

Jochen

halt irgendwie eine Liste von Transformern,

Jochen

die irgendwie Dinge tun und

Jochen

man kann die jetzt ineinander

Jochen

wieder verschachteln. Das ist jetzt wieder eine Pipeline.

Jochen

Und die Pipeline,

Jochen

die da drin ist, die macht halt

Jochen

der erste Schritt, der nimmt

Jochen

eine Spalte aus dem

Jochen

DataFrame, und zwar den Titel

Jochen

und

Jochen

macht dann eben so etwas wie

Jochen

Textstatistiken

Jochen

drauf. Also sowas wie, wie lang ist der Titel?

Jochen

Wie viele Buchstaben sind

Jochen

da drin? Wie viele Wörter sind da drin?

Jochen

oder sowas, ich weiß jetzt gar nicht mehr genau, was das tut.

Jochen

Und dann skaliert er halt diese,

Jochen

weil bei TF-EDF ist das halt

Jochen

automatisch drin, das ist halt

Jochen

irgendwie

Jochen

sozusagen

Jochen

skaliert ist auf

Jochen

einen Intervall zwischen, weiß ich nicht,

Jochen

0 und 1 und

Jochen

normalisiert, sodass es halt

Jochen

irgendwie alle Vektoren, die Länge 1 haben.

Jochen

Bei den Textstatistiken

Jochen

ist das natürlich nicht, da kommt dann halt so eine Zahl raus,

Jochen

wie, der Titel hat jetzt

Jochen

25 Buchstaben und

Jochen

da, was man eigentlich immer

Jochen

macht, wenn man jetzt solche Zahlen hat, ist

Jochen

das so zu skalieren,

Jochen

dass alle Features irgendwie

Jochen

immer zwischen

Jochen

minus 1 und 1

Jochen

oder zwischen 0 und 1 sind

Jochen

und auch eine Standardabweichung

Jochen

von 1 haben.

Nico

Das hängt halt auch mal viel damit zusammen, was für ein Algorithmus du im Nachhinein

Nico

dann benutzt. Manche Algorithmen

Nico

können gut umgehen mit

Nico

komplett absolut skalierten

Nico

Werten, also so im Entscheidungsbaum zum Beispiel,

Nico

dem ist das relativ egal, wo er

Nico

jetzt zwischen, ob du jetzt die Werte zwischen

Nico

0 und 1 reingibst und Werte

Nico

zwischen 0 und 10.000, weil der

Nico

entscheidet einfach irgendwo, okay, zwischen diesen

Nico

zwei bitte splitte und

Nico

das rechte Ast, das linke Ast,

Nico

aber bei so einer linearen

Nico

Regression zum Beispiel, da ist es

Nico

halt von Bedeutung, wenn deine

Nico

Achsen alle ganz unterschiedlich

Nico

sind. Also ich könnte, das Wichtige ist eigentlich nur, dass

Nico

sie halbwegs miteinander vergleichbar sind.

Nico

Ich könnte sie auch alle von 0 bis 100 skalieren

Nico

oder so, aber die Konvention ist halt einfach,

Nico

man macht das halt einfach alles zwischen 0 und 1 oder

Nico

minus 1 und 1, je nachdem, was man da vielleicht

Nico

bezwecken möchte.

Nico

Und damit macht man in der Regel nichts falsch.

Nico

Also kann man sich ganz einfach vorstellen,

Jochen

bei einem linearen Modell, ein lineares Modell bedeutet,

Jochen

dass du im Grunde

Jochen

einen Vektor

Jochen

hast, der genau die gleiche

Jochen

Dimension hat, wie du Spalten hast,

Jochen

sozusagen.

Jochen

Und die Klassifikation ist einfach

Jochen

nur das Skalarprodukt aus einem neuen Feature-Vektor

Jochen

und diesem Modell.

Jochen

Und jetzt gibt es

Jochen

ganz viele unterschiedliche Arten,

Jochen

dieses Modell zu trainieren,

Jochen

aber das ist immer das Gleiche, wenn das ein lineares

Jochen

Modell ist. Also ob ich jetzt eine Support-Vector-Maschine

Jochen

nehme, die das halt

Jochen

trainiert oder halt Logistic Regression

Jochen

oder halt irgendwie sonst

Jochen

eins von den

Jochen

Generalized Linear Models oder so,

Jochen

die es da so gibt, da fällt immer so ein Vektor

Jochen

dabei raus und die Klassifikation ist eigentlich immer gleich.

Jochen

Und ich kann mir natürlich

Jochen

jetzt leicht vorstellen, was passiert, wenn ich

Jochen

irgendwie überall Werte zwischen 0 und 1

Jochen

habe in den Spalten. Nur in einer Spalte habe ich jetzt

Jochen

Werte um die 10.000 oder so.

Jochen

Dann dominiert diese Spalte natürlich das

Jochen

Klassifikationsergebnis massiv. Das heißt,

Jochen

ich muss die alle so normiert haben,

Jochen

dass hinterher die Länge der Vektoren

Jochen

1 ist, damit nicht

Jochen

ein Feature halt da so

Jochen

irgendwie, so alle Features sollten

Jochen

irgendwie so quasi numerisch gleich

Jochen

wichtig sein.

Jochen

Ja, deswegen muss ich das halt skalieren am Schluss.

Jochen

Und dafür nimmt man halt, ja, gibt es auch

Jochen

unterschiedliche Skalierer und

Jochen

Standard Scaler macht, glaube ich, irgendwie

Jochen

ja,

Jochen

weiß ich gar nicht.

Jochen

Ja, es skaliert halt.

Jochen

Es skaliert halt irgendwie runter, genau.

Nico

Der wesentliche Punkt eigentlich bei diesen Pipelines ist,

Nico

ich könnte diese ganzen Schritte auch alle nacheinander

Nico

ausführen. Also ich kann prinzipiell

Nico

in meinem Notebook, das haben wir

Nico

vorher quasi auch gesehen, in dem

Nico

linearen Regressionsnotebook,

Nico

ich kann

Nico

erst meinen Text umwandeln,

Nico

Dimensionalitätsreaktionen ausführen in der nächsten

Nico

Zelle und quasi immer dazwischen meine Werte

Nico

irgendwie in ein neues DataFrame schreiben

Nico

und das wieder in das nächste reinführen.

Nico

Ist zum Debuggen vielleicht auch mal

Nico

ganz hilfreich, aber wenn ich nachher quasi

Nico

dann einfach damit spielen möchte,

Nico

verschiedene Werte zu verändern, dann will ich, dass das

Nico

möglichst einfach hintereinander durchläuft

Nico

und ich weiß nicht, cashen so

Nico

Pipelines auch zwischendrin Schritte? Genau.

Nico

Genau, das heißt, das macht es auch deutlich effizienter,

Nico

wenn ich dann quasi in einem

Nico

relativ späten Step in der Pipeline

Nico

eine Kleinigkeit ändere, dann muss die halt nicht

Nico

komplett von vorne durchgeführt werden

Nico

und genau, das mache ich

Nico

prinzipiell eher, wenn ich

Nico

schon so die erste Exploration

Nico

durch habe, dann würde ich anfangen, sowas in eine Pipeline

Nico

zu stecken oder machst du das wirklich von Anfang an?

Jochen

Ne, genau, ich mache das auch erst, wenn ich ungefähr weiß,

Jochen

was ich damit tun möchte

Jochen

und ja,

Jochen

genau, man braucht es halt auch

Jochen

vor allen Dingen deswegen, wenn man jetzt unterschiedliche Sachen

Jochen

ausprobieren möchte, das ist halt

Jochen

Stichwort wäre

Jochen

Hyperparameter-Optimierung, also sozusagen, welche

Jochen

Features verwende ich.

Jochen

Man kann ja im Moment ja dann doch

Jochen

wieder gewichten, wenn man möchte, oder?

Jochen

Oder mit so Gewichten so ein bisschen umspielen?

Jochen

Natürlich, man kann auch einzelne Teile davon,

Jochen

man könnte jetzt unterschiedliche Feature-Unions

Jochen

bauen, so eine zum Beispiel, die sich nur mit dem

Jochen

also das ist ja

Jochen

im Grunde hier auch schon so, also ein Ding,

Jochen

das sich halt nur mit dem Text beschäftigt oder

Jochen

eins, was sich mit dem Body,

Jochen

mit dem Titel beschäftigt und eins, was sich mit dem

Jochen

Body dieser Ticker-Meldung

Jochen

beschäftigt und jetzt könnte man

Jochen

diesen Dingern unterschiedliche Gewichte geben auch.

Jochen

Das auf jeden Fall.

Jochen

Ja, aber all diese Änderungen, die man macht,

Jochen

wenn man jetzt da an irgendwelchen Parametern dreht,

Jochen

die möchte man ja hinterher auch,

Jochen

also das muss man sich ja irgendwie merken

Jochen

und eigentlich möchte man das ja auch systematisch durchprobieren

Jochen

und das nicht von Hand immer wieder verändern.

Jochen

Und ein Verfahren, um das halt systematisch durchzuprobieren,

Jochen

ist halt GridSearch und das ist halt auch ein Vorteil,

Jochen

wenn man jetzt so eine Feature-Pipeline hat,

Jochen

dass man sozusagen die Bereiche für die Parameter,

Jochen

die man halt durchprobieren möchte,

Jochen

die gibt man halt irgendwie an

Jochen

und dann ruft man das halt

Jochen

mit GridSearch auf und dann werden diese ganzen

Jochen

Parameter, dieses Parameter-Grid halt durchprobiert

Jochen

und am Schluss

Jochen

fällt halt das Modell raus, was

Jochen

am besten funktioniert hat, beziehungsweise alle anderen

Jochen

Ergebnisse werden auch gespeichert. Normalerweise will man jetzt

Jochen

da irgendwie aus diesem GridSearch

Jochen

Ding halt rausholen

Jochen

und irgendwo ein CSV schreiben oder irgendwie

Jochen

und dann kann man sich das halt hinterher visualisieren

Jochen

und dann halt gucken, okay, wann

Jochen

habe ich das mit welchen Parametern irgendwie ausprobiert

Jochen

und was dabei rausgekommen.

Jochen

Genau, ich würde da die

Nico

Hyperparameter-Tuning nochmal kurz ein bisschen aufgreifen.

Nico

Jeder dieser Algorithmen, die wir jetzt

Nico

erwähnt haben, die haben jede Menge Parameter,

Nico

die man da mitgeben kann.

Nico

Eine ganz einfache lineare Regression

Nico

ist vielleicht noch relativ beschränkt,

Nico

aber sobald wir die jetzt zum Beispiel

Nico

regularisieren,

Nico

das heißt irgendwie verhindern, dass die

Nico

zu stark sich den Daten anpasst,

Nico

bekommt die Hyperparameter oder noch einfacher

Nico

finde ich es sich vorzustellen, bei so einem Entscheidungsbaum

Nico

Der hat halt eine gewisse Tiefe, der kann irgendwie auf 100 Leveln verschachtelt sein oder nur auf 2 und der kann auch zum Beispiel beschränkt werden in der Anzahl der letztendlichen Blätter, also wie viele mögliche Output-Ergebnisse kommen dahin oder wie viele Samples müssen in jede dieser Blätter letztendlich fallen.

Nico

Das sind zum Beispiel schon drei verschiedene Parameter, die man da so mitgeben kann und die können die Art, wie gut dieses Modell performt, extrem beeinflussen. Das ist wirklich sehr, sehr entscheidend und deswegen ist es wichtig, die einfach nach und nach durchzuprobieren.

Nico

Und man sagt jetzt, wir haben doch irgendwie selbstlernende Algorithmen, irgendwie, warum muss ich denn da jetzt noch Parameter tunen? Aber ich passe ja quasi einfach die, man muss, es sind halt zwei verschiedene Arten von Parametern. Die einen sind quasi die internen, die berechnet werden innerhalb des Algorithmuses, die lernt er aus den Daten und das andere sind quasi so die Konfigurationsobjekte, wie man das, wie die Berechnung von diesen anderen Parametern zustande kommt.

Nico

Und die muss ich ihm halt eben mitgeben oder ich versuche sie halt einfach alle, probiere sie halt einfach alle durch. Und das ist, was ich mehr oder weniger bei so einem Hyperparameter-Search mache. Ich überlege mir irgendeine Strategie, dass er einfach möglichst viele von denen durchprobiert. Da gibt es auch Algorithmen, die versuchen quasi selbstständig so ein bisschen zu wählen, an welcher Schraube drehe ich als nächstes, um halt dann den Algorithmus an der Stelle optimal zu tunen.

Nico

Und das ist halt ein ganz entscheidender Prozess innerhalb von so einem Data-Science-Projekt.

Jochen

Ja, auch um halt die, man möchte es auch deshalb schon formalisieren,

Jochen

damit man die Ergebnisse kommuniziert bekommt,

Jochen

weil wenn ich jetzt im Notebook irgendwie Parameter ändere

Jochen

und das durchprobiere, dann weiß ich das vielleicht noch,

Jochen

obwohl meistens vergisst man das ja auch relativ schnell wieder,

Jochen

was man alles probiert hat.

Jochen

Dann weiß man vielleicht noch so,

Jochen

ach, vor zwei Wochen hatte ich da irgendwas gemacht,

Jochen

das war ziemlich gut.

Jochen

Oh, was war das nochmal?

Jochen

Man möchte das ja auch, wenn da mehrere Leute dran arbeiten,

Jochen

denen das ja auch irgendwie kommunizieren

Jochen

und da ist es natürlich dann schon gut,

Jochen

wenn man das systematisch gemacht hat,

Jochen

weil dann fallen da eben solche CSVs

Jochen

einfach schon bei raus und man kann halt auch gucken, was andere Leute

Jochen

schon probiert haben und muss das dann auch nicht nochmal

Nico

selber machen. Genau, und diese Hyper-Parameter-Search

Nico

gibt einem halt am Ende auch so eine

Nico

Operation irgendwie Best Parameter

Nico

oder Best Fit oder sowas und dann

Nico

gibt der einem halt einfach das Beste

Nico

von allen, die er ausprobiert hat, wieder.

Nico

Aber ansonsten,

Nico

wenn du quasi auch so tracken möchtest,

Nico

was hat gut funktioniert und auch Features reiningenieren

Nico

möchtest, du schreibst es dann einfach in CSVs weg

Nico

oder wie machst du das? Ja, meistens

Nico

tatsächlich, ja.

Nico

Weil das finde ich immer noch ein bisschen

Nico

überraschend, dass da Second Learn an der Stelle irgendwie

Nico

nichts von sich aus bietet.

Nico

Also ich habe mir jetzt gerade da auch diverse Tools

Nico

angeschaut. Ich finde da jetzt

Nico

MLflow von

Nico

Dataprix ganz cool,

Nico

die ja auch quasi Spark gebaut haben.

Nico

Die haben da ein Tool für gebaut.

Nico

Es gibt da auch irgendwie Sacred und DVC,

Nico

die ich mir alle mal angeschaut habe, aber

Nico

irgendwie finde ich es merkwürdig,

Nico

jeder kommt in diese Predulie, dass er jetzt

Nico

quasi ein bisschen damit rumspielt und seine ganzen

Nico

Ergebnisse an und nach noch tracken möchte

Nico

und jeder schreibt sich die irgendwie so ein bisschen

Nico

auf seine eigene Art weg, aber

Nico

ja, der Standardsupport irgendwie

Nico

von irgendwelchen Bibliotheken ist da, finde ich, noch ein bisschen

Nico

jung und schwach.

Nico

Ja, ja.

Nico

Wie fandest du DVC?

Jochen

Das wollte ich mir demnächst mal irgendwie angucken.

Jochen

DVC ist halt nicht

Nico

Pythonic, ja.

Nico

Also das basiert halt komplett auf

Nico

Kommandozahlenaufrufen

Nico

und Shell-Skripten. Ich habe

Nico

letztendlich quasi so die Abwägung, würde ich sagen,

Nico

wenn du schnell

Nico

Sachen ausprobieren willst

Nico

und mehr so in der

Nico

Exploration bist, dann guck dir lieber ML-Flow

Nico

an. Das finde ich dafür deutlich angenehmer.

Nico

Wenn du sehr viel Wert

Nico

auf Reproduzierbarkeit deiner Experimente

Nico

legst und vielleicht auch große

Nico

Experimente machst und dafür bereit bist,

Nico

mehr Zeit zu investieren

Nico

und mehr so ein höheres Maturity-Level

Nico

vom Prinzip her hast und auch im Team arbeitest,

Nico

dann ist DVC meiner Meinung nach

Nico

die bessere Wahl. Also ich habe Kollegen, die benutzen das eine

Nico

als das andere. Das hängt ein bisschen mehr

Nico

von deinem Projekt ab, aber gerade für die Exploration

Nico

finde ich DVC einfach

Nico

zu viel Boilerplate-Code.

Nico

Ich verlinke dazu mal

Nico

meinen Artikel, den ich auch gerade noch

Nico

geschrieben habe, genau darüber.

Nico

Ja.

Nico

Jetzt könnte man

Nico

natürlich alle möglichen verschiedenen Algorithmen

Nico

draufwerfen und so, aber ich würde sagen, das überlassen

Nico

wir mal den Hörern. Da könnte man jetzt auch ewig

Nico

Zeit drauf werfen.

Nico

Haben wir irgendwas

Nico

Wesentliches vergessen?

Dominik

Den grundsätzlichen Prozess, dieses Datenbeispiel

Dominik

da von Reuters mal kurz so

Dominik

zu skizzieren, haben wir schon durch, oder?

Dominik

Also es funktioniert auf jeden Fall.

Dominik

Wir haben jetzt tatsächlich gelernt,

Dominik

wie man so eine neue

Dominik

Nachricht dann mit so einem Label versieht, dass dann

Dominik

die Klasse so, was ist das für eine Kategorie,

Dominik

rausfällt unten, oder?

Nico

Genau. Also wir sind jetzt in der Lage,

Nico

Wir haben jetzt ein Modell da liegen, was auf den Testdaten Prognosen rechnen könnte und wenn jetzt ein neuer vergleichbarer Textartikel reinkommt, der dieselben Spalten hat, egal wo der herkommt, dann können wir den auch reinwerfen und dann wird der einen der Tags voraussagen, die wir jetzt quasi da drin hatten.

Nico

da können jetzt kein originär neuer

Nico

Artikel natürlich rausfallen

Nico

oder so, aber

Nico

das haben wir

Nico

und können auch bewerten, wie gut wir daran sind.

Nico

Ja, also

Dominik

haben wir quasi unser erstes Projekt erfolgreich

Dominik

abgeschlossen und wenn wir das jetzt auf dem Server implementiert haben,

Dominik

dann läuft das so auch.

Jochen

Ja, wir könnten eben jetzt so ein Modell hinter

Jochen

so einer API

Jochen

irgendwie deployen und

Jochen

dann schicken wir da einen Artikel dahin

Jochen

und bekommen dann halt zurück, in welchen

Jochen

Dingern das liegt und dann muss man sich

Jochen

natürlich noch überlegen, okay, gibt man halt

Jochen

zurück, mit welcher Wahrscheinlichkeit

Jochen

das in welcher oder einfach nur

Jochen

eine Liste der Kategorien, in denen

Jochen

es liegt

Jochen

und wann sagt man

Jochen

eigentlich, es liegt drin oder nicht.

Jochen

Genau, und das ist,

Jochen

da müssen wir natürlich noch eine Menge

Jochen

Entscheidungen treffen. Das hängt halt auch

Jochen

davon ab, wie das Problem aussieht. Ist es wichtig,

Jochen

möglichst alle Kategorien,

Jochen

in denen ein Artikel liegen könnte,

Jochen

mitzuliefern oder

Jochen

ist es besonders wichtig, möglichst keine Fehler

Jochen

zu machen und das hängt dann halt davon ab,

Jochen

welche Art von Problem man gerade

Jochen

hat und dann, ja,

Jochen

genau, dann würde

Jochen

man das halt entsprechend machen, aber

Dominik

Wie groß ist das Modell auf dem Server?

Dominik

Die hier sind

Jochen

relativ klein, wenige Megabyte, denke ich,

Jochen

sind die groß, also das ist also

Jochen

Hängt vor allem auch viel von der

Nico

Art des Modells ab, was du jetzt benutzt,

Nico

also so ein Entscheidungsbaum zum Beispiel ist relativ klein,

Nico

wenn du jetzt halt komplexere Algorithmen

Nico

nimmst, wie zum Beispiel dein Random Forest,

Nico

was quasi einfach ganz, ganz viele

Nico

Entscheidungsbäume sind oder ein

Nico

Boosting-Tree, was quasi verschachtelte

Nico

Entscheidungsbäume sind, dann hast du natürlich ein

Nico

Vielfaches dessen. Genau. Dann kommst du

Nico

auf mehrere Megabyte

Nico

einzelne Entscheidungsbäume, ist wahrscheinlich sogar im Kilobyte-Bereich.

Nico

Je nachdem,

Nico

wie tief du den halt eben machst.

Jochen

Und hängt halt auch davon ab, wie deine

Jochen

Trainingsdaten, also bei den linearen Modellen,

Jochen

die sind halt einfach genauso groß wie deine

Jochen

Feature-Matrix, also sozusagen haben genauso viele Dimensionen

Jochen

wie deine Feature-Matrix. Und dann kannst du

Jochen

es ja einfach ausrechnen, irgendwie, wenn du

Jochen

pro Gewicht irgendwie

Jochen

4 Byte

Jochen

brauchst für ein Float,

Jochen

Single Precision Float,

Jochen

dann ist das halt

Jochen

4 mal, bei dem

Jochen

ist es 25.000 wahrscheinlich mal,

Jochen

also 4 mal 25.000,

Jochen

also 100

Jochen

Kilobyte, das ist ja nichts.

Jochen

Aber

Jochen

wenn du jetzt zum Beispiel viele Trainingsdaten hast und

Jochen

du hast halt ein,

Jochen

also das ist ja auch noch so eine Geschichte, es gab

Jochen

in dem

Jochen

Explorations-Notebook auch so ein

Jochen

quasi manuellen

Jochen

Entscheidungsbaum dafür,

Jochen

welches

Jochen

Modell man denn jetzt für welches

Jochen

Klassifikationsproblem nehmen könnte.

Jochen

Und da gibt es halt auch so irgendwie zum Beispiel

Jochen

so rekurrente

Jochen

neuronale Netze,

Jochen

die man nehmen kann. Und die können halt unter Umständen

Jochen

sehr, sehr viel mehr Parameter haben.

Jochen

Das Ding macht natürlich

Jochen

nur Sinn, wenn man viel, viel mehr Trainingsdaten hat.

Jochen

Aber wenn man jetzt irgendwie ein Modell hat,

Jochen

50 Millionen Parametern, dann muss man die halt irgendwie

Jochen

speichern. Das ist halt dann das Modell und dann

Jochen

wird das halt auch sehr, sehr groß unter Umständen.

Jochen

Ja, aber selbst

Jochen

das ist ja für Server heute alles nicht mehr so.

Jochen

Es wird dann interessant noch, wenn man

Jochen

das nicht irgendwie auf einen Server deployen möchte,

Jochen

sondern, was heute oft

Jochen

gemacht wird, auch auf ein

Jochen

Telefon. Und da

Jochen

muss man halt vielleicht nochmal ein bisschen gucken, was die Größe angeht, aber

Jochen

ja.

Nico

Das Schöne ist ja vor allem, eben eine Prognose

Nico

jetzt mit so einem Modell zu berechnen, ist

Nico

überhaupt nicht mehr kompliziert. Also

Nico

aufwendig ist es natürlich, Modelle zu trainieren,

Nico

wobei das mit den Modellen, die wir jetzt hier haben,

Nico

alles relativ schnell geht und man das einfach

Nico

auf dem lokalen Rechner mal durchspielen

Nico

kann.

Nico

Bei einem neuronalen

Nico

Netzwerk wäre das bei dem Training was anderes,

Nico

aber die Prognose ist hier nachher dann trotzdem super

Nico

einfach, weil dann gehe ich halt

Nico

einfach nur einmal quasi den Entscheidungsbaum lang oder

Nico

laufe einmal mein neuronales Netzwerk von vorne

Nico

nach hinten durch und fertig.

Nico

Und das kann dann halt auch...

Dominik

Wenn man den Weg kennenlernt, dann kann ich natürlich relativ schnell sagen, wo ich hin soll.

Nico

Genau, es kann auf schwache Hardware laufen.

Nico

Ja, cool.

Dominik

Dann habe ich tatsächlich heute wieder ganz viel über Machine Learning gelernt.

Dominik

Ich hoffe, ihr habt auch noch irgendwas mitgenommen.

Dominik

Ja, wenn du noch ein bisschen mehr lernen willst.

Nico

Also ich finde immer, so eigene Projekte sind super.

Nico

Und ansonsten einfach bei Kaggle mal einen Account machen.

Nico

Ja, Kaggle, ja.

Nico

Selbst wenn man da am Anfang nicht mitmacht.

Nico

Also selber mitmachen ist sehr viel Aufwand.

Nico

Aber es reicht eigentlich auch einfach nur mal ein paar Challenges zu beobachten

Nico

und mal ein paar Kernels sich aufmessen.

Dominik

Oder mal so nachbauen oder so welche, die es schon gab.

Dominik

Mal gucken, wie gut man an die tollen Lösungen irgendwann rankommt.

Nico

Genau, also beziehungsweise das Schöne ist ja bei Kaggle,

Nico

dass diese ganzen Lösungen eigentlich immer einfach alle online sind.

Nico

Also diese Kernels, die da sind,

Nico

die sind ja wirklich immer sehr, sehr gut.

Nico

Gerade auch bei der Exploration, wo man,

Nico

also so ein Kernel ist ja vom Prinzip her so ein Notebook.

Dominik

Ja, vielleicht noch ganz kurz, in Kaggle gibt es Bounties dafür,

Dominik

wenn man total tolle Prognosen herstellt.

Dominik

Also nur das vielleicht mal so für die Leute,

Dominik

die das noch nicht gesehen hatten.

Nico

Genau, genau. Es ist also ein Wettbewerb

Nico

für Data Science Projekte und

Nico

Leute sind da so nett und stellen halt quasi

Nico

ihre Kernels online, ihre Notebooks online

Nico

und man kann da einfach mal gucken, wie die das

Nico

lösen. Da kriegt man sowohl mit, welche

Nico

Tools sind gerade irgendwie angesagt,

Nico

wie geht man damit um, man lernt so die

Nico

Syntax und

Nico

genau, also ich lerne da auch jedes Mal,

Nico

wenn ich so eins der top gerateten

Nico

Notebooks da durchlese, lerne ich

Nico

jedes Mal wieder was.

Nico

Ja, finde ich auch super hilfreich.

Dominik

Ja, schön, dass ihr wieder alle eingeschaltet habt.

Dominik

Ihr findet immer die

Dominik

Informationen in den Shownotes.

Dominik

Genau, die werden nicht mehr, glaube ich, ziemlich lang.

Dominik

Ja, das kennen wir schon.

Dominik

Und ja, dann

Dominik

hört wieder rein, bleibt gewogen.

Dominik

Wann auch immer ihr uns hört.

Dominik

Wenn ihr irgendwelche Feedback habt, schickt eine E-Mail

Dominik

an uns, hallo at peißenpodcast.de

Dominik

oder Nico.

Dominik

Und ja, bis dahin.

Dominik

Genau, hört

Nico

wieder rein und bis bald.

Nico

Tschüss.