Machine Learning mit Python, Teil 3 Grundbegriffe und einfache Beispiele

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Machine Learning und KI helfen in fast allen Branchen, die Effizienz zu steigern. Sukzessive zeigen wir, wie man diesem faszinierenden Thema in Python begegnet. Ob Transport und Logistik, Industrie- und Automobilbranche, Tourismus oder Verlagsgeschäft: Beide Technologien lassen sich in völlig unterschiedlichen Anwendungsfeldern nutzen.

Anbieter zum Thema

Definition eines einfachen ML-Modells.
Definition eines einfachen ML-Modells.
(Bild: Drilling / Juypter)

Man kann sich dem Thema Deep Learning grundsätzlich von zwei Seiten nähern. Data Scientists sind vor allem an Datenmodellen und Vorhersagemöglichkeiten interessiert und wissen in der Regel, was die gängigen AI- und ML-Algorithmen leisten.

Doch meist besitzen sie weder das Fachwissen noch die Motivation, die für Deep Learning erforderliche IT-Infrastrukturen vom Compute Cluster bin hin zu Einrichtung und Betrieb der passenden Entwicklungsumgebungen aufzubauen und zu betreiben. Für diese Zielgruppe sind Cloud-Dienste wie AWS SageMaker gedacht und bestens geeignet.

Auf der anderen Seite können sich Programmierer, die neuronale Netze einfach als interessantes alternatives Programmiermodell begreifen, in unserer Serie „Machine Learning mit Python“ sukzessive mit den Möglichkeiten der gängigen Deep-Learning-Bibliotheken vertraut machen. Hierzu sind Programmiersprachen wie Python, R oder Erlang besonders geeignet. Python bringt z. B. sehr mächtige Bibliotheken zu diesem Zweck mit, darunter Numpy, Pandas, Matplotlib, SciKitLearn, NLTK oder das von Google initiierte TensorFlow.

Was ist ein künstliches neuronales Netz?

Schema eines künstlichen Neurons: Künstliches Neuron mit Index j.
Schema eines künstlichen Neurons: Künstliches Neuron mit Index j.

In der Informatik versteht man bekanntlich unter einem künstlichen (Einzel-)Neuron – im Unterschied zu neuronalen Netzen, die aus mehreren vernetzen Neuronen bestehen, die sich über mehrere Schichten erstrecken – ein Modell wie in der vorangestellten Abbildung.

Vereinfacht gesagt ist ein Neuron einen Summierverstärker mit individuell gewichteten Eingängen und nachgeschalteter Schwellwertberechnung. Die netto-Eingabe ist dann schlicht die Summe der gewichteten Eingangssignale. Die Gewichtung ist damit quasi die Stärke der jeweiligen Verbindung. Im einfachsten Fall wäre also der Netto-Input gleich dem Output y = x1*w1+x2*w2+x3*w3.

Ferner berücksichtigt man in der Praxis noch eine Aktivierungsfunktion mit einem Schwellwert. In der Biologie würde ein Neuron faktisch nur dann „feuern“, also seine Ausgabe an ein nachgeschalteten Neuron weitergegeben, wenn der Schwellenwert erreicht ist. Bei künstlichen neuronalen Netzen (KNN) verwendet man Aktivierungsfunktionen wie z. B. die Sigmoid-Funktion.

Ein neuronales Netz verbindet mehrere solcher Neuronen auf eine Ebene und führt dann mehrere solcher Ebenen (Schichten) zu einem komplexen Gebilde zusammen. In der so genannten Trainingsphase „lernt“ das Netz durch verschiedene Modifikationen: Es ändert Gewichtungen, passt die Schwellenwerte der einzelnen Neuronen an, ergänzt oder entfernt Neuronen oder Schichten und passt Aktivierungs-, Propagierungs- oder Ausgabefunktion an.

Füttert man das Netz mit bekannten Daten und berechnet anhand der Differenz zwischen tatsächlicher und erwarteter Ausgabe einen Fehler, lässt sich dieser durch das Netz zurück propagieren und als Stellschraube für die Anpassung der Gewichtungen verwenden. Solche künstlichen neuronalen Netze können dann auch komplexe nicht lineare Zusammenhänge mit Hilfe eines Lern-Algorithmus erlernen, der entweder mittels iterativem oder rekursivem Vorgehen versucht aus vorhandenen Ein- und erwarteten Ausgangswerten sämtliche Parameter des zugrunde liegenden Zusammenhangs zu ermitteln.

Neuronale Netze in Python

Schauen wir uns an, wie man in Deep Learning die geschilderten Zusammenhänge softwaretechnisch darstellt. Hierzu verwenden Datenwissenschaftler meist die Programmiersprache Python, die mit ihren starken mathematischen Wurzeln für solche Zwecke entwickelt wurde. Deshalb stehen auch zahlreiche Bibliotheken zur Verfügung, die den Umgang mit ML und KI extrem vereinfachen.

Wir beginnen damit, eine einfache lineare Regression zu implementieren. Die lineare Regression als solche muss man in Python nicht neu erfinden. Wir benötigen dazu lediglich die Bibliothek sklearn (scikit-learn). Als Entwicklungsumgebung verwenden wir wieder Jupyter-Notebook-Instanzen unter Anaconda.

Folgendes Beispiel dient der Umrechnung von Meter in Fuß, ein klassischer linearer Zusammenhang. Statt jetzt aber die Berechnungsformel zu hinterlegen, füttern wir ein dazu geeignetes Modell. Dazu speichern wir unsere Muster-Daten in den beiden Arrays Met und Feet.

Met = [
   [100],
   [1000],
   [4000]
]
Feet = [
   [328],
   [3280],
   [13121]
]

Die eigentliche lineare Regression versteckt sich in der sklearn-Bibliothek im Modul „linear_model“ und trägt den Namen „LinearRegression“. Wie in unserem Einführungsworkshop zu Python beschrieben, können wir die Lineare Regression direkt importieren:

from sklearn.linear_model import LinearRegression

Damit lässt sich nun das Modell definieren. Das geht mit:

model = LinearRegression (fit_intercept = False)

Definition unseres ML-Modells.
Definition unseres ML-Modells.
(Bild: Drilling / Juypter)

Haben wir unser Modell definiert, können wir es mit den oben gesetzten Modelldaten trainieren. Dazu verwenden wir die Methode „fit“, die wir jetzt auf unsere Variable „model“ mit den Trainingsdaten in den beiden Variablen „Met“ und „Feet“ anwenden, indem wir die Jupyter-Zelle ausführen.

Lautet das Ergebnis …

LinearRegression(copy_X=True, fit_intercept=False, n_jobs=1, normalize=False)

… ist das OK und das Netz wurde trainiert. Damit sind wir nun auch in der Lage, die „Gewichtung“, die das Modell gelernt hat, zu bestimmen. Das gelingt mit …

model.coef_

Das Ergebnis (also der Umrechnungsfaktor) lautet also: 3.28023516.Wir können den gelernten Zusammenhang (3.28023516) allerdings auch auf neue Werte anwenden, also solche, die nicht Teil der Trainingsdaten waren – etwa für 1.000 Meter.

print (2000*3.28023516)

Im Kontext von Machine Learning wäre das Ergebnis für 2.000 Meter quasi als „Vorhersage“ zu interpretieren. Schließlich haben wir im Code ja nirgends den eigentlichen „Umrechnungsfaktor“ hinterlegt – auch wenn es bei linearen Zusammenhängen natürlich einfach ist, Vorhersagen zu treffen.

Das Konzept sollte aber klar geworden sein: Man trainiert quasi sein Netz mit bekannten Daten und ist dadurch in der Lage, ein Modell zu erstellen, das dann auch auf noch unbekannte Daten angewendet werden kann. Auch wenn das Beispiel trivial ist, können neuronale Netze erstaunliches leisten, wenn Trainingsdaten, Modelle, Parameter und Struktur hinreichend komplex sind und zur Fragestellung passen: etwa Lungenkrebs erkennen oder ideale Kaufzeitpunkte für Finanzprodukte vorhersagen.

Um allerdings das eigentliche Durchführen von Vorhersagen (also konkret das Ausführen der Multiplikation der Wunschdaten mit den Gewichtungen) nicht jedes Mal manuell durchführen zu müssen, besteht in sklearn auch die Möglichkeit, die Variable „model“ direkt zu verwenden, um Vorhersagen (predictions) anzufragen. So könnten wir wie folgt in einem Aufruf je eine Vorhersage für 150 Meter und 280 Meter „anfragen“:

model.predict([
   [150],
   [280]
])

Als Ausgabe bekommen wir ein Array mit den gewünschten Daten. Wir haben also den Zusammenhang der Umrechnung von Meter in Fuß aus den Daten selbst erkannt, also genau das, was ein einzelnes Neuron leisten kann.

(ID:46135801)