Interview – Data Science in der Automobilbranche

Interview mit Herrn Dr. Florian Neukart, Principal Data Scientist der
Volkswagen Group of America

Herr Dr. Florian Neukart ist Principal Data Scientist der Volkswagen Group of America. Herr Neukart arbeitete nach seiner Promotion in der Informatik an der University of Brasov als Consultant für Business Analytics bei SAP und wechselte 2013 als Data Scientist zu Audi. 2015 übernahm er für mehr als ein Jahr die Funktion als Chief Technology Officer des Volkswagen Data Labs, bis er September 2016 zu Volkswagen in die USA wechselte. Darüber hinaus ist er bereits seit 2010 in der Forschung und Lehre für Quantum Computing, maschinelles Lernen und künstliche Intelligenz tätig und zudem Autor des Buches „Reverse Engineering the Mind – Consciously Acting Machines and Accelerated Evolution“.

Data Science Blog: Herr Dr. Neukart, Sie sind einer der führenden Data Scientists in der Automobilbranche. Schlägt Ihr Herz mehr für die automobile Praxis oder für die Forschung?

Das kann ich so klar nicht trennen – ich habe das Glück, seit Jahren in beiden Welten tätig sein zu können, und was für mich dabei den besonderen Reiz ausmacht, ist die Möglichkeit, neuste Forschung in die Praxis zu überführen, also anhand von realen Problemstellungen zu verifizieren, ob eine Theorie praxistauglich ist oder nicht. Umgekehrt gilt das genauso – es kommt vor, dass ich mich mit Fragestellungen konfrontiert sehe, für welche die erforderliche analytische Mathematik noch nicht entwickelt wurde, was wieder zu neuer Forschung und innovativen Ideen anregt. Schon mein ganzes Leben bin ich getrieben von Neugierde und will verstehen, wie Dinge funktionieren, unabängig davon, ob es sich um die Gruppendynamik und Selbstorganisation von Herzzellen, quantenphysikalisches Verhalten von subatomaren Teilchen, autonom agierende Fahrzeuge, Fluktuationsprognosen in Märkten oder die Auswertung und Interpretation von Sprache handelt. Dabei ist es zwar primär die Mathematik, die mir hilft, Zusammenhänge zu verstehen und zu interpretieren, aber erst die Technologien und Plattformen, die über die letzten Jahre entwickelt wurden, um etwa rechenintensive Mathematik zu parallelisieren, Daten im Hauptspeicher zu halten und effizient abzufragen, machen unsere Arbeit erst möglich und richtig interessant.

Data Science Blog: Welche Rolle spielt Data Science derzeit für die Automobilbranche? Sicherlich dreht sich gerade alles um das autonome Fahrzeug?

Natürlich sind selbstfahrende Fahrzeuge und Mobilität ein grosses Thema bei OEMs. Aber Data Science ist viel umfassender. Data Science hat bereits Einzug in die technische Entwicklung, Einkauf, Marketing, Logistik, Produktion, Sales, After Sales und Retail gehalten. Speziell der Connected Customer wird immer bedeutender, da sich die internationale Wettbewerbsfähigkeit in naher Zukunft auch über die neuen technischen und Serviceangebote definieren wird, die mit Hilfe von Data Science und maschinellem Lernen möglich werden. Bezogen auf selbstfahrende Fahrzeuge beginnen wir, das gesamte Ökosystem, bestehend aus Infrastruktur und unterschiedlichen Verkehrsteilnehmern, als Multi-Agentensystem zu betrachten. Vehicle to Vehicle und Vehicle to X-Kommunikation gewinnen an Bedeutung, und speziell die Einführung von sozialen Komponenten wird entscheidende Vorteile bringen. Beispielhaft gesprochen, können Ziele der Flotte sein, die Sicherheit für die Passagiere und andere Verkehrsteilnehmer (Passanten, Radfahrer, Motorräder, Fiaker :-)) zu maximieren und gleichzeitig den Verkehrsfluss zu optimieren. Es macht wenig Sinn, eine Ampel an einer Kreuzung auf Rot zu schalten, wenn die Kreuzung gefahrlos durchquert werden kann. Davon abgesehen werden in naher Zukunft alle Fahrzeuge mit ähnlichen Sensoren ausgestattet sein, etwa Kameras, LiDAR, Radar, Ultraschall und Mikrofonen zur akustischen Umfeldwahrnehmung. Ein weiteres Szenario versetzt die Stadtverwaltung in die Lage zu erkennen,  wo der Verkehrsfluss stockt und was getan werden muss, um diesen zu optimieren. Das „was getan werden muss“ ist extrem interessant – etwa könnte man die Strassen digital werden lassen, also Asphaltstraßen durch Glas ersetzen und durch OLEDs ergänzen. Damit sind dann dynamische Veränderungen der Verkehrsführung möglich. Materialtechnisch ist das machbar, denn die Oberflächenstruktur von Glas kann so entwickelt werden, dass dieses auch im Regen rutschfest ist. Glas kann zudem so flexibel und gleichzeitig stabil designet werden, dass auch darüberfahrende LKWs es nicht zum Brechen bringen. Die Abwärme der Displays kann zur Beheizung genutzt werden – es gibt somit auch im Winter keine Eisfahrbahnen mehr. Die Stadt kann sich selbst als Agent in die Multi-Agentenumgebung einbringen und zur Erreichung der definierten Ziele beitragen.

Data Science Blog: Was sind gerade heiße Themen im Automotive-Sektor? Und demgegenüber gestellt, welche Themen spielen in der KI-Forschung gerade eine größere Rolle?

Data Science hat in jedem Bereich Einzug gehalten. Jedes Thema ist auf seine Art „heiss“, egal ob es sich „nur“ um eine Marktprognose, die vorhin erwähnten Multi-Agentensysteme, kollaborative Arbeitsumgebungen, in denen Menschen und Roboter in der Produktion zusammenarbeiten, oder etwa persönliche Assistenten handelt. Nehmen wir eine Marktprognose als Beispiel. Hier sind für den menschlichen Entscheider nicht nur die internen Verkaufszahlen und alle Indikatoren, die etwa die Weltbank liefert, interessant, sondern auch die Gesellschaftsentwicklung und die politischen Strukturen.

In der KI-Forschung ist das für mich interessanteste Thema die generelle KI, also die Schaffung einer künstlichen Intelligenz, die domänenunabhängig komplexe Probleme selbstständig lösen kann. Vieles, was uns einfach scheint, hat sich aber als sehr komplex für KI-Systeme herausgestellt. Der Weg zur generellen KI und künstlichem Bewusstsein führt für mich über das Verständnis von Dingen, wobei ich hier sowohl ein Atom als auch eine komplexe Lebensform als „Ding“ zusammenfasse. Ein Teil, der uns (und Software) hilft, Dinge in deren Kontext und Umgebung einzubetten und zu beschreiben, ist die Sprache – etwa ist ein Reifen Teil eines Fahrzeugs und eine Schraube Teil eines Reifens. Das und die Kombinationen mit anderen Säulen der KI, wie etwa Computer Vision, Logik und Entscheidungsfindung, Maschine Learning und Multi-Agentensystemen (Multi-Agenten-Lernen), bringt uns der generellen und bewussten KI Schritt für Schritt näher, wobei ich mir hier nicht anmaße, eine Definition für Bewusstsein zu geben.

Data Science Blog: Welche Tools verwenden Sie bzw. Ihr Team bei Ihrer Arbeit? Setzen Sie dabei auch auf Open Source?

Wir sind „technolgieagnostisch“, wir versuchen also, für jeden Anwendungsfall die beste Technologie zu finden und einzusetzen. Das ist mal ein Tool oder eine Plattform von einem grossen Softwarehersteller, mal eine Lösung von einem Startup, wobei wir die meisten unserer Projekte doch in R oder Python umsetzen. Wir packen auch unsere Eigenentwicklungen in Libraries, die wir momentan aber noch ausschliesslich intern nutzen.


Data Science Blog: Was macht für Sie einen guten Data Scientist aus? Nach wem suchen Sie, wenn Sie einen Data Scientist einstellen?

Die wichtigste Eigenschaft scheint mir ein Drang nach dem Verständnis von Zusammenhängen und Dingen zu sein – eine starke Neugier – wobei ich unter „Dingen“ je nach Kontext Atome genauso wie komplexe Maschinen einordne.

Dass ich über Atome und komplexe Maschinen schreibe, hat damit zu tun, weil ich auch durch meinen zweiten Job an der Uni vielfältigste Daten analyiseren durfte. Und dass ich Beiträge zu Maschinenlernen und Physik verfasse, liegt tatsächlich in erster Linie an meiner Neugierde. Die Mathematik, Physik, Neurowissenschaft, Informatik … sind Grundlagen, die sich jemand aneignen wird, wenn sie/er verstehen will.

Data Science Blog: Wie sieht Ihrer Erfahrung nach der Arbeitsalltag als Data Scientist nach dem morgendlichen Café bis zum Feierabend aus?

Idealerweise startet der Tag nicht mit Emails :-). Wenn ich aus meiner Erfahrung sprechen darf, dann lässt einen die Data Science auch nach der Arbeit nicht los und die Grenzen von Beruf und Hobby überlagern sich irgendwann. Schon während dem morgendlichen Café tauschen wir uns über die jeweiligen Projekte aus – jeder sollte soviel wie möglich über alle Projekte wissen, um nicht lediglich Nischenwissen aufzubauen. Scrum hat sich auch in Bezug auf Data Science bewährt – je nachdem, wie viele Data Scientists an einem Thema arbeiten und wie viele Tasks anfallen, machen tägliche Stand-Ups Sinn – speziell wenn ein Projekt viele Subkomponenten hat, die als grosses Ganzes funktionieren müssen, hat so jeder Beteiligte immer vollste Transparenz. Die meiste Zeit fliesst natürlich in die Entwicklung der jeweiligen Prototypen / Produkte, aber etwa ein Drittel sollte reserviert sein für das Durcharbeiten von Papers mit aktuellsten Forschungsergebnissen und dem Einarbeiten in neue Technologien. Ich habe mal gesagt bekommen „Data Scientists sprechen nicht viel“, was für die Zeit während der Entwicklungsarbeit (und meiner Erfahrung nach auf die meisten Informatiker) auch zutrifft, da wir zumeist den Zustand eines komplexen Systems im Kopf behalten müssen – tatsächlich aber sprechen wir sehr gerne und viel über mögliche Arten, Probleme zu verstehen und zu lösen. Für meine Kollegen und mich ist Data Science kein bloßer Job, wir beschäftigen uns auch nach dem Feierabend noch mit relevanter Lektuere oder privaten Side-Projects – wie gesagt, wir haben das Glück, Job und Hobby zu vereinen.

Data Science Blog: Für alle Studenten, die demnächst ihren Bachelor, beispielsweise in Informatik, Mathematik oder Wirtschaftslehre, abgeschlossen haben, was würden sie diesen jungen Damen und Herren raten, wie sie einen guten Einstieg ins Data Science bewältigen können?

Natürlich ist ein solider methodischer Hintergrund, darunter Statistik, Mathematik und Informatik mit Fokus auf Machine Learning erforderlich, und auch das technische Wissen, die Theorie in Produkte zu überführen, also in Programmiersprachen und relevante Libraries, Datenbanken, Streaming und IoT. Das sind Kernkompetenzen, aber wie gesagt, am Anfang steht die Neugierde. Ich rate jedoch jedem, sich einem Problem nicht ausschließlich über die Theorie zu nähern, sondern erst zu versuchen, das Problem zu verstehen und das theoretische Wissen hands-on aufzubauen. Niemand weiss alles, und die Recherche rund um ein Problem ist ein wichtiger Lernprozess, aus dem man unglaublich viel mitnehmen kann. Data Science ist immer hands-on, und Neugierde führt zum Ziel.

Einstieg in das Maschinelle Lernen mit Python(x,y)

Python(x,y) ist eine Python-Distribution, die speziell für wissenschaftliche Arbeiten entwickelt wurde. Es umfasst neben der Programmiersprache auch die Entwicklungsumgebung Spyder und eine Reihe integrierter Python-Bibliotheken. Mithilfe von Python(x,y) kann eine Vielzahl von Interessensbereichen bearbeitet werden. Dazu zählen unter anderem Bildverarbeitung oder auch das maschinelle Lernen. Das All-in-One-Setup für Python(x,y) ist für alle gängigen Betriebssysteme online erhältlich. Read more

Interview – Data Science im Online Marketing

Interview mit Thomas Otzasek, Head of Data Science bei der Smarter Ecommerce GmbH

Thomas Otzasek ist Head of Data Science bei der Smarter Ecommerce GmbH in Linz, ein Unternehmen für die Automatisierung des professionellen Suchmaschinen Marketings. Herr Otzasek leitet das Data Science Team zur Automatisierung von operativen Prozessen im Suchmaschinen Marketing mit Machine Learning. Weitere interessante Blogposts von Thomas Otzasek zum Thema Suchmaschinen Marketing und Data Science finden Sie im Whoop! Blog.

Data Science Blog: Herr Otzasek, welcher Weg hat Sie zum Data Science für das Suchmaschinen Marketing geführt?

Ich war schon immer an Zahlen interessiert und begann daher im Jahr 2002 ein Masterstudium der Statistik an der Johannes Kepler Universität in Linz. Im Jahr 2006 wurde an dieser Uni dann erstmalig der Studiengang Bioinformatik mit Schwerpunkt Machine Learning angeboten, der mich ebenfalls angesprochen hat. Im Jahr 2009 habe ich beide Masterstudien erfolgreich abgeschlossen.

Nachdem ich in diversen Branchen u.a. als Business Analyst oder Software-Entwickler gearbeitet habe, überzeugte mich im Jahr 2015 die Firma Smarter Ecommerce mit einer innovativen Produktidee, für die ich den fehlenden Data Science Puzzleteil ideal ausfüllen konnte. Seitdem sind wir auf Wachstumskurs und konnten unsere Mitarbeiterzahl innerhalb von 15 Monaten auf derzeit 85 Mitarbeiter mehr als verdoppeln.

Data Science Blog: Welche Bedeutung hat Big Data und Data Science für Ihre Branche?

Im Suchmaschinen Marketing gibt es sehr viel manuelle Arbeit. Mit dem Einsatz von Data Science können wir diese manuelle Arbeit unterstützen oder automatisieren. Ist das Produktsortiment entsprechend groß, können wir die Platzierung in Online-Anzeigen soweit optimieren, wie es selbst dem besten Mitarbeiter ohne entsprechende Tools niemals möglich wäre.

Wir übernehmen das Aussteuern von Google Shopping, für welche Produkte wo genau Anzeigen zu welchen Konditionen geschaltet werden. Wir haben dafür Machine Learning Modelle entwickelt, die diese Anzeigenschaltung optimieren. Der dafür von meinem Data Science Team entwickelte Prototyp ist seit über einem Jahr produktiv im Einsatz.

Data Science Blog: Was optimieren diese Algorithmen des maschinellen Lernens?

Der vollautomatisierte Ansatz kommt bei unserem Produkt Whoop! für Google Shopping zum Einsatz. Google Shopping ist ein Teil von Google AdWords. Wir verwenden den Produkt-Datenfeed des Kunden, die Performance-Historie von Google AdWords, unsere jahrelange Google Shopping Erfahrung sowie die Ziele des Kunden bezüglich der Anzeigen um z. B. die Kosten-Umsatz-Relation oder die Kosten pro Akquisition zu optimieren.

Die Herausforderung ist, das richtige Gebot für das jeweilige Produkt zu wählen. Wenn Sie eine ganze Reihe von verschiedenen oder auch ähnlichen Produkten haben (z. B. verschiedene Farben oder Größen), müssen wir diese Gebote so tunen, dass die Reichweite und Zielgruppe ideal ist, ohne dass die Kosten explodieren.

Wird ein Produkt zu hoch geboten, sind nicht nur die Kosten für das bewerbende Unternehmen zu hoch, auch die Platzierung ist dann meistens nicht optimal. Google, unser Anzeigenpartner, verallgemeinert die Suchanfragen im hochpreisigen Segment tendenziell zu sehr, darunter leidet dann die Relevanz. Wird für die Anzeige zu niedrig geboten, wird sie hingegen gar nicht erst angezeigt. Neben der Conversion Rate spielt für unsere Kunden hauptsächlich die Kosten-Umsatz-Relation eine Rolle. Ein Mitarbeiter im Online Marketing könnte diese Optimierung für mehr als eine Hand voll Produkte nicht vornehmen. Denken Sie z. B. an die Mode-Branche, die ein sich schnell umschlagendes Produktsortiment mit vielen Produkten hat.

Data Science Blog: Welche datenwissenschaftlichen Herausforderungen spielen dabei eine Rolle?

Die Produktdaten sind sehr umfangreich, der Anzeigenmarkt und die Produkttrends extrem dynamisch. Außerdem gibt es für viele Produkte nur wenige Klicks, so dass wir ausgeklügelte Algorithmen brauchen, um trotzdem statistisch valide Aussagen treffen zu können.

Für die manuelle Aussteuerung ist die Produktanzahl meist zu groß um produktgenaue Gebote abgeben zu können. Bei einem großen und/oder schnell umschlagenden Produktsortiment haben wir es mit komplexen Strukturen zu tun, die wir in diesen Modellen berücksichtigen müssen, um stets die optimalen Gebote zu setzen.

Das Modell muss dabei jederzeit berücksichtigen, welche Produkte bzw. Anzeigen performen bzw. nicht performen, um jene entsprechend hoch- oder runter zu regeln. Eine einfache Regressionsanalyse reicht da nicht aus. Auch Änderungen des Kunden in den Einstellungen sowie externe Faktoren wie z. B. das Wetter müssen sofort berücksichtigt werden.

Data Science Blog: Welche Methoden des Data Science sind aktuell im Trend und spielen demnächst eine Rolle?

Aus meiner Sicht ist Deep Learning mit neuronalen Netzen der Trend. Vermutlich werden sie sich weiter durchsetzen, denn sie können noch komplexere Aufgaben bewältigen. Aktuell gibt es allerdings teilweise noch Akzeptanzprobleme, da neuronale Netze mit vielen versteckten Schichten eine Blackbox darstellen. Die Ergebnisse sind also im Gegensatz zu weniger komplexen Methoden nicht nachvollziehbar.

Data Science Blog: Auf welche Tools setzen Sie bei Ihrer Arbeit? Bevorzugen Sie Open Source oder proprietäre Lösungen?

Ich habe viel mit proprietären Lösungen gearbeitet, beispielsweise mit SAS oder IBM SPSS. Wir setzen derzeit allerdings auf Open Source, vor allem auf die Programmiersprache R. Neue Mitarbeiter im Data Science Bereich sollten daher zumindest über Grundkenntnisse in R verfügen und die Lust haben, sich tiefer mit dieser Programmiersprache zu befassen.

Wir verwenden unter anderem die Pakete ggplot und Shiny. Mit Shiny erstellen wir interne Web-Applikationen, um Kollegen Analysen zur Verfügung zu stellen. Für Eigenentwicklungen komplexer Visualisierungen ist ggplot perfekt geeignet.

Mit R können wir außerdem selbst eigene Packages erstellen um den Funktionsumfang nach unseren Wünschen zu erweitern. Wir haben daher keinen Grund, auf kostenintensive Lösungen zu setzen.

Data Science Blog: Was macht Ihrer Erfahrung nach einen guten Data Scientist aus?

Aus meiner Sicht sollte man ein Zahlenfreak sein und niemals aufhören Fragen zu stellen, denn darum geht es im Data Science. Gute Data Scientists sind meiner Meinung nach interdisziplinär ausgebildet, kommen also nicht nur aus einer Ecke, sondern besser aus zwei oder drei Fachbereichen. Man benötigt verschiedene Sichtweisen.

Aus welchem Fachbereich man ursprünglich kommt, ist dabei gar nicht so wichtig. Es muss also nicht unbedingt ein Mathematiker oder Statistiker sein.

Data Science Blog: Gibt es eigentlich aus Ihrer Erfahrung heraus einen Unterschied zwischen Mathematikern und Statistikern?

Ja. Mathematiker denken meiner Meinung nach sehr exakt und beweisorientiert. Statistik ist zwar ein Teilbereich der Mathematik, aber für einen Statistiker steht das Schätzen im Vordergrund. Statistiker denken in Verteilungen, Wahrscheinlichkeiten und Intervallen und können gut mit einer gewissen Unsicherheit leben, die reine Mathematiker manchmal unbefriedigt lässt.

Data Science Blog: Für alle diejenigen, die gerade ihr Studium der Statistik, Ingenieurwissenschaft oder was auch immer abschließen. Welchen Rat haben Sie, wie diese Menschen einen Schritt näher ans Data Science herankommen?

Ich würde empfehlen, einfach ein eigenes kleines Projekt zu starten – „Learning by doing“! Ob das Projekt um die eigenen Stromverbrauchsdaten, eine Wettervorhersage oder Fantasy-Football geht ist nicht wichtig. Man stößt dann zwangsläufig auf die verschiedenen Arbeitsschritte und Herausforderungen. Ein empfehlenswerter Workflow ist der Cross Industry Standard Process for Data Mining, kurz CRISP-DM.

Zuerst muss man ein Geschäftsverständnis aufbauen. Weiter geht es mit der Datensammlung und Datenintegration, danach folgt die Datenaufbereitung. Diese Schritte benötigen bereits ca. 80% der Projektzeit. Erst dann können explorative Analysen, Hypothesentests oder Modellierung aufgesetzt werden. Am Ende des Prozesses erfolgt das Deployment.

 

Machine Learning mit Python – Minimalbeispiel

Maschinelles Lernen (Machine Learning) ist eine Gebiet der Künstlichen Intelligenz (KI, bzw. AI von Artificial Intelligence) und der größte Innovations- und Technologietreiber dieser Jahre. In allen Trendthemen – wie etwa Industrie 4.0 oder das vernetzte und selbstfahrende Auto – spielt die KI eine übergeordnete Rolle. Beispielsweise werden in Unternehmen viele Prozesse automatisiert und auch Entscheidungen auf operativer Ebene von einer KI getroffen, zum Beispiel in der Disposition (automatisierte Warenbestellungen) oder beim Festsetzen von Verkaufspreisen.

Aufsehen erregte Google mit seiner KI namens AlphaGo, einem Algortihmus, der den Weltmeister im Go-Spiel in vier von fünf Spielen besiegt hatte. Das Spiel Go entstand vor mehr als 2.500 Jahren in China und ist auch heute noch in China und anderen asiatischen Ländern ein alltägliches Gesellschaftsspiel. Es wird teilweise mit dem westlichen Schach verglichen, ist jedoch einfacher und komplexer zugleich (warum? das wird im Google Blog erläutert). Machine Learning kann mit einer Vielzahl von Methoden umgesetzt werden, werden diese Methoden sinnvoll miteinander kombiniert, können durchaus äußerst komplexe KIs erreicht werden.  Der aktuell noch gängigste Anwendungsfall für Machine Learning ist im eCommerce zu finden und den meisten Menschen als die Produktvorschläge von Amazon.com bekannt: Empfehlungsdienste (Recommender System).

Klassifikation via K-Nearest Neighbour Algorithmus

Ein häufiger Zweck des maschinellen Lernens ist, technisch gesehen, die Klassifikation von Daten in Abhängigkeit von anderen Daten. Es gibt mehrere ML-Algorithmen, die eine Klassifikation ermöglichen, die wohl bekannteste Methode ist der k-Nearest-Neighbor-Algorithmus (Deutsch:„k-nächste-Nachbarn”), häufig mit “kNN” abgekürzt. Das von mir interviewte FinTech StartUp Number26 nutzt diese Methodik beispielsweise zur Klassifizierung von Finanztransaktionen.

Um den Algorithmus Schritt für Schritt aufbauen zu können, müssen wir uns

Natürlich gibt es in Python, R und anderen Programmiersprachen bereits fertige Bibliotheken, die kNN bereits anbieten, denen quasi nur Matrizen übergeben werden müssen. Am bekanntesten ist wohl die scikit-learn Bibliothek für Python, die mehrere Nächste-Nachbarn-Modelle umfasst. Mit diesem Minimalbeispiel wollen wir den grundlegenden Algorithmus von Grund auf erlernen. Wir wollen also nicht nur machen, sondern auch verstehen.

Vorab: Verwendete Bibliotheken

Um den nachstehenden Python-Code (Python 3.x, sollte allerdings auch mit Python 2.7 problemlos funktionieren) ausführen zu können, müssen folgende Bibliotheken  eingebunden werden:

import numpy as numpy
import matplotlib.pyplot as pyplot
from mpl_toolkits.mplot3d import Axes3D #Erweiterung für die Matplotlib - siehe: http://matplotlib.org/mpl_toolkits/

Übrigens: Eine Auflistung der wohl wichtigsten Pyhton-Bibliotheken für Datenanalyse und Datenvisualisierung schrieb ich bereits hier.

Schritt 1 – Daten betrachten und Merkmale erkennen

Der erste Schritt ist tatsächlich der aller wichtigste, denn erst wenn der Data Scientist verstanden hat, mit welchen Daten er es zu tun hat, kann er die richtigen Entscheidungen treffen, wie ein Algorithmus richtig abgestimmt werden kann und ob er für diese Daten überhaupt der richtige ist.

In der Realität haben wir es oft mit vielen verteilten Daten zu tun, in diesem Minimalbeispiel haben wir es deutlich einfacher: Der Beispiel-Datensatz enthält Informationen über Immobilien über vier Spalten.

  • Quadratmeter: Größe der nutzbaren Fläche der Immobilie in der Einheit m²
  • Wandhoehe: Höhe zwischen Fußboden und Decke innerhalb der Immobilie in der Einheit m
  • IA_Ratio: Verhältnis zwischen Innen- und Außenflächen (z. B. Balkon, Garten)
  • Kategorie: Enthält eine Klassifizierung der Immobilie als “Haus”, “Wohnung” und “Büro”

 

beispiel-txt-file

[box]Hinweis für Python-Einsteiger: Die Numpy-Matrix ist speziell für Matrizen-Kalkulationen entwickelt. Kopfzeilen oder das Speichern von String-Werten sind für diese Datenstruktur nicht vorgesehen![/box]

def readDataSet(filename):

    fr = open(filename)                 # Datei-Stream vorbereiten

    numberOfLines = len(fr.readlines()) # Anzahl der Zeilen ermitteln

    returnMat = numpy.zeros((numberOfLines-1,3)) # Eine Numpy-Matrix in Höhe der Zeilenanzahl (minus Kopfzeile) und in Breite der drei Merkmal-Spalten

    classLabelVector = [] # Hier werden die tatsächlichen Kategorien (Haus, Wohnung, Büro) vermerkt
    classColorVector = [] # Hier werden die Kategorien über Farben vermerkt (zur späteren Unterscheidung im 3D-Plot!)
    
    #print(returnMat)   # Ggf. mal die noch die ausge-null-te Matrix anzeigen lassen (bei Python 2.7: die Klammern weglassen!)
    
    fr = open(filename) # Datei-Stream öffnen
    index = 0
    
    for line in fr.readlines():  # Zeile für Zeile der Datei lesen
        if index != 0:           # Kopfzeile überspringen
            line = line.strip()
            listFromLine = line.split('\t') # Jede Zeile wird zur temporären Liste (Tabulator als Trennzeichen)

            returnMat[index-1,:] = listFromLine[1:4] #Liste in die entsprechende Zeile der Matrix überführen
            
            classLabel = listFromLine[4]  # Kategorie (Haus, Wohnung, Büro) für diese Zeile merken
            
            if classLabel == "Buero":
                color = 'yellow'
            elif classLabel == "Wohnung":
                color = 'red'
            else:
                color = 'blue'
                        
            classLabelVector.append(classLabel) # Kategorie (Haus, Wohnung, Büro) als Text-Label speichern
            classColorVector.append(color)      # Kategorie als Farbe speichern (Büro = gelb, Wohnung = rot, Haus = Blau)
        
        index += 1


return returnMat,classLabelVector, classColorVector

Aufgerufen wird diese Funktion dann so:

dataSet, classLabelVector, classColorVector = readDataSet("K-Nearst_Neighbour-DataSet.txt")

Die Matrix mit den drei Spalten (Quadratmeter, Wandhohe, IA_Ratio) landen in der Variable “dataSet”.

Schritt 2 – Merkmale im Verhältnis zueinander perspektivisch betrachten

Für diesen Anwendungsfall soll eine Klassifizierung (und gewissermaßen die Vorhersage) erfolgen, zu welcher Immobilien-Kategorie ein einzelner Datensatz gehört. Im Beispieldatensatz befinden sich vier Merkmale: drei Metriken und eine Kategorie (Wohnung, Büro oder Haus). Es stellt sich zunächst die Frage, wie diese Merkmale zueinander stehen. Gute Ideen der Datenvisualisierung helfen hier fast immer weiter. Die gängigsten 2D-Visualisierungen in Python wurden von mir bereits hier zusammengefasst.

[box]Hinweis: In der Praxis sind es selten nur drei Dimensionen, mit denen Machine Learning betrieben wird. Das Feature-Engineering, also die Suche nach den richtigen Features in verteilten Datenquellen, macht einen wesentlichen Teil der Arbeit eines Data Scientists aus – wie auch beispielsweise Chief Data Scientist Klaas Bollhoefer (siehe Interview) bestätigt.[/box]

fig = pyplot.figure()
ax = fig.add_subplot(111)
ax.scatter(dataSet[:,0], dataSet[:,1], marker='o', color=classColorVector)
ax.set_xlabel("Raumflaeche in Quadratmeter")
ax.set_ylabel("Wandhohe")
ax.set_xlim(xmin=0)
ax.set_ylim(ymin=0)
pyplot.show()
fig = pyplot.figure()
ax = fig.add_subplot(111)
ax.scatter(dataSet[:,0], dataSet[:,2], marker='o', color=classColorVector)
ax.set_xlabel("Raumflaeche in Quadratmeter")
ax.set_ylabel("IA_Ratio")
ax.set_xlim(xmin=0)
ax.set_ylim(ymin=0)
pyplot.show()

Die beiden Scatter-Plots zeigen, das Häuser (blau) in allen Dimensionen die größte Varianz haben. Büros (gelb) können größer und höher ausfallen, als Wohnungen (rot), haben dafür jedoch tendenziell ein kleineres IA_Ratio. Könnten die Kategorien (blau, gelb, rot) durch das Verhältnis innerhalb von einem der beiden Dimensionspaaren in dem zwei dimensionalen Raum exakt voneinander abgegrenzt werden, könnten wir hier stoppen und bräuchten auch keinen kNN-Algorithmus mehr. Da wir jedoch einen großen Überschneidungsbereich in beiden Dimensionspaaren haben (und auch Wandfläche zu IA_Ratio sieht nicht besser aus),

Eine 3D-Visualisierung eignet sich besonders gut, einen Überblick über die Verhältnisse zwischen den drei Metriken zu erhalten: (die Werte wurden hier bereits normalisiert, liegen also zwischen 0,00 und 1,00)

3D Scatter Plot in Python [Matplotlib]
fig = pyplot.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(dataSet[:,0], dataSet[:,2], dataSet[:,1], marker='o', color=classColorVector)
ax.set_xlabel("Raumflaeche in Quadratmeter")
ax.set_ylabel("IA_Ratio")
ax.set_zlabel("Wandhoehe in Meter")
ax.set_xlim(xmin=0)
ax.set_ylim(ymin=0)
ax.set_zlim(zmin=0)
pyplot.show()

Es zeigt sich gerade in der 3D-Ansicht recht deutlich, dass sich Büros und Wohnungen zum nicht unwesentlichen Teil überschneiden und hier jeder Algorithmus mit der Klassifikation in Probleme geraten wird, wenn uns wirklich nur diese drei Dimensionen zur Verfügung stehen.

Schritt 3 – Kalkulation der Distanzen zwischen den einzelnen Punkten

Bei der Berechnung der Distanz in einem Raum hilft uns der Satz des Pythagoras weiter. Die zu überbrückende Distanz, um von A nach B zu gelangen, lässt sich einfach berechnen, wenn man entlang der Raumdimensionen Katheten aufspannt.

c = \sqrt{a^2+ b^2}

Die Hypotenuse im Raum stellt die Distanz dar und berechnet sich aus der Wurzel aus der Summe der beiden Katheten im Quadrat. Die beiden Katheten bilden sich aus der Differenz der Punktwerte (q, p) in ihrer jeweiligen Dimension.Bei mehreren Dimensionen gilt der Satz entsprechend:

Distanz = \sqrt{(q_1-p_1)^2+(q_2-p_2)^2+…+(q_n-p_n)^2}

Um mit den unterschiedlichen Werte besser in ihrer Relation zu sehen, sollten sie einer Normalisierung unterzogen werden. Dabei werden alle Werte einer Dimension einem Bereich zwischen 0.00 und 1.00 zugeordnet, wobei 0.00 stets das Minimum und 1.00 das Maximum darstellt.

NormWert = \frac{Wert - Min}{Wertspanne} = \frac{Wert - Min}{Max - Min}

$

def normalizeDataSet(dataSet):
    
    dataSet_n = numpy.zeros(numpy.shape(dataSet))     #[[ 0. 0. 0.]
                                                      # [ 0. 0. 0.]
                                                      # [ 0. 0. 0.]
                                                      # ..., 
                                                      # [ 0. 0. 0.]
                                                      # [ 0. 0. 0.]
                                                      # [ 0. 0. 0.]]
    
    minValues = dataSet.min(0)                        # [ 10. 2.6 0.]
    ranges = dataSet.max(0) - dataSet.min(0)          # [ 1775. 2.4 68.]
    
    minValues = dataSet.min(0)                        # [ 10. 2.6 0.]
    maxValues = dataSet.max(0)                        # [ 1785. 5. 68.]
 
    ranges = maxValues - minValues                    # [ 1775. 2.4 68.]
 
    rowCount = dataSet.shape[0]                       # 1039 
    
    # numpy.tile() wiederholt Sequenzen (hier:  [[ 10. 2.6 0. ], ..., [ 10. 2.6 0. ]]

    dataSet_n = dataSet - numpy.tile(minValues, (rowCount, 1))  #[[ 2.56000000e+02 9.00000000e-01 1.80000000e+01]
                                                                # [ 6.60000000e+01 2.00000000e-01 5.40000000e+01]
                                                                # [ 3.32000000e+02 1.50000000e-01 1.00000000e+01]
                                                                # ..., 
                                                                # [ 1.58000000e+02 6.00000000e-01 0.00000000e+00]
                                                                # [ 5.70000000e+01 1.00000000e-01 5.20000000e+01]
                                                                # [ 1.68000000e+02 2.00000000e-01 0.00000000e+00]]

    dataSet_n = dataSet_n / numpy.tile(ranges, (rowCount, 1))   #[[ 0.14422535 0.375 0.26470588]
                                                                # [ 0.0371831 0.08333333 0.79411765]
                                                                # [ 0.18704225 0.0625 0.14705882]
                                                                # ..., 
                                                                # [ 0.08901408 0.25 0.]
                                                                # [ 0.03211268 0.04166667 0.76470588]
                                                                # [ 0.09464789 0.08333333 0.]]

    #print(dataSet_n)
        
    return dataSet_n, ranges, minValues

Die Funktion kann folgendermaßen aufgerufen werden:

dataSet_n, ranges, minValues = normalizeDataSet(dataSet)

Schritt 4 & 5 – Klassifikation durch Eingrenzung auf k-nächste Nachbarn

Die Klassifikation erfolgt durch die Kalkulation entsprechend der zuvor beschriebenen Formel für die Distanzen in einem mehrdimensionalen Raum, durch Eingrenzung über die Anzahl an k Nachbarn und Sortierung über die berechneten Distanzen.

def classify(inX, dataSet, labels, k):

    rowCount = dataSet.shape[0]              # Anzahl an Zeilen bestimmen

    diffMat = numpy.tile(inX, (rowCount,1)) - dataSet # Berechnung der Katheten 
                                                      # (über tile() wird der Eingangsdatensatz über die Zeilenanzahl des dataSet vervielfacht,
                                                      # der dataSet davon substrahiert)
 
    sqDiffMat = diffMat**2                   # Quadrat der Katheten
    sqDistances = sqDiffMat.sum(axis=1)      # Aufsummieren der Differenzpaare
    distances = sqDistances**0.5             # Quadratwurzel über alle Werte
    sortedDistIndicies = distances.argsort() # Aufsteigende Sortierung
    
    classCount = {}
    
    #print("inX = %s, k = %s" % (inX, k))
    #print(sortedDistIndicies)
    
    for i in range(k):                                        # Eingrenzung auf k-Werte in der sortierten Liste 
        closest = labels[sortedDistIndicies[i]]               # Label (Kategorie [Büro, Wohnung, Haus] entsprechend der Sortierung aufnehmen
        classCount[closest] = classCount.get(closest, 0) + 1  # Aufbau eines Dictionary über die 
    
    sortedClassCount = sorted(classCount, key = classCount.get, reverse=True) # Absteigende Sortierung der gesammelten Labels in k-Reichweite
                                                                              # wobei die Sortierung über den Count (Value) erfolgt
    
    #print(classCount)       
    #print(sortedClassCount[0])
    
    return sortedClassCount[0]   # Liefere das erste Label zurück 
                                 # also das Label mit der höchsten Anzahl innerhalb der k-Reichweite

Über folgenden Code rufen wir die Klassifikations-Funktion auf und legen die k-Eingrenzung fest, nebenbei werden Fehler gezählt und ausgewertet. Hier werden der Reihe nach die ersten 30 Zeilen verarbeitet:

 errorCount = 0
    
 k = 5                             # k-Eingrenzung (hier: auf 5 Nachbarn einschränken)

 rowCount = dataSet_n.shape[0]     # Anzahl der Zeilen im gesamten Datensatz
 
 numTestVectors = 30               # Datensätze 0 - 29 werden zum testen von k verwendet,
                                   # die Datensätze ab Zeile 30 werden zur Klassifikation verwendet
 
 for i in range(0, numTestVectors): # Aufruf des Klassifikators von 0 bis 29 
    
    result = classify(dataSet_n[i,:], dataSet_n[numTestVectors:rowCount,:], classLabelVector[numTestVectors:rowCount], k)
    
    print("%s - the classifier came back with: %s, the real answer is: %s" %(i, result, classLabelVector[i]))
 
    if (result != classLabelVector[i]):
       errorCount += 1.0

 print("Error Count: %d" % errorCount)

Nur 30 Testdatensätze auszuwählen ist eigentlich viel zu knapp bemessen und hier nur der Übersichtlichkeit geschuldet. Besser ist für dieses Beispiel die Auswahl von 100 bis 300 Datensätzen. Die Ergebnisse sind aber bereits recht ordentlich, allerdings fällt dem Algorithmus – wie erwartet – noch die Unterscheidung zwischen Wohnungen und Büros recht schwer.

0 – klassifiziert wurde: Buero, richtige Antwort: Buero
1 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
2 – klassifiziert wurde: Buero, richtige Antwort: Buero
3 – klassifiziert wurde: Buero, richtige Antwort: Buero
4 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
5 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
6 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
7 – klassifiziert wurde: Wohnung, richtige Antwort: Buero
8 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
9 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
10 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
11 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
12 – klassifiziert wurde: Buero, richtige Antwort: Buero
13 – klassifiziert wurde: Wohnung, richtige Antwort: Buero
14 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
15 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
16 – klassifiziert wurde: Buero, richtige Antwort: Buero
17 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
18 – klassifiziert wurde: Haus, richtige Antwort: Haus
19 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
20 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
21 – klassifiziert wurde: Buero, richtige Antwort: Buero
22 – klassifiziert wurde: Buero, richtige Antwort: Buero
23 – klassifiziert wurde: Buero, richtige Antwort: Buero
24 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
25 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
26 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
27 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
28 – klassifiziert wurde: Wohnung, richtige Antwort: Wohnung
29 – klassifiziert wurde: Buero, richtige Antwort: Buero
Error Count: 2

Über weitere Tests wird deutlich, dass k nicht zu niedrig und auch nicht zu hoch gesetzt werden darf.

 Datensätze  k Fehler
 150 1   25
 150 3   23
 150 5   21
 150 20   26

Ein nächster Schritt wäre die Entwicklung eines Trainingprogramms, dass die optimale Konfiguration (k-Eingrenzung, Gewichtung usw.) ermittelt.

Fehlerraten herabsenken

Die Fehlerquote ist im Grunde niemals ganz auf Null herabsenkbar, sonst haben wir kein maschinelles Lernen mehr, sondern könnten auch feste Regeln ausmachen, die wir nur noch einprogrammieren (hard-coding) müssten. Wer lernt, macht auch Fehler! Dennoch ist eine Fehlerquote von 10% einfach zu viel für die meisten Anwendungsfälle. Was kann man hier tun?

  1. Den Algorithmus verbessern (z. B. optimale k-Konfiguration und Gewichtung finden)
  2. mehr Merkmale finden (= mehr Dimensionen)
  3. mehr Daten hinzuziehen (gut möglich, dass alleine dadurch z. B. Wohnungen und Büros besser unterscheidbar werden)
  4. einen anderen Algorithmus probieren (kNN ist längst nicht für alle Anwendungen ideal!)

Das Problem mit den Dimensionen

Theoretisch kann kNN mit undenklich vielen Dimensionen arbeiten, allerdings steigt der Rechenaufwand damit auch ins unermessliche. Der k-nächste-Nachbar-Algorithmus ist auf viele Daten und Dimensionen angewendet recht rechenintensiv.

In der Praxis hat nicht jedes Merkmal die gleiche Tragweite in ihrer Bedeutung für die Klassifikation und mit jeder weiteren Dimension steigt auch die Fehleranfälligkeit, insbesondere durch Datenfehler (Rauschen). Dies kann man sich bei wenigen Dimensionen noch leicht bildlich vorstellen, denn beispielsweise könnten zwei Punkte in zwei Dimensionen nahe beieinander liegen, in der dritten Dimension jedoch weit auseinander, was im Ergebnis dann eine lange Distanz verursacht. Wenn wir beispielsweise 101 Dimensionen berücksichtigen, könnten auch hier zwei Punkte in 100 Dimensionen eng beieinander liegen, läge jedoch in der 101. Dimension (vielleicht auch auf Grund eines Datenfehlers) eine lange Distanz vor, wäre die Gesamtdistanz groß. Mit Gewichtungen könnten jedoch als wichtiger einzustufenden Dimensionen bevorzugt werden und als unsicher geltende Dimensionen entsprechend entschärft werden.

Je mehr Dimensionen berücksichtigt werden sollen, desto mehr Raum steht zur Verfügung, so dass um wenige Datenpunkte viel Leerraum existiert, der dem Algorithmus nicht weiterhilft. Je mehr Dimensionen berücksichtigt werden, desto mehr Daten müssen zu Verfügung gestellt werden, im exponentiellen Anstieg – Wo wir wieder beim Thema Rechenleistung sind, die ebenfalls exponentiell ansteigen muss.

Weiterführende Literatur


Machine Learning in Action

 


Introduction to Machine Learning with Python

Einführung in Data Science: Grundprinzipien der Datenanalyse mit Python