Seite 1 von 4 1234 LetzteLetzte
Ergebnis 1 bis 15 von 52

Thema: [RL] ML angewandt - Werde eins mit der KI!

  1. #1
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262

    [RL] ML angewandt - Werde eins mit der KI!

    Werde eins mit der KI


    Bild

    (Abb.1 - Goethe und sein Sportwagen, im Hintergrund sollte man eine Zivilisation von den Pyramiden bis zu Fabriken entstehen sehen.)


    Inspiriert von einer Zivilisation Geschichte wo primär nach den Empfehlungen der KI agiert wurde würde ich gerne mal ein Reallife Experiment machen.
    Mit der Entwicklung der Highway/Residual-Layers 2015 begann das Zeitalter der tiefen Neuronalen Netzwerke des Deeeeeeep-learning.
    Zwar hatten sicher die meisten schon Beispiele von generativen Netzwerken gesehen, sei es für Bilder (Midjourney, Dall-e-2, Stable Diffusion wovon auch das Titelbild zeigt).
    Aber solche Programme zu nutzen ist für eine Geschichte relativ unspektakulär und wäre auch eher etwas für künstlerisch begabtere.
    Spannender ist es selber Neuronale Netzwerke zu programmieren. Da ich mich aber mit der Materie ein wenig auskenne ist es sicher noch spannender wenn ich mir den Code schreiben ließe und nur in Notfällen eingreifen würde.
    Die meisten benutzen Chatgpt nur um Texte zu erstellen. Aber angeblich kann es auch programmieren insbesondere in python, die Frage ist nun wie gut es darin schon ist.

    Ich habe mir eine einfache Übung ausgedacht. Ich werde also Chat-gpt darum bitten mir schrittweise ein Machine-Learning Problem lösen zu lassen. Natürlich muss ich wie in meiner Inspirationsvorlage den Code verwenden den die KI mir liefert.



    Bild

    (Abb.2 ein weiterer Grund warum ich meine künstlerische Karriere schnell wieder an den Nagel hängen möchte. Irgend ein Fehler ist aufgetreten. Kennt sich jemand damit aus? Hoffentlich hat es nichts mit irgendwelchen Regel zu tun die ich verletzt hatte, wie beispielsweise dass keine nackten Personen/Statuen generiert werden ect... nicht dass ich direkt einen Strike kassiert hätte )

    P.S.
    Was ist ein?
    "venus-snugness-purple"
    Angehängte Grafiken Angehängte Grafiken

  2. #2
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Die Aufgabe


    Bild


    Ein Startproblem für alle Anfänger die mit später mit Wettbewerb gewinnenden Profis mithalten wollen ist kaggle. Der Klassiker ist dort das Titanic-problem. Schaun wir mal wie weit wir da kommen.
    https://www.kaggle.com/c/titanic

    Die Aufgabe ist also ein Model zu entwickeln welches am besten vorhersagt welche Passagiere überleben.
    Angehängte Grafiken Angehängte Grafiken

  3. #3
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Und jetzt lernen wir endlich die Hauptperson dieser Geschichte kennen. Ich nutze einfach meinen Open-Ai account und schon gehts los.


    Bild


    Das hört sich vielversprechend an. Außerdem hat unser Freund es auch sehr schön erklärt. Soll ich eigentlich mit Bildern arbeiten oder die Antworten herauskopieren für die Geschichte?
    Angehängte Grafiken Angehängte Grafiken

  4. #4
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Wir gehen direkt an eingemachte.


    Bild


    Das ist ein guter Schlachtplan. Nun müssen wir die Schritte einzeln abarbeiten.


    Wir holen uns die Datensets, das Downloaden erlaube ich mir mal ohne KI Anleitung:
    training set (train.csv)
    test set (test.csv)

    Traingset ist offenbar das Set auf dem wir lernen sollen und testset enthält später die Daten die wir um den vermuteten Überlebensstatus ergänzen sollen.
    Angehängte Grafiken Angehängte Grafiken

  5. #5
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Und chat-gpt legt direkt richtig los, wir kriegen auch schon unseren ersten Code geliefert. Ich führe paralell ein Jupyther-Notebook wo ich den Code direkt reinkopieren und ausführen kann.


    1. Als erstes empfiehlt er uns einen Pandas-Dataframe nach dem einlesen zu erstellen. (Mit Code, der steht im dunklem Feld und kann praktischerweise stets direkt rauskopiert werden)
    2. Danach erklärt er uns unser KI Freund wie wir die Daten aufbereiten müssen. Relativ wenig sinnvolle Spalten wie Namen, PassangerID, Kabine oder Ticketnummer sollen wir ignorieren. Wir vertrauen ihm mal dabei.
    3. Das Behandeln von Fehlenden Daten, bei einigen Passagieren war beispielsweise das Alter nicht bekannt. Es ist in der Tat dann ML-Standard diese Daten entweder durch Durchschnitt oder Median aufzufüllen oder die Spalten zu ignoieren.
    4. Normalisieren der Daten, das wäre zwar bei komplexen Modell kein Problem aber auch dort erleichtert es das Konvergieren des Modells wenn alle Werte in einem ähnlichem Bereich sind.
    5. Das Entfernen von Außreißern. Aber um das besser beurteilen zu können schauen wir uns die Daten am besten mal genauer an. So weit hat Chat-gpt gut Arbeit geleistet.


    Bild


    So sieht der Code zurzeit aus.


    Bild
    Angehängte Grafiken Angehängte Grafiken

  6. #6
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Die Trainingsdaten

    Es gibt nach der Lösch- Auswahlaktion noch die Spalten:
    ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']

    Insgesamt gibt es im Trainingsset 891 Einträge.

    "Survived" - selbsterklärend es ist das Wichtigste was mit all den anderen Parametern zusammen hängen soll. Kennt nur die Werte True or False.
    "Pclass" - ich schaue den Inhalt (vor der Normalisierung natürlich) an und sehe nur Zahlen von 1-3, offenbar ist es die "Klasse" die ein Passagier gebucht hat. 1. Klasse ist wohl die teuerste die 3. die billilgste. Wer den Titanic-Film gesehen hat kann das gegebenfalls bestätigen.
    "Sex" - ist hier noch ganz klassisch binär. Hier steht nur männlich oder weiblich.
    "Age" - enthält Zahlen von 0.42 bis 80. Sicherlich ist es das Alter in Jahren. Sicherlich ist es wichtig da Kinder eine höhere Überlebenschance haben sollten. Umgekehrt ist eine 70 jährige Frau vielleicht einfach bei ihrem Mann geblieben selbst wenn sie die Möglichkeit zur Rettung gehabt haben könnte.
    "SibSp" - ist wohl die Anzahl der Geschwister die die Person an Bord hatte?
    "Parch" - das sagt hingegen wohl aus, ob jemand Eltern oder Kinder dabei hatte.
    "Fare" - sie enthält Zahlen von 0 bis 512 es könnte daher die Ticketkosten in englischen Pfund sein, eine kleine Recherche bestätigt dies. Wobei eigentlich hätte ich auch unsere Freund fragen können. Machen wir bei der nächsten Spalte die ist noch seltsamer.
    "Embarked" - ist die letzte Spalte, sie ist etwas tricky da hier nur 3 Arten von Buchstaben zu stehen scheinen. Offenbar sagt es nicht aus ob eine Person auch wirklich eingestiegen ist. Das wäre auch zu einfach.
    Doch unser Freund weiß natürlich Rat:


    Bild


    Damit haben wir grob verstanden was in den Spalten steht. Ich frage mich gerade warum unser Freund den Einstiegshafen für relevant hielt.




    Aber zuerst schauen wir uns aus Interesse einige Spalten genauer an:
    Die Klasse:
    Insgesamt gab es in der ersten Klasse 216, in der zweiten 184 und der dritten 491 Passagiere.
    In der 1. Klasse haben 136 überlebt und nur 80 sind gestorben!
    In der 2. Klasse sieht es ausgeglichener aus 87 vs 97.
    In der 3. Klasse sieht es übel aus 119 vs 372. Vielleicht ist es noch schlimmer da in den unteren Klassen natürlich auch andere rettende Parameter wie niedriges Alter und häufiger und somit rettend gewesen sein könnten. Aber für einen ersten Überblick sollte das reichen. Die Spalte ist auf jeden Fall releveant.
    #:Klassenkampf:

    Das Geschlecht
    :
    Es gab unter den 891 Passagieren 577 Männer und 314 Frauen. Also sind gut ein Drittel Frauen. Schaut man sich aber die Überlebenden an dann haben 109 Männer überlebt aber 233 Frauen. Das heißt die Überlebensrate ist knapp 19% vs 74%. Auch das scheint in der Tat eine relevante Spalte zu sein.
    #:Benevolenter Sexismus:
    Angehängte Grafiken Angehängte Grafiken

  7. #7
    Registrierter Benutzer
    Registriert seit
    21.03.12
    Beiträge
    22.445
    SibSp dürfte Geschwister und Partner sein (Spouses).

    Spannendes Projekt, ich hatte auch schon vor, ChatGPT den Boilerplatecode schreiben zu lassen.

  8. #8
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Danke, dann ist es leider die Summe aus Partner und Geschwistern.
    Schade dass es nicht getrennt aufgeführt sonst hätte ich die Hypothese testen können ob vielleicht bei älteren Frauen die Anwesenheit vom Partner sich negativ auswirken könnte da man bei ihm bleiben möchte. (Je nach Qualität der Ehe . Andererseits fahren ich mal erstmal mit dem Projekt fort und Detailhypothesen könnte man auch später prüfen.
    Wenn wir fertig sind könnte man auch virtuelle Testpersonen erstellen und deren Überlebenschance ermitteln lassen wo man allles konstant lässt und nur einen Parameter ändert.


    Den Code zum normieren, auffüllen, aussortieren der Daten habe ich bereits erhalten. Chat-GPT hat es zwar nur an einigen Spalten beispielhaft ausgeführt aber ich erspare euch mal dass ich den Inhalt nach jeder Spalte getrennt erfrage.
    Das Bereinigen der Daten: Wie man sieht ist bei mindestens einer Person das Alter nicht angegeben. Wie von ihm vorgeschlagen werden wir es mit dem Mittelwert auffüllen.
    Des weiteren war der Embarked Status nicht bei allen bekannt, hier füllen wir mit dem Häufigsten Wert "Southamton" auf. Danach wandeln wir es noch in die Zahlen 0, 1, 2 um.
    Zuletzt wandeln wir noch Male und Female in die Zahlen 0 und 1 um.


    Bild
    Bild


    Nachher:

    Bild
    Bild
    Angehängte Grafiken Angehängte Grafiken

  9. #9
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Die Modelldefinition des neuronalen Netzes


    Während ich die anderen Spalten noch weiter bereinige Frage ich ihn ob er uns schon mal eine Modeldefinition geben kann. Das ist alles soweit ich das sehen kann 100% korrekt.


    Bild


    Da ich mich in Pytorch besser auskenne als in Tensorflow erlaube ich mir ihn nach einer Ausgabe in Pytorch zu Fragen. Das klappt auch gut.


    Bild


    Auch hier ist alles korrekt. Er hat das Netz sogar TitanicNet getauft.
    Natürlich ist es wohl ein kleiner overkill logitische Regression hätte gereicht aber ich wollte ja explizit ein kleines neuronale Netz und somit trifft unseren Freund keine Schuld. Zusätzliche Ebenen werden nur etwas mehr rechenleistung kosten und die Gefahr zum Überfitten erhöhen, aber die Rechenleistung ist hier noch nicht sonderlich relevant und gegen das Überfitten sofern es ein Problem werden sollte gibt es auch Techniken, Anfänger würden einfach mit den Iterationen aufhören wenn sich das Validationsset zu verschlechtern beginnt, Fortgeschrittene würden Regularisierung einsetzen.

    Da ich beruflich in dem Bereich arbeite, wenn auch im Bereich der Bilder (Computervision) und somit mit deutlich komplexeren Netzwerken, ist diese Aufgabe zwar technisch gesehen Neuland für mich aber alles gut verständlich. Die Frage ist ob ich irgendwas erklären sollte oder soll es eher das Experiment sein dass selbst der Laie (fast) alles hinbekommen könnte?


    Einen kleinen Fehler oder besser Inkonsistenz hat unser Freund übrigens schon gemacht. Man braucht keine Programmierkenntnisse um ihn zu sehen. Wobei durch die Formulierung "mit Beispiel" oder "Vorschlag" am Anfang es kein richtiger Fehler wäre aber wir wollen ja streng sein.
    Angehängte Grafiken Angehängte Grafiken

  10. #10
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Das Model habe ich in den Code kopiert und natürlich läuft es ohne Probleme. Nun wissen wir wie unsere Daten auszusehen haben aber zuerst müssen wir sie noch ein wenig weiter bearbeiten.
    Als nächstes Entfernen wir noch nach seinen Rat alle Datensätze die "kapput" zu sein scheinen. Die Empfehlung unseres Freundes war alle raus zunehmen deren Zahlungsdaten seltsam sind mit dieser Zeile:

    train_df = train_df[train_df['Fare'] > 3]
    (Zum Anschauen im Screenshot unten hatte ich die Bedingung natürlich umgedreht, jaja ich sehe eigentlich wäre das Gegenteil von > 3 dann <=3, aber wir wollen ja nicht päpstlicher als der Papst sein)


    Ich kommentiere ihn aber erst einmal aus, denn bevor der Befehl aktiv wird schauen wir uns aus Interesse noch einmal kurz an was denn damit aussortiert würde. Für die Funktion des Programms ist es nicht notwendig aber etwas Neugier kann nicht schaden und so sehen wir auch ob die Empfehlung gut war.


    Bild


    Auch das Alter ist bei vielen nicht sicher, bei einigen anderen Spalten bin ich nicht sicher ob nicht einfach nur 0 als Standardwert angegeben war. Die Entscheidung sie raus zunehmen sieht sehr vernünftig aus.
    Angehängte Grafiken Angehängte Grafiken

  11. #11
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Zum Normalisieren der Daten bot er uns diesen Code als Beispiel an:
    # Normalisieren der Daten
    train_df['Age'] = (train_df['Age'] - train_df['Age'].mean()) / train_df['Age'].std()
    train_df['Fare'] = (train_df['Fare'] - train_df['Fare'].mean()) / train_df['Fare'].std()

    Natürlich könnten wir über die Spalten iterieren (oder Copypaste und "Age" durch die anderen Spaltenamen entsprechend ändern. Aber ich teste mal ob wir auch eine andere Methode angeboten bekommen.


    Bild


    Hier erhalten wir noch einen entscheidenden Tip von ihm. Die Testdaten könnten wir so einfach auf die gleiche Weise Normalisieren. Würden wir es manuell machen müssten wir die Mittelwerte und Standardabweichungen zwischenspeichern. Aber so weit dass wir auf den Testdaten unsere Prognosen abgeben können sind wir natürlich noch lange nicht. Vorher muss erstmal das neuronale Netzwerk trainiert werden. Aber wir behalten es im Hinterkopf und fügen schon einmal dieses Code hinzu.
    Angehängte Grafiken Angehängte Grafiken

  12. #12
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Ich füge ganz naiv den Code hinzu und er sieht nun wie folgt aus:

    import pandas as pd

    # Einlesen und in einen Pandas Dataframe umwandeln
    train_df = pd.read_csv('train.csv')
    test_df = pd.read_csv('test.csv')

    # Entfernen von Spalten, die nicht relevant sind
    train_df = train_df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)

    # Entfernen von Ausreißern (in der Bezahlung)
    train_df = train_df[train_df['Fare'] > 3]

    # Fehlende Werte ersetzen
    train_df['Age'].fillna(train_df['Age'].mean(), inplace=True)
    #train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace=True)
    train_df['Sex'] = [0 if i == 'male' else 1 for i in train_df['Sex'] ] # Geschlechter werden in Zahlen umgewandelt
    train_df['Embarked'] = [1 if i == 'C' else 2 if i=='Q' else 0 for i in train_df['Embarked'] ] # Cherbourgh, Queenstown, Southhampton

    # Normalisieren der Daten
    from sklearn.preprocessing import StandardScaler
    # Erstellen eines StandardScaler-Objekts
    scaler = StandardScaler()
    # Anwenden des Skalierers auf die Trainingsdaten
    X_train_scaled = scaler.fit_transform(train_df)
    # Anwenden des Skalierers auf die Testdaten
    X_test_scaled = scaler.transform(test_df)


    Doch wir erhalten eine Warnung beim Ausführen!

    FutureWarning: The feature names should match those that were passed during fit. Starting version 1.2, an error will be raised.
    Feature names unseen at fit time:
    - Cabin
    - Name
    - PassengerId
    - Ticket
    Feature names seen at fit time, yet now missing:
    - Survived

    Was los ist ist natürlich klar, die Testdaten und die Trainingsdaten unterscheiden sich in den Spalten. Survived gibt es als Spalte in den Testdaten nicht während wir in den Trainingsdaten bereits 4 Spalten entfernt hatten. Da wir die Testdaten aber vorerst noch nicht brauchen kommentieren wir sie erstmal aus. Technisch gesehen könnte man die Warnung wahrscheinlich sogar ignorieren und die Funktion sollte dennoch das richtige tun, aber ich finde so etwas unsauber.
    Außerdem können wir so testen ob unser Freund uns dieses Problem noch lösen/erklären wird wenn seinen Instruktionen folgen. Also -> Testdaten vorerst auskommentiert

  13. #13
    Registrierter Benutzer Avatar von klops
    Registriert seit
    20.05.16
    Ort
    Hannover
    Beiträge
    4.915
    ich versteh größtenteils Bahnhof, aber cool, dass du das Projekt hier vorstellst und auch einschätzen kannst, ob der bot das gut oder schlecht löst

  14. #14
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Super - hättet ihr auch Interesse an einem kleinen Spiel?
    Die Leser können sich virtuell in das Jahr 1912 zurückversetzen. Sie geben an was ihre Parameter sind und am Ende des Projekts errechnen wir für jeden seine entsprechende Überlebenswahrscheinlichkeit.

    Ich mache mal den Anfang Passagier1:
    Im Jahr 1912 war ich bestimmt noch jung. Ich steige dann mal in England (S) ein. Als kleiner Tomboy aus einer armen englischen Arbeiterfamilie die in die neue Welt möchte. Mit dabei sind die Eltern und und 2 Geschwister. Das ergibt als Vektor
    Pclass = 3
    Sex = Female -> bzw. 1 konvertiert, da 0 = Male und 1 Female
    Age = 6 Jahre
    SibSp = 2
    Parch = 2
    Fare = 7.5 Pfund
    Embarked = 'S' -> konvertiert 0, da 0 = Southampton, 1 = Cherbourg , 2= Queenstown

    Ergäbe als Inputvektor
    Talamar = [3, 1, 6, 2, 2, 7.5, 0] (Kann ich aber auch übernehmen das aus eurer Hintergrundgeschichte zu erstellen)


    Zur Erinnerung was sinnvolle Werte sind:
    Achtung Spoiler:
    Bild
    Bild

  15. #15
    Registrierter Benutzer Avatar von Talamar
    Registriert seit
    18.10.09
    Ort
    Köln
    Beiträge
    9.262
    Das einzige was mir aufgefallen ist dass der "embarked" Status inkonsistent ist. Ich denke das kann ich nun auflösen.

    Zitat Zitat von Talamar Beitrag anzeigen
    Einen kleinen Fehler oder besser Inkonsistenz hat unser Freund übrigens schon gemacht. Man braucht keine Programmierkenntnisse um ihn zu sehen. Wobei durch die Formulierung "mit Beispiel" oder "Vorschlag" am Anfang es kein richtiger Fehler wäre aber wir wollen ja streng sein.
    Bei der Definition des neuronalen Netzes ging er von 6 Inputfeatures aus ich zitiere mal seine Antworten:
    "Dieses neuronale Netzwerk hat ebenfalls drei Schichten:
    Eine Eingabeschicht (nn.Linear(6, 32)), die eine bestimmte Anzahl von Neuronen hat, die der Anzahl der Eingabevariablen entspricht. Im Titanic-Datensatz haben wir sechs Eingabevariablen: "Pclass", "Sex", "Age", "SibSp", "Parch" und "Fare".


    Beim Filtern der nicht zu verwendeten Spalten wird embarked aber nicht aussortiert:
    train_df = train_df.drop(['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
    So dass wir 7 überlebnde Spalten haben:
    ['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
    (Survived ist kein Inputfeature sondern bekommt noch einen Sonderstatus daher) 8-1 = 7 statt 6


    Vermutlich ist die Spalte wer wo Eingestiegen ist zwar nicht schädlich aber auch relativ aussagelos für die Prognose. Daher wäre ich als Mensch auch unsicher ob es eine Rollen spielen würde oder nicht. Wer Engländer ist hätte vielleicht Vor- oder Nachteile gebenüber Franzosen ect...

Seite 1 von 4 1234 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •