image

image

Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+:

www.oreilly.plus

Einführung in Machine Learning mit Python

Praxiswissen Data Science

Andreas C. Müller und Sarah Guido

Deutsche Übersetzung von Kristian Rother

image

Andreas C. Müller und Sarah Guido

Übersetzung: Kristian Rother

Bibliografische Information Der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.

ISBN:

Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«. O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.

1. Auflage 2017

Copyright © 2017 dpunkt.verlag GmbH

Authorized German translation of the English edition of Introduction to Machine Learning with Python, ISBN 978-1-4493-6941-5 © 2017 Sarah Guido, Andreas Müller. This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.

Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.

Die Informationen in diesem Buch wurden mit größter Sorgfalt erarbeitet. Dennoch können Fehler nicht vollständig ausgeschlossen werden. Verlag, Autoren und Übersetzer übernehmen keine juristische Verantwortung oder irgendeine Haftung für eventuell verbliebene Fehler und deren Folgen.

5 4 3 2 1 0

Inhalt

Vorwort

1Einführung

Warum Machine Learning?

Welche Probleme kann Machine Learning lösen?

Ihre Aufgabe und Ihre Daten kennen

Warum Python?

scikit-learn

Installieren von scikit-learn

Grundlegende Bibliotheken und Werkzeuge

Jupyter Notebook

NumPy

SciPy

matplotlib

pandas

mglearn

Python 2 versus Python 3

In diesem Buch verwendete Versionen

Eine erste Anwendung: Klassifizieren von Iris-Spezies

Die Daten kennenlernen

Erfolg nachweisen: Trainings- und Testdaten

Das Wichtigste zuerst: Sichten Sie Ihre Daten

Ihr erstes Modell konstruieren: k-nächste-Nachbarn

Vorhersagen treffen

Evaluieren des Modells

Zusammenfassung und Ausblick

2Überwachtes Lernen

Klassifikation und Regression

Verallgemeinerung, Overfitting und Underfitting

Zusammenhang zwischen Modellkomplexität und Größe des Datensatzes

Algorithmen zum überwachten Lernen

Einige Beispieldatensätze

k-nächste-Nachbarn

Lineare Modelle

Naive Bayes-Klassifikatoren

Entscheidungsbäume

Ensembles von Entscheidungsbäumen

Support Vector Machines mit Kernel

Neuronale Netze (Deep Learning)

Schätzungen der Unsicherheit von Klassifikatoren

Die Entscheidungsfunktion

Vorhersagen von Wahrscheinlichkeiten

Unsicherheit bei der Klassifikation mehrerer Kategorien

Zusammenfassung und Ausblick

3Unüberwachtes Lernen und Vorverarbeitung

Arten von unüberwachtem Lernen

Herausforderungen beim unüberwachten Lernen

Vorverarbeiten und Skalieren

Unterschiedliche Möglichkeiten der Vorverarbeitung

Anwenden von Datentransformationen

Trainings- und Testdaten in gleicher Weise skalieren

Die Auswirkungen der Vorverarbeitung auf überwachtes Lernen

Dimensionsreduktion, Extraktion von Merkmalen und Manifold Learning

Hauptkomponentenzerlegung (PCA)

Nicht-negative-Matrix-Faktorisierung (NMF)

Manifold Learning mit t-SNE

Clusteranalyse

k-Means-Clustering

Agglomeratives Clustering

DBSCAN

Vergleichen und Auswerten von Clusteralgorithmen

Zusammenfassung der Clustering-Methoden

Zusammenfassung und Ausblick

4Repräsentation von Daten und Merkmalsgenerierung

Kategorische Variablen

One-Hot-Kodierung (Dummy-Variablen)

Zahlen können kategorische Daten kodieren

Binning, Diskretisierung, lineare Modelle und Bäume

Interaktionen und Polynome

Univariate nichtlineare Transformation

Automatische Auswahl von Merkmalen

Univariate Statistiken

Modellbasierte Auswahl von Merkmalen

Iterative Auswahl von Merkmalen

Berücksichtigen von Expertenwissen

Zusammenfassung und Ausblick

5Evaluierung und Verbesserung von Modellen

Kreuzvalidierung

Kreuzvalidierung in scikit-learn

Vorteile der Kreuzvalidierung

Stratifizierte k-fache Kreuzvalidierung und andere Strategien

Gittersuche

Einfache Gittersuche

Die Gefahr des Overfittings von Parametern und Validierungsdaten

Gittersuche mit Kreuzvalidierung

Evaluationsmetriken

Das Ziel im Auge behalten

Metriken zur binären Klassifikation

Metriken zur Klassifikation mehrerer Kategorien

Regressionsmetriken

Verwenden von Metriken zur Modellauswahl

Zusammenfassung und Ausblick

6Verkettete Algorithmen und Pipelines

Parameterauswahl mit Vorverarbeitung

Erstellen von Pipelines

Pipelines zur Gittersuche einsetzen

Die allgemeine Pipeline-Schnittstelle

Bequemes Erstellen von Pipelines mit make_pipeline

Zugriff auf Attribute von Schritten

Zugriff auf Attribute in einer Pipeline mit Gittersuche

Gittersuche für Vorverarbeitungsschritte und Modellparameter

Gittersuche nach dem richtigen Modell

Zusammenfassung und Ausblick

7Verarbeiten von Textdaten

Arten von als Strings repräsentierter Daten

Anwendungsbeispiel: Meinungsanalyse zu Filmbewertungen

Repräsentation von Text als Bag-of-Words

Anwenden von Bag-of-Words auf einen einfachen Datensatz

Bag-of-Words der Filmbewertungen

Stoppwörter

Umskalieren der Daten mit tf-idf

Untersuchen der Koeffizienten des Modells

Bag-of-Words mit mehr als einem Wort (n-Gramme)

Fortgeschrittene Tokenisierung, Stemming und Lemmatisierung

Modellierung von Themen und Clustering von Dokumenten

Latent Dirichlet Allocation

Zusammenfassung und Ausblick

8Zusammenfassung und weiterführende Ressourcen

Herangehensweise an eine Fragestellung beim maschinellen Lernen

Der menschliche Faktor

Vom Prototyp zum Produktivsystem

Testen von Produktivsystemen

Konstruieren eines eigenen Estimators

Wie geht es von hier aus weiter?

Theorie

Andere Umgebungen und Programmpakete zum maschinellen Lernen

Ranking, Empfehlungssysteme und andere Arten von Lernen

Probabilistische Modellierung, Inferenz und probabilistische Programmierung

Neuronale Netze

Skalieren auf größere Datensätze

Verfeinern Sie Ihre Fähigkeiten

Schlussbemerkung

Index

Vorwort

Machine Learning ist heutzutage ein integraler Bestandteil vieler kommerzieller Anwendungen und Forschungsprojekte in so unterschiedlichen Gebieten wie medizinischer Diagnose und Behandlung oder dem Finden von Freunden in einem sozialen Netzwerk. Viele glauben, dass maschinelles Lernen nur von großen Firmen mit großen Forschungsabteilungen umgesetzt werden kann. In diesem Buch möchten wir Ihnen zeigen, wie einfach es ist, selbst maschinelle Lernsysteme zu bauen, und wie Sie dabei am besten vorgehen. Mit dem Wissen aus diesem Buch können Sie sich Ihr eigenes System zusammenbauen, um herauszufinden, wie Menschen sich auf Twitter fühlen, oder um Vorhersagen über die globale Erwärmung zu treffen. Die Anwendungen von maschinellem Lernen sind schier endlos und mit den heutzutage zur Verfügung stehenden Daten hauptsächlich durch Ihre eigene Vorstellungskraft begrenzt.

Wer sollte dieses Buch lesen?

Dieses Buch ist für gegenwärtige und aufstrebende Anwender maschinellen Lernens geeignet, die reale Fragestellungen mithilfe von maschinellem Lernen beantworten möchten. Dies ist ein Einführungsbuch, das keinerlei Vorwissen über maschinelles Lernen oder künstliche Intelligenz (KI) voraussetzt. Wir werden unser Hauptaugenmerk auf die Verwendung von Python und der Bibliothek scikit-learn richten und sämtliche Schritte beim Entwickeln einer erfolgreichen Anwendung zum maschinellen Lernen abhandeln. Die dabei vorgestellten Methoden sind für Wissenschaftler, Forscher und an kommerziellen Anwendungen arbeitende Data Scientists nützlich. Den größten Nutzen wird dieses Buch für Sie haben, wenn Sie bereits ein wenig mit Python und den Bibliotheken NumPy und matplotlib vertraut sind.

Wir haben uns redlich bemüht, uns weniger um die Mathematik zu kümmern, sondern das Augenmerk vielmehr auf die praktischen Aspekte der Nutzung von Algorithmen zum maschinellen Lernen zu legen. Auch wenn Mathematik (insbesondere Wahrscheinlichkeitstheorie) die Grundlage maschinellen Lernens darstellt, werden wir die Algorithmen nicht in aller Ausführlichkeit analysieren. Wenn Sie sich für die den maschinellen Lernalgorithmen zugrunde liegende Mathematik interessieren, empfehlen wir Ihnen das Buch The Elements of Statistical Learning (Springer) von Trevor Hastie, Robert Tibshirani und Jerome Friedman, das kostenlos auf der Website der Autoren (http://statweb.stanford.edu/~tibs/ElemStatLearn/) verfügbar ist. Ebenso werden wir nicht beschreiben, wie man Algorithmen für maschinelles Lernen von null auf implementiert. Stattdessen möchten wir Ihnen vor allem zeigen, wie Sie die zahlreichen bereits in scikit-learn und anderen Bibliotheken implementierten Methoden nutzen können.

Warum wir dieses Buch geschrieben haben

Es gibt zahlreiche Bücher über Machine Learning und KI. Allerdings sind diese alle für Masterstudenten und Doktoranden der Informatik geschrieben und stecken voller fortgeschrittener Mathematik. Das steht in deutlichem Gegensatz dazu, wie maschinelles Lernen tatsächlich verwendet wird, nämlich als bequemes Werkzeug in der Forschung und in kommerziellen Anwendungen. Heutzutage braucht man für Machine Learning keinen Doktortitel. Es gibt aber einige Ressourcen, die die wichtigsten Aspekte der Implementierung von maschinellem Lernen in der Praxis vollständig wiedergeben, ohne dass Sie einen Mathekurs für Fortgeschrittene besuchen müssen. Wir hoffen, dass dieses Buch beim Anwenden maschineller Lernmethoden hilft, ohne dass dazu jahrelange Lektüre in Analysis, linearer Algebra und Wahrscheinlichkeitstheorie notwendig wäre.

Wegweiser durch dieses Buch

Dieses Buch ist etwa folgendermaßen organisiert:

Die eigentlichen Algorithmen werden in den Kapiteln 2 und 3 vorgestellt, auch wenn das Verständnis all dieser Algorithmen für einen Anfänger nicht unbedingt erforderlich ist. Wenn Sie ein maschinelles Lernsystem so schnell wie möglich konstruieren müssen, empfehlen wir Ihnen, mit Kapitel 1 und den ersten Abschnitten von Kapitel 2 zu beginnen, in denen die wichtigsten Begriffe vorgestellt werden. Sie können dann direkt zu Abschnitt »Zusammenfassung und Ausblick« auf Seite 120 in Kapitel 2 springen, wo Sie eine Liste aller besprochenen überwachten Modelle finden. Wählen Sie das für Ihre Zwecke am besten geeignete Modell aus und blättern Sie dann zum entsprechenden Abschnitt, der sich mit den Details auseinandersetzt. Danach können Sie die Techniken in Kapitel 5 anwenden, um Ihr Modell zu evaluieren und zu optimieren.

Ressourcen im Netz

Beim Studium dieses Buches sollten Sie unbedingt die Webseite von scikit-learn (http://scikit-learn.org) besuchen, um die detaillierte Dokumentation der Klassen und Funktionen zu sichten und weitere Beispiele zu finden. Es gibt auch einen Videokurs von Andreas Müller, »Advanced Machine Learning with scikit-learn,« der dieses Buch begleitet. Sie können diesen auf http://bit.ly/advanced_machine_learning_scikit-learn finden.

In diesem Buch verwendete Konventionen

Die folgenden typografischen Konventionen werden in diesem Buch verwendet:

Kursiv

Kennzeichnet sprachliche Hervorhebungen, neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateiendungen.

Feste Zeichenbreite

Wird für Programmlistings und für Programmelemente wie Namen von Variablen, Funktionen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter verwendet. Auch Befehle sowie Namen von Modulen und Paketen verwenden diese Notation.

Konstante Zeichenbreite, fett

Kennzeichnet Befehle oder anderen Text, den der Nutzer wörtlich eingeben sollte.

Konstante Zeichenbreite, kursiv

Kennzeichnet Text, den der Nutzer je nach Kontext durch entsprechende Werte ersetzen sollte.

image

Dieses Zeichen steht für einen Tipp oder eine Empfehlung.

image

Dieses Zeichen steht für einen allgemeinen Hinweis.

image

Dieses Piktogramm steht für eine Warnung oder erhöhte Aufmerksamkeit.

Verwenden von Codebeispielen

Zusätzliche Materialien (Codebeispiele, IPython Notebooks usw.) stehen unter https://github.com/amueller/introduction_to_ml_with_python zum Download bereit.

Dieses Buch ist dazu da, Ihnen bei Ihren Aufgaben zu helfen. Im Allgemeinen dürfen Sie die mit diesem Buch bereitgestellten Codebeispiele in Ihren Programmen und der dazugehörigen Dokumentation nutzen. Sie müssen uns dazu nicht um Erlaubnis fragen, es sei denn, Sie reproduzieren einen signifikanten Teil des Codes. Beispielsweise benötigen Sie keine Erlaubnis, um ein Programm zu schreiben, das mehrere Codeabschnitte aus diesem Buch enthält. Eine CD-ROM mit Beispielen aus Büchern von O’Reilly zu verkaufen oder zu verteilen, benötigt dagegen eine Erlaubnis. Eine Frage mit einem Zitat aus diesem Buch unter Angabe eines Code-beispiels zu beantworten, benötigt keine Erlaubnis. Einen wesentlichen Anteil der Codebeispiele aus diesem Buch in Ihr eigenes Buch zu integrieren, benötigt dagegen eine Erlaubnis.

Wir freuen uns über Zitate, verlangen diese aber nicht. Ein Zitat enthält Titel, Autor, Verlag und ISBN. Beispiel: »Einführung in Machine Learning mit Python von Andreas C. Müller and Sarah Guido, O’Reilly 2017, ISBN 978-3-96009-049-6.«

Wenn Sie glauben, dass Ihre Verwendung von Codebeispielen über gewöhnliche Nutzung hinausgeht oder außerhalb der oben vorgestellten Nutzungsbedingungen liegt, kontaktieren Sie uns bitte unter kommentar@oreilly.de.

Danksagungen

Von Andreas

Ohne die Hilfe und Unterstützung einer großen Gruppe von Menschen wäre dieses Buch nie entstanden.

Ich möchte den Lektoren Meghan Blanchette, Brian MacDonald und besonders Dawn Schanafelt dafür danken, dass sie Sarah und mir bei der Verwirklichung dieses Buches geholfen haben.

Ich möchte meinen Reviewern Thomas Caswell, Olivier Grisel, Stefan van der Walt und John Myles White danken, die sich die Zeit zum Lesen früher Versionen des Buches genommen und mir wertvolles Feedback gegeben haben – und außerdem zu den Eckpfeilern im wissenschaftlichen Open Source-Ökosystem gehören.

Ich bin der herzlichen wissenschaftlichen Open Source Python-Community auf ewig dankbar, besonders den Mitwirkenden an scikit-learn. Ohne die Unterstützung und Hilfe dieser Gemeinde, insbesondere von Gael Varoquaux, Alex Gramfort und Olivier Grisel, wäre ich niemals ein Kernentwickler von scikit-learn geworden oder hätte dieses Paket nie so durchgehend verstanden wie heute. Ich danke auch allen anderen Mitwirkenden, die ihre Zeit in die Verbesserung und Pflege dieses Pakets investieren.

Ich bin außerdem für die vielen Diskussionen mit zahlreichen meiner Kollegen dankbar, durch die ich die Herausforderungen beim maschinellen Lernen verstehen und Ideen für die Struktur eines Grundlagenbuches sammeln konnte. Unter den Leuten, mit denen ich mich über Machine Learning unterhalten habe, möchte ich Brian McFee, Daniela Huttenkoppen, Joel Nothman, Gilles Louppe, Hugo Bowne-Anderson, Sven Kreis, Alice Zheng, Kyunghyun Cho, Pablo Baberas und Dan Cervone besonders danken.

Ich danke auch Rachel Rakov, die eine unermüdliche Betatesterin und Korrekturleserin der frühen Versionen dieses Buches war und mir bei der Ausarbeitung auf vielerlei Weise geholfen hat.

Danken möchte ich meinen Eltern, Harald und Margot, und meiner Schwester Miriam für ihre anhaltende Unterstützung und Ermutigung. Ich möchte auch den vielen Menschen in meinem Leben danken, deren Liebe und Freundschaft mir die Kraft und den Beistand für dieses fordernde Unterfangen gaben.

Von Sarah

Ich möchte Meg Blanchette danken, ohne deren Hilfe und Beistand dieses Projekt nicht einmal existieren würde. Ich danke Celia La und Brian Carlson für das Lesen der frühen Entwürfe. Ich danke den Leuten von O’Reilly für ihre unendliche Geduld. Schließlich danke ich DTS für deine ewige und endlose Unterstützung.

KAPITEL 1

Einführung

Beim Machine Learning geht es darum, Wissen aus Daten zu extrahieren. Es handelt sich dabei um ein Forschungsfeld in der Schnittmenge von Statistik, künstlicher Intelligenz und Informatik und ist ebenfalls als prädiktive Analytik oder statistisches Lernen bekannt. Die Anwendung von Methoden maschinellen Lernens sind in den letzten Jahren Teil unseres Alltags geworden. Von automatischen Empfehlungen für Filme, Nahrungsmittel oder andere Produkte über personalisiertes Online-Radio bis zur Erkennung von Freunden in Ihren Fotos enthalten viele moderne Webseiten und Geräte als Herzstück Algorithmen für maschinelles Lernen. Wenn Sie sich eine komplexe Webseite wie Facebook, Amazon oder Netflix ansehen, ist es sehr wahrscheinlich, dass jeder Teil der Seite mehrere maschinelle Lernmodelle enthält.

Außerhalb kommerzieller Anwendungen hat Machine Learning einen immensen Einfluss auf die heutige Methodik datengetriebener Forschung gehabt. Die in diesem Buch vorgestellten Werkzeuge sind auf so unterschiedliche wissenschaftliche Fragestellungen angewandt worden wie das Verstehen von Sternen, das Finden weit entfernter Planeten, das Entdecken neuer Elementarteilchen, die Analyse von DNA-Sequenzen und die personalisierte Krebsbehandlung.

Um von maschinellem Lernen zu profitieren, muss Ihre Anwendung dabei gar nicht so gewaltig oder weltverändernd sein wie diese Beispiele. In diesem Kapitel werden wir erklären, warum Machine Learning so beliebt geworden ist, und werden erörtern, was für Fragestellungen damit beantwortet werden können. Anschließend werden wir Ihnen zeigen, wie Sie Ihr erstes Modell mithilfe von maschinellem Lernen bauen können, und dabei wichtige Begriffe vorstellen.

Warum Machine Learning?

In den ersten Tagen »intelligenter« Anwendungen verwendeten viele Systeme von Hand kodierte Regeln in Form von »if/else«-Entscheidungen, um Daten zu verarbeiten oder Benutzereingaben anzupassen. Stellen Sie sich einen Spam-Filter vor, dessen Aufgabe es ist, eingehende Nachrichten in den Spam-Ordner zu verschieben. Sie könnten eine schwarze Liste von Wörtern erstellen, die zum Einstufen einer E-Mail als Spam führen. Dies ist ein Beispiel für ein von Experten entwickeltes Regelsystem als »intelligente« Anwendung. Bei manchen Anwendungen ist das Festlegen von Regeln von Hand praktikabel, besonders wenn Menschen ein gutes Verständnis für den zu modellierenden Prozess besitzen. Allerdings hat das Verwenden von Hand erstellter Regeln zwei große Nachteile:

Ein Beispiel, bei dem der händische Ansatz fehlschlägt, ist das Erkennen von Gesichtern in Bildern. Heutzutage kann jedes Smartphone ein Gesicht in einem Bild erkennen. Allerdings war Gesichtserkennung bis 2001 ein ungelöstes Problem. Das Hauptproblem dabei war, dass ein Computer die Pixel (aus denen ein Computerbild besteht) im Vergleich zu Menschen auf sehr unterschiedliche Weise »wahrnimmt«. Diese unterschiedliche Repräsentation macht es einem Menschen praktisch unmöglich, ein gutes Regelwerk zu entwickeln, mit dem sich umschreiben lässt, was ein Gesicht in einem digitalen Bild ausmacht. Mit maschinellem Lernen ist es dagegen ausreichend, einem Programm eine große Sammlung von Bildern mit Gesichtern vorzulegen, um die Charakteristiken zum Erkennen von Gesichtern auszuarbeiten.

Welche Probleme kann Machine Learning lösen?

Die erfolgreichsten Arten maschineller Lernalgorithmen sind diejenigen, die den Entscheidungsprozess durch Verallgemeinerung aus bekannten Beispielen automatisieren. In diesem als überwachtes Lernen bekannten Szenario beliefert der Nutzer einen Algorithmus mit Paaren von Eingabewerten und erwünschten Ausgabewerten, und der Algorithmus findet heraus, wie sich die gewünschte Ausgabe erstellen lässt. Damit ist der Algorithmus ohne menschliche Hilfe in der Lage, aus zuvor unbekannten Eingaben eine Ausgabe zu berechnen. Bei unserem Beispiel der Spam-Klassifizierung würde der Nutzer dem Algorithmus eine große Anzahl E-Mails (die Eingaben) sowie die Angabe, welche dieser E-Mails Spam sind (die erwünschte Ausgabe), zur Verfügung stellen. Für eine neue E-Mail kann der Algorithmus dann vorhersagen, ob die neue E-Mail Spam ist.

Maschinelle Lernalgorithmen, die aus Eingabe-Ausgabe-Paaren lernen, bezeichnet man als überwachte Lernalgorithmen, weil ein »Lehrer« den Algorithmus in Form der erwünschten Ausgaben für jedes Lernbeispiel anleitet. Obwohl das Erstellen eines Datensatzes geeigneter Ein- und Ausgaben oft mühevolle Handarbeit bedeutet, sind überwachte Lernalgorithmen gut verständlich, und ihre Leistung ist leicht messbar. Wenn Ihre Anwendung sich als überwachte Lernaufgabe formulieren lässt und Sie einen Datensatz mit den gewünschten Ergebnissen erstellen können, lässt sich Ihre Fragestellung vermutlich durch Machine Learning beantworten.

Beispiele für überwachtes maschinelles Lernen sind:

Auf einem Briefumschlag die Postleitzahl aus handschriftlichen Ziffern zu erkennen

Hier besteht die Eingabe aus der eingescannten Handschrift, und die gewünschte Ausgabe sind die Ziffern der Postleitzahl. Um einen Datensatz zum Erstellen eines maschinellen Lernmodells zu erzeugen, müssen Sie zuerst viele Umschläge sammeln. Dann können Sie die Postleitzahlen selbst lesen und die Ziffern als gewünschtes Ergebnis abspeichern.

Anhand eines medizinischen Bildes entscheiden, ob ein Tumor gutartig ist

Hierbei ist die Eingabe das Bild, und die Ausgabe, ob der Tumor gutartig ist. Um einen Datensatz zum Erstellen eines Modells aufzubauen, benötigen Sie eine Datenbank mit medizinischen Bildern. Sie benötigen auch eine Expertenmeinung, es muss sich also ein Arzt sämtliche Bilder ansehen und entscheiden, welche Tumore gutartig sind und welche nicht. Es ist sogar möglich, dass zur Entscheidung, ob der Tumor im Bild krebsartig ist oder nicht, zusätzlich zum Bild weitere Diagnosen nötig sind.

Erkennen betrügerischer Aktivitäten bei Kreditkartentransaktinoen

Hierbei sind die Eingaben Aufzeichnungen von Kreditkartentransaktionen, und die Ausgabe ist, ob diese vermutlich betrügerisch sind oder nicht. Wenn Ihre Organisation Kreditkarten ausgibt, müssen Sie sämtliche Transaktionen aufzeichnen und ob ein Nutzer betrügerische Transaktionen meldet.

Bei diesen Beispielen sollte man hervorheben, dass das Sammeln der Daten bei diesen Aufgaben grundsätzlich unterschiedlich ist, auch wenn die Ein- und Ausgabedaten sehr klar wirken. Das Lesen von Umschlägen ist zwar mühevoll, aber auch unkompliziert. Medizinische Bilder und Diagnosen zu sammeln, erfordert dagegen nicht nur teure Geräte, sondern auch seltenes und teures Expertenwissen, von den ethischen und datenschutztechnischen Bedenken einmal abgesehen. Beim Erkennen von Kreditkartenbetrug ist das Sammeln der Daten deutlich einfacher. Ihre Kunden werden Sie mit den nötigen Ausgabedaten versorgen. Um die Ein-/Ausgabedaten für betrügerische und ehrliche Aktivitäten zu erhalten, müssen Sie nichts anderes tun, als zu warten.

Unüberwachte Algorithmen

sind eine weitere Art in diesem Buch behandelter Algorithmen. Beim unüberwachten Lernen sind nur die Eingabedaten bekannt, und dem Algorithmus werden keine bekannten Ausgabedaten zur Verfügung gestellt. Es sind viele erfolgreiche Anwendungen dieser Methoden bekannt, sie sind aber in der Regel schwieriger zu verstehen und auszuwerten.

Beispiele für unüberwachtes Lernen sind:

Themen in einer Serie von Blogeinträgen erkennen

Sie haben eine große Menge Textdaten und möchten diese zusammenfassen und die darin vorherrschenden Themen herausfinden. Wenn Sie nicht im Voraus wissen, welches diese Themen sind oder wie viele Themen es gibt, so gibt es keine bekannte Ausgabe.

Kunden in Gruppen mit ähnlichen Vorlieben einteilen

Mit einem Satz Kundendaten könnten Sie ähnliche Kunden erkennen und herausfinden, ob es Kundengruppen mit ähnlichen Vorlieben gibt. Bei einem Online-Geschäft könnten diese »Eltern«, »Bücherwürmer« oder »Spieler« sein. Weil diese Gruppen nicht im Voraus bekannt sind, oft nicht einmal deren Anzahl, haben Sie keine bekannte Ausgabe.

Erkennung außergewöhnlicher Zugriffsmuster auf eine Webseite

Um unrechtmäßige Nutzung oder Fehler zu erkennen, ist es oft hilfreich, Zugriffe zu finden, die sich von der Durchschnittsnutzung abheben. Jedes außergewöhnliche Muster kann sehr unterschiedlich sein, und Sie haben womöglich keinerlei Aufzeichnungen über abnorme Nutzung. Weil Sie in diesem Fall die Zugriffe einer Webseite beobachten und nicht wissen, was normale Nutzung ist und was nicht, handelt es sich hier um eine unüberwachte Fragestellung.

Sowohl bei überwachten als auch bei unüberwachten Lernaufgaben ist es wichtig, eine für den Computer verständliche Repräsentation Ihrer Eingabedaten zu haben. Oft hilft es, sich die Daten als Tabelle vorzustellen. Jeder zu untersuchende Datenpunkt (jede E-Mail, jeder Kunde, jede Transaktion) ist eine Zeile, und jede Eigenschaft, die diesen Datenpunkt beschreibt (z. B. das Alter eines Kunden oder die Menge oder der Ort der Transaktion), ist eine Spalte. Sie können Nutzer durch Alter, Geschlecht, das Datum der Registrierung und wie oft sie in Ihrem Online-Geschäft eingekauft haben, charakterisieren. Das Bild eines Tumors lässt sich durch die Graustufenwerte jedes Pixels beschreiben oder aber durch Größe, Gestalt und Farbe des Tumors.

Jede Entität oder Zeile bezeichnet man beim maschinellen Lernen als Datenpunkt(oder Probe), die Spalten – also die Eigenschaften, die diese Entitäten beschreiben werden – nennt man Merkmale.

Im weiteren Verlauf dieses Buches werden wir uns genauer mit dem Aufbau einer guten Datenrepräsentation beschäftigen, was man als Extrahieren von Merkmalenoder Merkmalsgenerierung bezeichnet. Sie sollten auf jeden Fall bedenken, dass kein maschinelles Lernverfahren ohne entsprechende Information zu Vorhersagen in der Lage ist. Wenn zum Beispiel das einzige bekannte Merkmal eines Patienten der Nachname ist, wird kein Algorithmus in der Lage sein, das Geschlecht vorherzusagen. Diese Information ist schlicht nicht in Ihren Daten enthalten. Wenn Sie ein weiteres Merkmal mit dem Vornamen des Patienten hinzufügen, haben Sie mehr Glück, da sich das Geschlecht häufig aus dem Vornamen vorhersagen lässt.

Ihre Aufgabe und Ihre Daten kennen

Der möglicherweise wichtigste Teil beim maschinellen Lernen ist, dass Sie Ihre Daten verstehen und wie diese mit der zu lösenden Aufgabe zusammenhängen. Es ist nicht sinnvoll, zufällig einen Algorithmus auszuwählen und Ihre Daten hineinzuwerfen. Bevor Sie ein Modell konstruieren können, ist es notwendig, zu verstehen, was in Ihrem Datensatz vorgeht. Jeder Algorithmus unterscheidet sich darin, bei welchen Daten und welchen Aufgabenstellungen er am besten funktioniert. Wenn Sie eine Aufgabe mit maschinellem Lernen bearbeiten, sollten Sie folgende Fragen beantworten oder zumindest im Hinterkopf behalten:

In einem breiteren Kontext sind die Algorithmen und Methoden für maschinelles Lernen nur Teil eines größeren Prozesses zum Lösen einer bestimmten Aufgabe. Es ist sinnvoll, das große Ganze stets im Blick zu behalten. Viele Leute investieren eine Menge Zeit in das Entwickeln eines komplexen maschinellen Lernsystems, nur um hinterher herauszufinden, dass sie das falsche Problem gelöst haben.

Wenn man sich eingehend mit den technischen Aspekten maschinellen Lernens beschäftigt (wie wir es in diesem Buch tun werden), ist es leicht, die endgültigen Ziele aus den Augen zu verlieren. Wir werden die hier gestellten Fragen nicht im Detail diskutieren, halten Sie aber dazu an, sämtliche explizit oder implizit getroffenen Annahmen beim Aufbau maschineller Lernmodelle zu berücksichtigen.

Warum Python?

Python ist für viele Anwendungen aus dem Bereich Data Science die lingua franca geworden. Python kombiniert die Ausdruckskraft allgemein nutzbarer Programmiersprachen mit der einfachen Benutzbarkeit einer domänenspezifischen Skriptsprache wie MATLAB oder R. Für Python gibt es Bibliotheken zum Laden von Daten, Visualisieren, Berechnen von Statistiken, Sprachverarbeitung, Bildverarbeitung usw. Dies gibt Data Scientists einen sehr umfangreichen Werkzeugkasten mit Funktionalität für allgemeine und besondere Einsatzgebiete. Einer der Hauptvorteile von Python ist die Möglichkeit, direkt mit dem Code zu interagieren, sei es in einer Konsole oder einer anderen Umgebung wie dem Jupyter Notebook, das wir uns in Kürze ansehen werden. Machine Learning und Datenanalyse sind von Grund auf iterative Prozesse, bei denen die Daten die Analyse bestimmen. Es ist entscheidend, diese Prozesse mit Werkzeugen zu unterstützen, die schnelle Iterationen und leichte Benutzbarkeit ermöglichen.

Als allgemein einsetzbare Programmiersprache lassen sich mit Python auch komplexe grafische Benutzeroberflächen (GUIs) und Webdienste entwickeln und in bestehende Systeme integrieren.

scikit-learn

scikit-learn ist ein Open Source-Projekt, Sie dürfen es also kostenlos verwenden und verbreiten. Jeder kommt leicht an die Quelltexte heran und kann sehen, was hinter den Kulissen passiert. Das scikit-learn-Projekt wird kontinuierlich weiterentwickelt und verbessert und besitzt eine große Nutzergemeinde. Es enthält eine Anzahl hochentwickelter maschineller Lernalgorithmen und eine umfangreiche Dokumentation (http://scikit-learn.org/stable/documentation) zu jedem Algorithmus. scikit-learn ist sehr beliebt, und die Nummer Eins der Python-Bibliotheken für Machine Learning. Es wird in Wirtschaft und Forschung eingesetzt, und im Netz existieren zahlreiche Tutorials und Codebeispiele. scikit-learn arbeitet eng mit einigen weiteren wissenschaftlichen Python-Werkzeugen zusammen, die wir im Verlauf dieses Kapitels kennenlernen werden.

Wir empfehlen, dass Sie beim Lesen dieses Buches auch den User Guide (http://scikit-learn.org/stable/user_guide.html) und die Dokumentation der API von scikit-learn lesen, um zusätzliche Details und weitere Optionen zu jedem Algorithmus kennenzulernen. Die Online-Dokumentation ist sehr ausführlich, und dieses Buch liefert Ihnen die Grundlagen in maschinellem Lernen, um es im Detail zu verstehen.

Installieren von scikit-learn

scikit-learn benötigt zwei weitere Python-Pakete, NumPy und SciPy. Zum Plotten und zur interaktiven Entwicklung sollten Sie außerdem matplotlib, IPython und Jupyter Notebook installieren. Wir empfehlen Ihnen, eine der folgenden Python-Distributionen zu verwenden, in denen die notwendigen Pakete bereits enthalten sind:

Anaconda (https://store.continuum.io/cshop/anaconda/)

Eine Python-Distribution für Datenverarbeitung in großem Stil, vorhersagende Analyse und wissenschaftliche Berechnungen. Anaconda enthält NumPy, SciPy, matplotlib, pandas, IPython, Jupyter Notebook und scikit-learn. Dies ist eine sehr bequeme Lösung unter Mac OS, Windows und Linux, und wir empfehlen sie Anwendern ohne bestehende Installation einer wissenschaftlichen Python-Umgebung. Anaconda enthält inzwischen auch eine kostenlose Ausgabe der Bibliothek Intel MKL. Das Verwenden von MKL (was bei Installation von Anaconda automatisch geschieht) führt zu deutlichen Geschwindigkeitsverbesserungen bei vielen der Algorithmen in scikit-learn.

Enthought Canopy (https://www.enthought.com/products/canopy/)

Eine weitere Python-Distribution für wissenschaftliches Arbeiten. Diese enthält NumPy, SciPy, matplotlib, pandas und IPython, aber in der kostenlosen Version ist scikit-learn nicht enthalten. Wenn Ihre Institution akademische Abschlüsse vergibt, können Sie eine akademische Lizenz beantragen und freien Zugang zu einem Abonnement von Enthought Canopy erhalten. Enthought Canopy ist für Python 2.7.x verfügbar und läuft auf Mac OS, Windows und Linux.

Python(x,y) (http://python-xy.github.io/)

Eine freie Python-Distribution für wissenschaftliches Arbeiten, insbesondere unter Windows. Python(x,y) enthält NumPy, SciPy, matplotlib, pandas, IPython und scikit-learn.

Wenn Sie bereits eine Python-Installation haben, können Sie die folgenden Pakete mit pip installieren:

$ pip install numpy scipy matplotlib ipython scikit-learn pandas

Grundlegende Bibliotheken und Werkzeuge

Es ist wichtig zu verstehen, was scikit-learn ist und wie es funktioniert. Es gibt jedoch einige weitere Bibliotheken, die Ihre Produktivität verbessern werden. scikit-learn basiert auf den Python-Bibliotheken NumPy und SciPy. Außer NumPy und SciPy werden wir auch pandas und matplotlib verwenden. Außerdem werden wir Jupyter Notebook, eine browsergestütze interaktive Programmierumgebung, kennenlernen. Kurz gesagt, sollten Sie etwas über folgende Hilfsmittel wissen, um das Beste aus scikit-learn herauszuholen.1

Jupyter Notebook

Das Jupyter Notebook ist eine interaktive Umgebung, um Code über den Browser auszuführen. Es ist ein großartiges Werkzeug zur erkundenden Datenanalyse und wird von Data Scientists in großem Stil eingesetzt. Obwohl das Jupyter Notebook viele Programmiersprachen unterstützt, benötigen wir nur die Python-Unterstützung. In einem Jupyter Notebook können Sie leicht Code, Texte und Bilder einbinden. Dieses gesamte Buch wurde als Jupyter Notebook geschrieben. Sie können sich sämtliche enthaltenen Codebeispiele von GitHub (https://github.com/amueller/introduction_to_ml_with_python) herunterladen.

NumPy

NumPy ist eines der grundlegenden Pakete für wissenschaftliche Berechnungen in Python. Es enthält die Funktionalität für mehrdimensionale Arrays, mathematische Funktionen wie lineare Algebra und Fourier-Transformationen sowie Generatoren für Pseudozufallszahlen.

In scikit-learn ist das NumPy-Array die fundamentale Datenstruktur. scikit-learn verarbeitet Daten in Form von NumPy-Arrays. Jegliche Daten, die Sie verwenden, müssen in ein NumPy-Array umgewandelt werden. Der wichtigste Bestandteil von NumPy ist die Klasse ndarray, ein mehrdimensionales (n-dimensionales) Array. Sämtliche Elemente eines Arrays müssen vom gleichen Typ sein. Ein NumPy-Array sieht folgendermaßen aus:

In[1]:

import numpy as np

x = np.array([[1, 2, 3], [4, 5, 6]])

print("x:\n{}".format(x))

Out[1]:

x:

[[1 2 3]

[4 5 6]]

Wir werden NumPy in diesem Buch sehr viel verwenden und die Objekte der Klasse ndarray als »NumPy-Arrays« oder einfach »Arrays« bezeichnen.

SciPy

SciPy ist eine Sammlung von Funktionen zum wissenschaftlichen Rechnen in Python. Sie enthält unter anderem Routinen für fortgeschrittene lineare Algebra, Optimierung mathematischer Funktionen, Signalverarbeitung, spezielle mathematische Funktionen und statistische Verteilungen. scikit-learn bedient sich aus dem Funktionspool in SciPy, um seine Algorithmen zu implementieren. Der für uns wichtigste Bestandteil von SciPy ist scipy.sparse: Dieser stellt dünn besetzte Matrizen zur Verfügung, eine weitere Datenrepräsentation in scikit-learn. Dünn besetzte Matrizen werden immer dann eingesetzt, wenn ein 2-D-Array zum größten Teil aus Nullen besteht:

In[2]:

from scipy import sparse

# Erstelle ein 2-D NumPy Array mit einer Diagonale aus Einsen und sonst Nullen

eye = np.eye(4)

print("NumPy Array:\n{}".format(eye))

Out[2]:

NumPy Array:

[[ 1. 0. 0. 0.]

[ 0. 1. 0. 0.]

[ 0. 0. 1. 0.]

[ 0. 0. 0. 1.]]

In[3]:

# Wandle das NumPy Array in eine SciPy sparse matrix im CSR-Format um

# Nur die Einträge ungleich null werden gespeichert

sparse_matrix = sparse.csr_matrix(eye)

print("\nSciPy sparse CSR matrix:\n{}".format(sparse_matrix))

Out[3]:

SciPy sparse CSR matrix:

(0, 0) 1.0

(1, 1) 1.0

(2, 2) 1.0

(3, 3) 1.0

Normalerweise ist es nicht möglich, eine dichte Repräsentation einer dünn besetzten Matrix zu erzeugen (sie würde nämlich nicht in den Speicher passen), daher müssen wir die dünn besetzte Matrix direkt erzeugen. Hier ist eine Möglichkeit, die gleiche sparse matrix wie oben im COO-Format zu erstellen:

In[4]:

data = np.ones(4)

row_indices = np.arange(4)

col_indices = np.arange(4)

eye_coo = sparse.coo_matrix((data, (row_indices, col_indices)))

print("COO-Repräsentation:\n{}".format(eye_coo))

Out[4]:

COO-Repräsentation:

(0, 0) 1.0

(1, 1) 1.0

(2, 2) 1.0

(3, 3) 1.0

Weitere Details zu dünn besetzten Matrizen in SciPy finden Sie in den SciPy Lecture Notes (http://www.scipy-lectures.org/).

matplotlib

matplotlib ist die wichtigste Python-Bibliothek zum wissenschaftlichen Plotten. Sie enthält Funktionen zum Erstellen von Diagrammen in Publikationsqualität, z. B. Liniendiagramme, Histogramme, Streudiagramme usw. Ihre Daten und unterschiedliche Aspekte Ihrer Daten zu visualisieren, liefert wichtige Erkenntnisse, und wir werden matplotlib für sämtliche Visualisierungsaufgaben einsetzen. Wenn Sie mit einem Jupyter Notebook arbeiten, können Sie Diagramme über die Befehle %matplotlib notebook und %matplotlib inline direkt im Browser darstellen. Wir empfehlen Ihnen %matplotlib notebook, wodurch Sie eine interaktive Umgebung erhalten (obwohl wir zur Produktion dieses Buches %matplotlib inline eingesetzt haben). Zum Beispiel erstellt der folgende Code das Diagramm in Abbildung 1-1:

In[5]:

%matplotlib inline

import matplotlib.pyplot as plt

# Erstelle eine Zahlenfolge von -10 bis 10 mit 100 Zwischenschritten

x = np.linspace(-10, 10, 100)

# Erstelle ein zweites Array mit einer Sinusfunktion

y = np.sin(x)

# Die Funktion plot zeichnet ein Liniendiagramm eines Arrays über dem anderen

plt.plot(x, y, marker="x")

image

Abbildung 1-1: Mit matplotlib erstelltes Liniendiagramm einer Sinusfunktion

pandas

pandas ist eine Python-Bibliothek zur Datenaufbereitung und Analyse. Sie ist um eine Datenstruktur namens DataFrame herum aufgebaut, die dem DataFrame in R nachempfunden ist. Einfach gesagt, ist ein pandas DataFrame eine Tabelle, einem Excel-Tabellenblatt nicht unähnlich. pandas enthält eine große Bandbreite an Methoden zum Modifizieren und Verarbeiten dieser Tabellen; insbesondere sind SQL-artige Suchanfragen und Verbindungsoperationen möglich. Im Gegensatz zu NumPy, bei dem sämtliche Einträge eines Arrays den gleichen Typ haben müssen, lässt pandas in jeder Spalte unterschiedliche Typen zu (z. B. Integer, Datum, Fließkommazahl oder String). Ein weiteres wertvolles Werkzeug in pandas sind Einleseprozeduren für eine große Anzahl Dateiformate und Datenbanken wie SQL, Excel-Dateien und kommaseparierte Dateien (CSV). Wir werden in diesem Buch die Funktionalität von pandas nicht im Detail besprechen. Allerdings gibt das Buch Datenanalyse mit Python von Wes McKinney (O’Reilly 2015, ISBN 978-3-96009-000-7) eine großartige Einführung. Hier ist ein kleines Beispiel für das Erstellen eines DataFrames über ein Dictionary:

In[6]:

import pandas as pd

# erstelle einen einfachen Datensatz mit Personen

data = {'Name': ["John", "Anna", "Peter", "Linda"],

'Location' : ["New York", "Paris", "Berlin", "London"],

'Age' : [24, 13, 53, 33]

}

data_pandas = pd.DataFrame(data)

# IPython.display erlaubt das "pretty printing" von Data Frames

# im Jupyter Notebook

display(data_pandas)

Dadurch erhalten wir folgende Ausgabe:

image

Es gibt mehrere Möglichkeiten, Anfragen an diese Tabelle zu senden. Beispielsweise:

In[7]:

# Wähle alle Zeilen mit einem Wert für age größer 30 aus

display(data_pandas[data_pandas.Age > 30])

Dadurch erhalten wir folgendes Ergebnis:

image

mglearn

Dieses Buch wird von Code begleitet, den Sie auf GitHub (https://github.com/amueller/introduction_to_ml_with_python) finden. Der begleitende Code enthält nicht nur sämtliche Beispiele aus diesem Buch, sondern auch die Bibliothek mglearn. Dies ist eine Bibliothek von Hilfsfunktionen, die wir für dieses Buch geschrieben haben, um die Codebeispiele nicht mit Details zum Plotten und Laden von Daten zu verunstalten. Bei Interesse können Sie die Details sämtlicher Funktionen im Repository nachschlagen, aber die Details des Moduls mglearn sind für das Material in diesem Buch nicht wirklich wichtig. Wenn Sie einen Aufruf von mglearn im Code sehen, ist es normalerweise eine Möglichkeit, schnell ein ansprechendes Bild zu erzeugen oder interessante Daten in die Finger zu bekommen.

image

Im Verlauf dieses Buches werden wir ständig NumPy, matplotlib und pandas einsetzen. Alle Codebeispiele setzen die folgenden import-Befehle voraus:

import numpy as np

import matplotlib.pyplot as plt

import pandas as pd

import mglearn

from IPython import display

 

Wir gehen außerdem davon aus, dass Sie den Code in einem Jupyter Notebook unter Verwendung der Funktionen %matplotlib notebook oder %matplotlib inline zum Darstellen von Diagrammen ausführen. Wenn Sie kein Notebook oder keinen dieser Befehle verwenden, müsssen Sie plt.show aufrufen, um die Diagramme zu sehen.

Python 2 versus Python 3

Es gibt zwei größere Versionen von Python, die im Moment weitverbreitet sind: Python 2 (genauer 2.7) und Python 3 (die gegenwärtig jüngste Version ist 3.5). Das sorgt bisweilen für Verwirrung. Python 2 wird nicht mehr weiterentwickelt, aber wegen tief greifender Änderungen in Python 3 läuft für Python 2 geschriebener Code meist nicht unter Python 3. Wenn Python für Sie neu ist oder Sie ein neues Projekt beginnen, empfehlen wir Ihnen wärmstens die neueste Version von Python 3. Wenn Sie von einer größeren Menge unter Python 2 geschriebenen Codes abhängig sind, sind Sie vorläufig von einem Upgrade entschuldigt. Sie sollten jedoch so bald wie möglich auf Python 3 umsteigen. Beim Schreiben neuer Programme ist es meist einfach, Code zu schreiben, der sowohl unter Python 2 als auch unter Python 3 läuft.2 Wenn Sie sich nicht auf bestehende Software stützen müssen, sollten Sie definitiv Python 3 verwenden. Sämtliche Codebeispiele in diesem Buch funktionieren mit beiden Versionen. Allerdings kann sich die genaue Ausgabe unter Python 2 stellenweise von der unter Python 3 unterscheiden.

In diesem Buch verwendete Versionen

Wir verwenden in diesem Buch die folgenden Versionen der oben erwähnten Bibliotheken:

In[8]:

import sys

print("Python Version: {}".format(sys.version))

import pandas as pd

print("pandas Version: {}".format(pd.__version__))

import matplotlib

print("matplotlib Version: {}".format(matplotlib.__version__))

import numpy as np

print("NumPy Version: {}".format(np.__version__))

import scipy as sp

print("SciPy Version: {}".format(sp.__version__))

import IPython

print("IPython Version: {}".format(IPython.__version__))

import sklearn

print("scikit-learn Version: {}".format(sklearn.__version__))

Out[8]: