Machine Learning mit Python, Teil 5

CSV-Datei für neuronale Netze aufbauen

| Autor / Redakteur: Thomas Drilling / Stephan Augsten

Excel-Dateien lassen sich in Python einlesen und verarbeiten.
Bildergalerie: 1 Bild
Excel-Dateien lassen sich in Python einlesen und verarbeiten. (Bild: Drilling / Microsoft)

Nachdem wir nun wissen, was ein Neuron ist, wie man es in Python modelliert und wie ein Neuron maximal einfache lineare Zusammenhänge erkennt, werfen wie in diesem Teil anhand eines konkreten Beispiels noch einmal konkret auf den Lernprozess.

Zu diesem Zweck haben wie uns von der Webseite Center for Machine Learning and Intelligent Systems im „Machine Learning Repository“ nach frei zugänglichen Beispiel Datasets umgesehen. Wir beschränken uns dabei aufgrund der bisher vermittelten Kenntnisse auf Datasets mit dem Default-Task „Regression“.

Das Data Set „Auto MPG“ aus dem Jahr 1993 beispielsweise enthält Pkw amerikanischer Hersteller aus dem Jahr 1970 mit neun Attributen wie den Verbrauch in „mpg“ (Miles per Gallon), Anzahl der „cylinders“, „displacement“ (Hubraum), „horsepower“ (PS), „weight“, „acceleration“ (Beschleunigung von 0 auf 60 mph), „model year“ (Modelljahr) oder „Name“ des Fahrzeugs.

Wir wählen dieses Beispiel-Data-Set, weil es durchaus einen konkreten Praxisbezug gibt: Enthielte das Data Set ausschließlich top-aktuelle Modelle, könnte man mit Hilfe von Machine Learning (ML) z. B. anlässlich einer anstehenden Kaufentscheidung versuchen, das Data Set so zu trainieren, dass es uns eine der Eigenschaften auch für ein Fahrzeug liefert, das in der Liste nicht vorhanden ist.

Ein Beispiel-Szenario

Nehmen wir trotzdem an, dass wir uns für ein Fahrzeug interessieren, das der Hersteller gerade erst auf einer Automobilmesse angekündigt hat. Das Fahrzeug soll mit einem 340 PS Achtzylinder auf den Markt kommen und wiegt 2000 kg. Allerdings hat der Hersteller die erzielbare Beschleunigung von 0 auf 100 noch nicht angegeben.

Wir möchten aber sicherstellen, dass das Fahrzeug eine Beschleunigung von 0 auf 100 km/h in unter 6 Sekunden schafft. Wir können daher mit dem gegebenen Data Set ein Neuron, bzw. ein neuronales Netz trainieren, dass die Beschleunigung für das neue Fahrzeug auf Basis der in der Liste enthalten Vergleichsdaten vorhersagen, bzw. „schätzen“ kann.

Wir laden dazu von der Edu-Website die Dateien „auto-mpg.data“, und „auto-mpg.names“ herunter. Erste enthält sämtliche Daten, letztere eine Beschreibung, die unter anderen die Namen der neun Attribute enthält. Das Format ist eine durch Leerzeichen separierte Liste, d. h. alle Werte stehen in einer Spalte. Für das weitere Vorgehen überführen wir beide Dateien in ein gut weiterzuverarbeitendes Excel-Format.

Für das Umwandeln in Excel müssen wir das Data Set „auto-mpg.data“ zusammen mit den Attributen aus „auto-mpg.names“ zunächst in eine kommagetrennte Liste umwandeln. Dazu gibt es mehrere Wege, u a. mit Hilfe diverser Unix-Text-Tools. Am einfachsten ist es jedoch folgendes Vorgehen:

Die Excel-Tabelle als Datengrundlage.
Die Excel-Tabelle als Datengrundlage. (Bild: Drilling / Microsoft)

  • 1. Man öffnet auto-mpg.data mit einem beliebigen Editor um markiert den kompletten Inhalt.
  • 2. Diesen fügt man dann in ein Word-Dokument ein und markiert erneut die gesamt Einfügung.
  • 3. Dann wählt man bei markierten Text im Menü „Einfügen / Tabelle / Umwandeln –> Text in Tabelle umwandeln“, um den Text in eine echte Tabelle umwandeln
  • 4. Schließlich verwenden man die Finden/Ersetzen-Funktion (Strg+h) um das Sonderzeichen „^w“ (Leerzeichen) durch „,“ zu ersetzen. Allerdings nicht die Leerzeichen in den Auto-Namen. Hier ist also etwas Ausprobieren angesagt. Außerdem sind alle Angaben „.0“ durch Leerzeichen zu ersetzen und die Anführungszeichen zu entfernen.
  • 5. Anschließend fügt man diesen Teil wieder per Copy/Paste in Excel ein, ergänzt händisch die erste Zeile mit den Spaltenköpfen aus „auto-mpg.names“ und speichert das Ganze unter der Bezeichnung „auto-mpg.xls“ ab. Das Ergebnis sollte so aussehen wie in der Abbildung links.

Test der Berechnung mit 12 Sekunden für 0 auf 60 Meilen.
Test der Berechnung mit 12 Sekunden für 0 auf 60 Meilen. (Bild: Drilling / Jupyter)

Die in der Liste enthaltenen Beschleunigungsangaben sind allerdings in „Null auf 60 Meilen“ angegeben, denn es handelt sich ja um US-Fabrikate. Wir müssen also das vorhergesagte Ergebnis noch in die Zeit von „Null auf 100 km/h“ umrechnen, was aber in Python schnell erledigt ist.

def zero_to_60_miles_in_null_auf_hundert_kmh(acceleration):
   beschleunigung = acceleration*1.035794183445;
   return beschleunigung

Da dies nicht nur ein ML-Workshop, sondern natürlich auch ein Python-Workshop ist, bietet uns das Beispiel zunächst einmal die treffliche Gelegenheit zu demonstrieren, wie man z. B. CSV-Dateien in Python einlesen und verarbeiten kann.

Unter Python gibt es dazu ein Paket namens „pandas“, das wie üblich mit der import-Anweisung importiert wird. Unter Python-Entwicklung ist es allerdings stillschweigende Konvention „pandas“ unter dem Kurznamen „pd“ zu importieren. Jetzt sind wir in der Lage, das Excel-Sheet in eine Variable zu laden. Zwar ist auch der Variablenname frei wählbar, Python-Entwickler verwenden hier aber üblicherweise „df“ (für Data Frame).

Das Ergebnis des Excel-Imports.
Das Ergebnis des Excel-Imports. (Bild: Drilling / Jupyter)

import pandas as pd
df = pd.read_csv ("auto-mpg.csv")

Ob das funktioniert hat, können wir leicht testen, indem wir die eingelesene Tabelle gleich wieder ausgeben:

Df

In nächstem Schritt ist zu überlegen, welche der Daten wir als Eingang (x) und welche als Ausgang (y) interpretiert werden sollen. Gemäß unserer eigenen Anforderungen – das Wunschauto hat ja 8 Zylinder, 340 PS und wiegt 2000kg, sind die Spalten „cylinders“, „horsepower“ und „weight“ für unsere Eingabe von Interesse. Das „Holen“ einzelner Spalten erfolgt in pandas erfolgt durch Angabe doppelter eckiger Klammern.

x = df [["cylinders", "horsepower", "weight"]]

Ausgabe der x-Werte im Jupyter-Notebook.
Ausgabe der x-Werte im Jupyter-Notebook. (Bild: Drilling / Jupyter)

Die äußere Eckige Klammer sagt quasi aus, dass das Data Frame gefiltert werden soll und die innere Klammer kennzeichnet das Listenelement. Geben wie zur Kontrolle das x gleich wieder aus.

Unser gewünschter Ausgangswert ist ja die Beschleunigung (acceleration). Da es sich nur um einen Wert und keine Liste handelt, genügt eine eckige Klammerebene.

y = df ["acceleration"]

Jetzt müssen wir nur noch unsere oben erarbeite Umrechnungsfunktion einbauen, um die Beschleunigung in „Null auf Hundert in Sekunden“ zu bekommen.

y = zero_to_60_milesh_in_null_auf_hundert_kmh (df ["acceleration"])

Die Ausgabewerte im Juypter Notebook.
Die Ausgabewerte im Juypter Notebook. (Bild: Drilling / Jupyter)

Zur Kontrolle geben wie alle Y-Werte aus. Die Vorbereitungen sind damit soweit getroffen, dass wir nun unsere lineare Regression auf einen Datensatz mit 340 PS, 8 Zylindern und 2000kg anwenden können, um einer Vorhersage der erzielbaren Beschleunigung für dieses ja noch nicht im Ursprungs-Data-Set enthaltene Fahrzeug treffen zu können.

Dazu laden wie zunächst wieder das Modul für die lineare Regression von sklearn.

from sklearn.linear_model import LinearRegression

Nun erstellen wir wieder unserer Modell für die lineare Regression mit

model = LinearRegression()

und weisen das Modell an, die Zusammenhängen zwischen x und y zu lernen. Das geht wie im letzten Teil beschreiben mit

model.fit(x, y)

Nachdem das Modell erfolgreich trainiert wurde, können wie wieder den Intercet und falls gewünscht auch die erlernten Koeffizienten ausgeben.

print(model.coef_)
print(model.intercept_)

Multiplizieren wir also wieder jedes erlernte Gewicht mit den drei Eingängen X1 bis X3 (also „cylinders“, „horsepower“ und „weight“, addieren die drei Werte gemäß der Formel multiplizieren das Gesamtergebnis mit dem Intercept, erhalten wir die gewünschte Beschleunigung. Wir sparen uns natürlich die Mühe des Ausrechnung und machen wie folgt eine Vorhersage.

print(model.predict([
   [8,340,2000]
]))

Leider erzielt unser Wunschfahrzeug die ersehnte Beschleunigung von Null auf Hundert nicht. Trotzdem hier noch einmal zur Verinnerlichung das Prinzip der linearen Regression: wir haben einen Satz Trainingsdaten, aus denen wir Zusammenhänge lernen, die wir dann auf neue Daten anwenden, um eine Vorhersage zu treffen.

Kommentare werden geladen....

Kommentar zu diesem Artikel

Der Kommentar wird durch einen Redakteur geprüft und in Kürze freigeschaltet.

Anonym mitdiskutieren oder einloggen Anmelden

Avatar
Zur Wahrung unserer Interessen speichern wir zusätzlich zu den o.g. Informationen die IP-Adresse. Dies dient ausschließlich dem Zweck, dass Sie als Urheber des Kommentars identifiziert werden können. Rechtliche Grundlage ist die Wahrung berechtigter Interessen gem. Art 6 Abs 1 lit. f) DSGVO.
  1. Avatar
    Avatar
    Bearbeitet von am
    Bearbeitet von am
    1. Avatar
      Avatar
      Bearbeitet von am
      Bearbeitet von am

Kommentare werden geladen....

Kommentar melden

Melden Sie diesen Kommentar, wenn dieser nicht den Richtlinien entspricht.

Kommentar Freigeben

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

Freigabe entfernen

Der untenstehende Text wird an den Kommentator gesendet, falls dieser eine Email-hinterlegt hat.

copyright

Dieser Beitrag ist urheberrechtlich geschützt. Sie wollen ihn für Ihre Zwecke verwenden? Kontaktieren Sie uns über: support.vogel.de/ (ID: 46197636 / Programmiersprachen)