April 2016

Band 31, Nummer 4

Dieser Artikel wurde maschinell übersetzt.

Big Data – Datenverarbeitung und Machine Learning in Spark

Durch Eugene Chuvyrov

Hier kommt eine Frage für Sie: Was den Namen des Frameworks ist, die aus dem Projekt Microsoft Dryad stark ausgeliehen wurde der beliebtesten open Source-Projekt 2015 und auch festlegen einen Datenverarbeitung-Datensatz, Sortieren von 100TB Daten in nur 23 Minuten? Die Antwort: Apache Spark.

In diesem Artikel erkläre ich die Geschwindigkeit und die Beliebtheit von Spark und warum er löscht die aktuelle Gewinner in der große Datenmengen verarbeiten und Analyse Leerzeichen ist. Mit Microsoft Azure-Abonnement, Stelle Beispiele für Probleme Machine learning (ML) mit Spark, ich die Welt der Daten Science einen kleinen Schritt von Softwareentwicklung Berücksichtigung. Bevor ich mit der Datenanalyse und ML beschäftigen, es ist jedoch wichtig, z. B. Einige Worte über verschiedene Komponenten des Spark-Frameworks und des Spark-Beziehung mit Azure.

Spark-Komponenten

Der Wert von Spark-Framework ist, dass es für die Verarbeitung von Big Data-Arbeitslasten in Clustern von herkömmlichen Computern ermöglicht. Spark-Kern ist die Engine, die Verarbeitung möglich, Verpacken Datenabfragen und nahtlos im Cluster verteilen kann. Neben dem Spark-Kern mehrere zusätzliche Komponenten für den Spark-Framework, und jede dieser Komponenten gilt für einen bestimmten Problembereich. Es ist möglich, dass Sie nie mit diesen Komponenten arbeiten, wenn Sie nur bearbeiten und die Berichterstattung zu große Datenmengen interessiert müssten. Allerdings in diesem Artikel verwende Spark MLLib ich zum Erstellen ein ML-Modell, mit denen Sie ziemlich genau werde "Raten", die Ziffern, die von hand (viel mehr dazu später) geschrieben wurden, haben. Andere Komponenten von Spark-Framework können für die Verarbeitung von Streamingdaten (Spark-Streaming) der Diagramme und die Berechnung des berühmten PageRank-Algorithmus (GraphX), und Ausführung von SQL-Abfragen über verteilte Daten (Spark-SQL).

Spark in Azure ausgeführt wird.

Stehen einige Optionen in Experimentieren mit Spark aus verwalteten databricks.com (dieses Unternehmen erstellt und weiterhin Spark verbessern) auf einen Docker-Container und bereits vorinstalliert Spark-Abbilder aus Docker-Hub für das gesamte Quell-Code-Repository von GitHub abrufen (github.com/apache/spark) und das Produkt selbst erstellen. Aber da in diesem Artikel über Azure ist, ich möchte eine Anleitung zum Erstellen von Spark-Clustern in Azure. Der Grund für den diese Option sehr interessant ist ist, da Azure bietet auf Unternehmensebene Garantien für Spark auf Azure bereitgestellt Compute-Cluster. Azure bietet eine SLA von 99,9 Prozent Microsoft-Backup für alle Spark-Cluster und bietet außerdem 24 x 7 Enterprise-Unterstützung und Cluster überwachen. Diese Garantien, gekoppelt mit der einfachen Bereitstellung des Clusters und eine Fülle von Ankündigungen Spark und Azure während der 2016 erstellen Konferenz stellen Microsoft-Cloud Sie eine ausgezeichnete Umgebung für Ihre Big Data.

Pixie übertroffen

Der geheime Schlüssel, der heute Spark zwischen Datenanalysten so beliebt macht es gibt zwei: Es ist schnell, und eine Freude Programm auf diesem Framework ist. Zunächst sehen wir uns macht Spark viel schneller als die Frameworks, die es vorausgegangen sind.

Spark des Vorgängers Hadoop MapReduce, war der leistungsfähigste des Big Data Analytics Speicherplatz seit Doug Ausschneiden und Mike Cafarella des Apache Hadoop-Projekts in 2005 gründete. MapReduce-Tools waren zuvor nur innerhalb der Google-Rechenzentren verfügbar und wurden vollständig geschlossen stammt. Hadoop eignete sich gut für die Batch-Analyse, die Verarbeitung auf dem Cluster ausgeführt, aber er brachte extreme starrheit. Map und Reduce-Vorgänge ergänzen; zuerst führen Sie die Map-Aufgaben, und reduzieren Sie Aufgabe. Komplexe Aufgaben musste Kombinieren mehrerer Zuordnung Schritte verringern. Darüber hinaus musste jede Aufgabe in einer Zuordnung, um Vorgänge zu reduzieren zerlegt werden. Die sehr lange gedauert, diese sequenziellen Vorgänge ausführen und Programm mühsam war. Anders gesagt war diese Echtzeitanalysen nicht.

Im Gegensatz dazu betrifft die Spark-Framework Intelligence Data Analytics Aufgaben zur hand. Er erstellt eine gesteuerte azyklische Diagramm (DAG) der Ausführung vor der Planung von Aufgaben, ähnlich wie einen Abfrageausführungsplan vor der Ausführung einer Daten abrufen oder Ändern von SQL Server erstellt. DAGs bieten Informationen über Transformationen, die für Daten ausgeführt werden müssen und Spark kann viele dieser Transformationen in einer einzelnen Phase auf intelligente Weise zu kombinieren und führen Sie dann die Transformationen auf einmal – eine Idee wurde ursprünglich von Microsoft Research im Projekt Dryad.

Darüber hinaus Spark kann Intelligent beibehalten der Daten im Arbeitsspeicher über die Konstrukte robusten verteilten Datasets (RDDs) aufgerufen, die ich später erläutern werde – und für DAGs. Diese gemeinsame Nutzung von Daten zwischen DAGs können Aufträge schneller werden ohne diese Optimierung abzuschließen. Abbildung 1 zeigt eine DAG für die "Hello World" des Datenspeicherplatzes Science – die Anzahl der Wörter in einer angegebenen Textdatei. Beachten Sie, wie mehrere Vorgänge, d. h. lesen, Textdatei, FlatMap und Zuordnung zu einer einzelnen Phase, ermöglicht die schnelle Ausführung kombiniert werden. Der folgende Code zeigt den tatsächlichen Scala-Code (da Spark in Scala geschrieben wird) die Anzahl der Wörter durchführen (selbst wenn Sie eine Codezeile Scala vor noch nie gesehen haben, ich bin bereit zu wetten, dass Sie sofort verstehen, wie die Anzahl der Wörter in Spark implementiert):

val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word,1))  
  .reduceByKey((a, b) => a + b)

Gerichtetes azyklisches Diagramm (DAG), das für Word Count
Abbildung 1 gerichtetes azyklisches Diagramm (DAG) für Word Count

Die zweite Spark so beliebt ist aufgrund seiner Programmiermodell. Implementieren die Anzahl der Wörter in Spark (Scala-Code) ist viel einfacher als das Zählen von Wörtern in Hadoop MapReduce implementieren. Neben Scala können Sie Spark erstellen Applications in Java und Python, das die Sprache ist, verwende ich in diesem Artikel. Spark vorher mit Hadoop MapReduce, Wissenschaftler/Programmierer, die Daten einer unnatürlichen Paradigma der untergliedern einer komplexen Aufgabe in einen Satz von Zuordnungen und Vorgänge zu reduzieren. Mit Spark ein funktionaler Programmieransatz vertraut .NET Entwickler arbeiten mit LINQ und Lambda-Funktionen verwendet, um transformieren und Analysieren von Daten.

Kurz, sehen wie einfache, aber leistungsstarke, die Spark Sie Programmiermodell ist. Aber noch großartig funktionalen Code zu schreiben, die gleichermaßen funktionieren gut in kleinen und großen Datasets müssen Sie einen verteilten Cluster von Computern erstellen, die die erforderlichen Komponenten von Spark installiert und einsatzbereit Programmieraufgaben übernehmen, Sie zu senden. Die Erstellung eines Spark-Clusters würde absolut schwierige, mussten Sie erstellen und konfigurieren Sie den Cluster selbst sein. Glücklicherweise können Microsoft-Cloud-Bereitstellung in nur wenigen Mausklicks zu erreichen. Im nächsten Abschnitt zeige ich Ihnen einfach, wie das geht.

Bereitstellen eines Spark-Clusters

Jetzt erstellen wir einen HDInsight-Cluster in Azure. Sind mehrere Typen von "HDInsight" ein Sammelbegriff, der Hadoop und Spark-Technologien enthält. Spark HDInsight und Hadoop HDInsight sind zwei Beispiele für verwaltete Big Data Services in Azure.

Um einen Spark-Cluster bereitstellen möchten, melden Sie sich bei Azure-Portal (portal.azure.com), und klicken Sie auf neu | Daten und Analysen | HDInsight | Erstellen. Füllen Sie die HDInsight-Cluster-Eigenschaften, die Angabe, Clustertyp = Spark, Cluster-Betriebssystem als Linux (da Spark unter Linux entwickelt wird) und das Versionsfeld unverändert lassen, siehe Abbildung 2. Führen Sie die restlichen erforderlichen Informationen ein, einschließlich der Angabe der Anmeldeinformationen für die Anmeldung bei den Namen der Konto-Container-Cluster und Speicher. Drücken Sie dann die Schaltfläche erstellen. Die Erstellung eines Clusters dauert 15 bis 30 Minuten.

Erstellen einen Spark-Cluster in Azure
Abbildung 2: Erstellen eines Spark-Clusters in Azure

Nach Abschluss der Erstellung müssen Sie eine Kachel im Azure-Portal, das den neu erstellten HDInsight-Cluster darstellt. Schließlich erhalten Sie tauchen Sie tief in Code! Bevor Sie in Code abrufen, Drosselungsprozess Programmierumgebung und Sprachen, die Sie mit Spark zur Verfügung stehen.

Es gibt mehrere Arten der Programmierung in der Spark-Umgebung. Zunächst Sie Spark-Shell über zugreifen können, intuitiv genug ist, den Spark-Shell-Befehl erläutert am bit.ly/1ON5Vy4, nach dem Herstellen einer SSH-Sitzungs mit dem Spark-Cluster-Head-Knoten, können Sie Scala-Programme in einer REPL-ähnlichen Weise schreiben und Programmierung erstellt nacheinander senden (keine Sorge, wenn dieser Satz anhört, in einer fremden Sprache geschrieben wurde, nur fahren Sie direkt mit Option 3). Zweitens können Sie vollständige Scala-Anwendung auf Spark ausführen (senden sie über den Befehl erläutert am Spark-submit bit.ly/1fqgZHY). Es gibt auch eine Option von Jupyter Notebooks (jupyter.org) auf Spark. Wenn Sie mit dem Projekt Jupyter vertraut sind, bieten Jupyter Notebooks eine visuelle, webbasierte interaktive Umgebung in der Data Analytics Skripts ausgeführt. Diese Notebooks sind meine bevorzugte Methode für die Datenanalyse, und ich bin davon überzeugt, dass, sobald Sie sie versuchen, müssen sie Ihre bevorzugte Methode für die Programmierung auf Spark, zu werden. Azure HDInsight installiert die Jupyter Notebook-Umgebung unter Berücksichtigung des Clusters für Sie die Verwendung zu erleichtern.

Klicken Sie zum Öffnen von Jupyter Notebooks auf die Kachel, Cluster-Dashboards wie dargestellt in Abbildung 3, klicken Sie auf die Kachel Jupyter Notebook ausziehbaren im Fenster. Melden Sie sich mit den Anmeldeinformationen, die Sie während der Erstellung des Clusters angegeben, und die Jupyter Umgebung bereit, zu akzeptieren, neue oder alte Notebooks bearbeiten wird angezeigt. Jetzt klicken Sie auf die Schaltfläche "Neu", in der oberen rechten Ecke, und wählen Sie Python-2. Warum Python 2? Da Spark selbst ist in Scala geschrieben, und viele Spark Programmierung erfolgt in Scala, auch eine Python-Bridge über Pyspark verfügbar ist. Es ist übrigens eine raging Debatte, ob Sie in Scala oder Python code sollte. Jede Sprache verfügt über dessen klare Vorteile, mit Scala, möglicherweise schneller, während Python vielleicht ist ausdrucksvoller und die am häufigsten verwendeten Sprache für Data Science (finden Sie unter bit.ly/1WTSemP). So können Sie eine ausdrucksbasierte noch präzisen Python zu verwenden, bei der Programmierung zusätzlich zu den Spark-Cluster. Python ist auch meine bevorzugte Sprache für die Datenanalyse (zusammen mit R), und ich kann alle die leistungsfähigeren Python-Bibliotheken, denen früher bin nutzen.

Zugreifen auf Jupyter Notebooks in Azure HDInsight über Clusterdashboards
Abbildung 3 Jupyter Notebooks in Azure HDInsight über Clusterdashboards zugreifen

Sie sind endlich bereit, tief Eintauchen und Aufgaben ML und Data Analytics innerhalb der Jupyter Notebooks.

Maschinelles Lernen mit Spark

Um in Spark ML zu illustrieren, verwende ich ein Beispiel für "kleinere" Daten in Form eines klassischen Probleme in ML – Erkennung von handschriftlichen Ziffern, z. B. diejenigen, die in Postleitzahlen auf Umschläge angezeigt werden. Obwohl dieses Dataset nicht mittels groß ist, wird der Vorteil dieser Lösung die Tausend - Aufteilung die Daten erhöht werden sollen, können Sie weitere Computer mit dem Cluster hinzufügen und weiterhin die Datenanalyse in einem angemessenen Zeitraum abgeschlossen. Wird keine Änderung an der hier dargestellte Code notwendig – die Spark-Framework übernimmt der Verteilung der Arbeitslast auf einzelne Computer im Cluster. Die Datendatei, die Sie verwenden, ist auch eine klassische – es wird häufig als MNIST-Dataset bezeichnet – und enthält 50.000 handschriftliche Ziffern, die für die Analyse bereit. Es gibt, zwar viele Orte online MNIST Dataset abgerufen die Kaggle-Website bietet Ihnen bequemen Zugriff auf diese Daten (finden Sie unter bit.ly/1QJN20c).

Nur als Randbemerkung:, wenn Sie mit nicht vertraut kaggle.com, ML Wettbewerbe von online, wobei nahezu 500.000 Datenanalysten aus aller Welt konkurrieren finanzielle Gewinne oder die Möglichkeit, eines der führenden Unternehmen ML interview hostet. Ich habe in fünf Kaggle Wettbewerbe abgeschlossen, und wenn Sie einen Wettbewerb Person sind, ist eine äußerst süchtig Erfahrung. Und den Standort der Kaggle selbst wird in Azure ausgeführt!

Werfen Sie einen Moment, bis Sie den Inhalt der train.csv zu verstehen. Jede Zeile der Datei stellt eine x-Pixel-Darstellung eines Bilds mit handschriftlichen Ziffer, z. B. die 28 x 28 Abbildung 4 (die Abbildung zeigt eine vergrößerte Darstellung). Die erste Spalte enthält, was wirklich die Ziffer ist. die übrigen Spalten enthalten Pixel Intensitäten, von 0 bis 255, der alle 784 Pixel (28 x 28).

Beispiel für die Ziffer "7" dargestellt, die im Dataset MNIST vergrößert
Abbildung 4 vergrößert die Ziffer "7" dargestellt, die im Dataset MNIST-Beispiel

Die neuen Jupyter Notebooks öffnen Sie, und fügen Sie den folgenden Code in die erste Zelle:

from pyspark import SparkContext
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.tree import RandomForest
import time
sc = SparkContext(appName="MNISTDigitsDT")
#TODO: provide your own path to the train.csv in the line(s) below, 
# you can use Azure Storage 
#Explorer to upload files into the cloud and to read their full path
fileNameTrain = 'wasb://datasets@chuvyrov.blob.core.windows.net/trainingsample.csv'
fileNameTest = 'wasb://datasets@chuvyrov.blob.core.windows.net/validationsample.csv'
mnist_train = sc.textFile(fileNameTrain)
mnist_test = sc.textFile(fileNameTest)

Dieser Code die erforderlichen Bibliotheken dafür in Spark ML importiert, und gibt den Speicherort der Datendateien, die zum Trainieren und Testen des Modells verwendet werden sollen (Beachten Sie, dass diese Dateien enthalten, in Ihrem Speicherkonto über Spark in Microsoft-Cloud über die Wasb sein soll: / / reference). Die letzten beiden Zeilen ist, in dem die RDD aus den Textdateien erstellt werden. RDDs das Geheimnis von Spark sind – sie verteilt sind Datenstrukturen, aber die Komplexität ihrer Implementierung ist im Allgemeinen die Programmierer/Benutzer verborgen. Darüber hinaus wird diese RDDs verzögert ausgewertet werden und werden beibehalten, damit für den Fall, dass es erforderlich, RDD erneut verwenden, ohne erneute-computation Abruf sofort verfügbar ist. Wenn Sie RDDs ändern, wird die Generierung von DAGs und die Ausführung von bereitgestellten Tasks im Spark-Cluster wie zuvor bei berührt.

Drücken Sie Umschalt + Eingabe in die Zelle Jupyter, um den Code auszuführen, den Sie eingefügt haben. Keine Nachrichten sollte die gute Nachricht (Wenn Sie eine Fehlermeldung erhalten haben, Sie sind gute), und Sie verfügen jetzt über RDDs, die Sie für die Abfrage und Bearbeitung zur Verfügung stehen. Diese RDDs enthalten Textzeilen durch Trennzeichen getrennte im Moment, da ist wie Ihre MNIST Daten über geliefert wurde.

Als Nächstes soll man ist eine einfache Funktion definieren, die helfen Ihnen, diese Textzeilen in ein benutzerdefiniertes LabeledPoint-Objekt zu konvertieren. Dieses Objekt ist erforderlich, damit der ML-Algorithmus, den Sie beim Trainieren und Vorhersagen verwenden. Kurz gesagt, dieses Objekt enthält eine Reihe von "Features" (manchmal ist es einfacher, als Spalten in einer Datenbanktabelle Features vorstellen) oder Eigenschaften über einen einzelnen Datenpunkt, sowie die "Label", oder der Wert Sie erfahren, wie vorhersagen möchten. Das jetzt etwas unklar vorkommt, hilfreich vielleicht Blick auf die MNIST-train.csv-Dateien sein. Sie werden bemerken, dass jede Zeile in der train.csv eine Zahl in der ersten Spalte und einer Reihe von Zahlen, von 0 bis 255, in alle anderen Spalten hat. Die erste Spalte heißt "Label", da wir versuchen, um zu erfahren, wie diese Zahl Vorhersagen. Alle anderen Spalten sind "Funktionen" und die Funktionen, die alle zusammen werden ausgeführt als ein "Feature"Vektor. Diese Features sind die Intensität der einzelnen digitalisierte Pixel in der Abbildung der Ziffer, 0 Schwarz und 255 weiß, mit vielen Werten zwischen. Die Bilder sind alle 28 Pixel hoch und 28 Pixel breit, 784 Spalten mit Pixel Intensitäten in der Datei train.csv (28 x 28 = 784) vornehmen.

Kopieren Sie die folgende Funktion in die neue Zelle Ihres Jupyter Notebooks:

def parsePoint(line):
  #Parse a line of text into an MLlib LabeledPoint object
  values = line.split(',')
  values = [0 if e == '' else int(e) for e in values]
  return LabeledPoint(int(values[0]), values[1:])

Drücken Sie UMSCHALT + EINGABETASTE, um den Code auszuführen. Sie haben jetzt die ParsePoint-Funktion von Spark ausgewertet wurde definiert, und es steht Ihnen für das Dataset verwenden, die Sie gerade gelesen haben, in. Diese Funktion wird in einer einzelnen Zeile von durch Trennzeichen getrennten Text, teilt sie in einzelne Werte und konvertiert diese Werte in das LabeledPoint-Objekt.

Als Nächstes führen Sie einige grundlegenden Daten, die Bereinigung durch, um den lernalgorithmus vorzubereiten; der Learning-Algorithmus ist leider noch intelligent genug zu erkennen, welcher Teil der Daten predictive Wert hat. Also, überspringen Sie den Dateiheader train.csv mithilfe einer Hack entlehnt stackoverflow.com; drucken Sie dann, die erste Zeile der resultierenden RDD, um sicherzustellen, dass die im erwarteten Zustand ist:

#skip header
header = mnist_train.first() #extract header
mnist_train = mnist_train.filter(lambda x:x !=header) 
#filter out header using a lambda
print mnist_train.first()

Jetzt können Sie eine funktionale Programmierung mit dem .map(parsepoint)-Operator im nächsten Abschnitt der RDD in das Format bereit für ML-Algorithmen in Spark transformieren anwenden. Diese Transformation wird im Wesentlichen analysiert jede Zeile in der Mnist_train RDD und konvertieren, RDD ein Satz von LabeledPoint-Objekten.

RDDs und Interaktivität: Hauptsäulen von Spark Leistung

Es gibt mehrere wichtige Aspekte. Zuerst, Sie arbeiten mit einer Datenstruktur, die auf den Cluster von Computern (die RDD) verteilt, aber die Komplexität der verteilten Datenverarbeitung nahezu vollständig vor Ihnen verborgen bleiben. Sie sind funktionale Transformationen anwenden, um die RDD und Spark optimiert die Verarbeitung und die Schwerarbeit über den Cluster verfügbaren Computer hinter den Kulissen für Sie:

labeledPoints = mnist_train.map(parsePoint)
#Split the data into training and test sets (30% held out for testing)
(trainingData, testData) = labeledPoints.randomSplit([0.7, 0.3])
print mnist_train.first()

Auch die letzte Zeile (mit der print-Anweisung) einfach scheint, ist äußerst leistungsstark und praktisch abwesend war die Möglichkeit, große Datasets interaktiv Abfragen aus der Welt von großen Datasets vor Spark. In Ihrer Data Science und große Data Manipulation Projekte werden sie ein sehr nützliches Verfahren, um sicherzustellen, dass die Transformationen, die Ihrer Meinung angewendet werden tatsächlich angewendet werden. Diese leistungsfähige, interaktive Verarbeitung ist noch ein weiterer Vorteil von Spark über andere Frameworks Verarbeitung großer Datenmengen.

Außerdem Beachten Sie die Aufteilung der Daten in die Schulung und Testen Sie Dataset mithilfe der RandomSplit-Funktion zu. Die Idee, es ist ein mit den Daten in TrainingData RDD ML-Modell erstellen und Testen des Modells mit den Daten in die TESTDATA, RDD, als Sie im Code in Kürze sehen.

Sie nun können einen ML-Algorithmus zum verteilten Dataset anwenden, Sie haben gerade (Mnist_train) erstellt. Als Kurzübersicht Beachten Sie, dass in ML-Probleme fast in allen Fällen gibt es zwei unterschiedliche Sätze von Schritten: Erstens Trainieren Sie das Modell mit den bekannten Dataset bekannten Ergebnissen; Zweitens machen Sie vorhersagen auf Grundlage des Modells, die Sie erstellt oder vertraut sind, klicken Sie im ersten Schritt. Im folgenden Code, einen RandomForest-Algorithmus in Spark Machine Learning Framework (Spark MLLib) zum Trainieren des Modells verwendet wird. RandomForest ist eine von mehreren verteilten Algorithmen, die in Spark MLLib, und es ist eines der leistungsstärksten. Fügen Sie den folgenden Inhalt in die neue Zelle ein:

depthLevel = 4
treeLevel = 3
#start timer
start_time = time.time()
#this is building a model using the Random Forest algorithm from Spark MLLib
model = RandomForest.trainClassifier(trainingData, numClasses=10, 
  categoricalFeaturesInfo={},
  numTrees=treeLevel, featureSubsetStrategy="auto",
  impurity='gini', maxDepth=depthLevel, maxBins=32) 
print("Training time --- %s seconds ---" % (time.time() - start_time))

Beachten Sie, wie dieser Code gestartet wird, um die Ausführungszeit der Algorithmen zu messen, und legt dann Anfangswerte für einige der Parameter durch den Algorithmus RandomForest erwartet nämlich MaxDepth und NumTrees aus. Führen Sie diesen Code durch Drücken von UMSCHALT + Eingabe. Sie vielleicht, was diese RandomForest ist und wie funktioniert es? RandomForest ist ein ML-Algorithmus, die auf einer sehr hohen Ebene funktioniert durch das Erstellen von vielen Entscheidungsstrukturen für die Daten durch eine Variable, die eine Entscheidungsstruktur auf Teilen nach dem Zufallsprinzip auswählen (d. h. eine Struktur kann einfach sein, als "in der unteren rechten Ecke der Pixel weiß, es ist wahrscheinlich Nr. 2") und anschließend die endgültige Entscheidung nach dem Abruf aller Strukturen erstellt. Glücklicherweise existiert bereits eine verteilte Version des Algorithmus auf Spark verfügbar. Allerdings verhindert, dass nichts Sie Ihre eigenen Algorithmus schreiben, sollten Sie sich entscheiden sollen; verteilte k-nächste Nachbarn ("knn")-Algorithmus ist jedoch noch in der Spark-Framework vorhanden.

Zurück zur MNIST Ziffern Anerkennung Aufgabe. Wenn Sie eine ähnliche erschließen Umgebung verfügen, sollten Sie die Ausführungszeit des Trainings für des Algorithmus des ungefähr 21 Sekunden erhalten. Dies bedeutet, dass in 21 Sekunden haben Sie gelernt haben, mit dem Algorithmus RandomForest – ein Modell, das Sie verwenden können, die Ziffern Vorhersagen sehen, erhalten die Funktionen, die Sie analysiert haben. Nun sind Sie bereit für den wichtigsten Teil der ML-Task – Erstellen von Vorhersagen auf Grundlage des Modells, die Sie erstellt haben. Darüber hinaus jetzt auch die Genauigkeit dieser Vorhersagen bewerten Siehe Abbildung 5.

Abbildung 5 Auswerten der Genauigkeit der Vorhersagen

# Evaluate model on test instances and compute test error
1 #start timer
2 start_time = time.time()
3 #make predictions using the Machine Learning created prior
4 predictions = model.predict(testData.map(lambda x: x.features))
5 #validate predictions using the training set
6 labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions)
7 testErr = labelsAndPredictions.filter(lambda (v, p): v != p).count() /
8   float(testData.count())
9 print('Test Error = ' + str(testErr))
10 print("Prediction time --- %s seconds ---" % (time.time() - start_time))
11 #print('Learned classification tree model:')
12 #print(model.toDebugString())

Beachten Sie das Konstrukt model.predict in Zeile 4 des Abbildung 5. Dies ist die Zeile, mit der die tatsächlichen Vorhersage auf Grundlage des Modells, das Sie zuvor erstellt haben. In den Zeilen nach dem Erstellen die Vorhersage (Zeilen 5-7), Sie verwenden einige grundlegende Datenmanipulation Strategien zur temporären beziehen, über die Zip-Funktion – die vorhergesagten Werte auf die tatsächlichen Werte, die als Teil des Downloads zur Verfügung. Klicken Sie dann einfach berechnen den Prozentsatz der richtigen Vorhersagen, die diese Daten und Drucken die Ausführungszeit.

Das Ergebnis dieser anfänglichen Klassifizierung mit dem Fehler wird so hoch ist etwas irritierend (d. h. funktioniert Ihre Modell überhaupt mit Fehlerraten annähert 43 Prozent?). Sie können das Modell mit dem Konzept der "Raster Hyperparameter Suche", versuchen Sie eine Reihe von Werten beim Aufbau des Modells testen, die sie sofort und schließlich konvergieren, auf die Hyperparameter-Werte, mit denen Sie die beste Leistung insgesamt verbessern. Das heißt, versuchen Sie eine Reihe von systematischen Experimente, um zu bestimmen, welche Parameter für die beste Vorhersage-Wert.

Die hyperparameter, die Sie anwenden werde Raster Suche werden NumTrees und MaxDepth; Fügen Sie den Code in Abbildung 6 in die neue Zelle im Notebook.

Abbildung 6 Iterative "Raster-Suche" für eine optimale Parameter in der RandomForest-Algorithmus in Spark

1 bestModel = None
2 bestTestErr = 100
3 #Define a range of hyperparameters to try
4 maxDepths = range(4,10)
5 maxTrees = range(3,10)
6
7 #Loop over parameters for depth and tree level(s)
8 for depthLevel in maxDepths:
9 for treeLevel in maxTrees:
10       
11   #start timer
12   start_time = time.time()
13   #Train RandomForest machine learning classifier
14   model = RandomForest.trainClassifier(trainingData,
15     numClasses=10, categoricalFeaturesInfo={},
16     numTrees=treeLevel, featureSubsetStrategy="auto",
17     impurity='gini', maxDepth=depthLevel, maxBins=32)       
18              
19   #Make predictions using the model created above
20   predictions = model.predict(testData.map(lambda x: x.features))
21   #Join predictions with actual values from the data and determine the error rate
22   labelsAndPredictions = testData.map(lambda lp: lp.label).zip(predictions)
23   testErr = labelsAndPredictions.filter(lambda (v, p): v != p)
24     .count() / float(testData.count())
25       
26   #Print information about the model as we proceed with each iteration of the loop
27   print ('\maxDepth = {0:.1f}, trees = {1:.1f}: trainErr = {2:.5f}'
28          .format(depthLevel, treeLevel, testErr))
29   print("Prediction time --- %s seconds ---" % (time.time() - start_time))
30   if (testErr < bestTestErr):
31       bestModel = model
32       bestTestErr = testErr
33           
34 print ('Best Test Error: = {0:.3f}\n'.format(bestTestErr))

Beachten Sie, wie in Zeilen 8-14 Sie einen Satz von NumTrees-Parameter für die random Forest-Algorithmus von 3 bis 10, Scannen, Erstellen von Modellen und deren Leistung zu bewerten. Als Nächstes in den Zeilen 30-32, Sie erfassen Sie das Modell aus, wenn sie bessere Ergebnisse als die vorherige Modelle erhalten, die Sie versucht haben, oder schließen andernfalls das Modell. Geben Sie diese Schleife eine Weile ausgeführt; am Ende der Ausführung sollte nicht größer als 10 Prozent Vorhersage-Fehlerwerte angezeigt werden.

Nachbereitung

Als ich diesen Artikel geschrieben, war mein Hauptziel anzuzeigenden anhand von Beispielen, wie einfach es ist, Programmieren mit Spark, insbesondere wenn Sie ein Fan der funktionalen Programmierung und Azure sind. Mein sekundäre Ziel war, die veranschaulichen, wie Sie für Datasets, großen und kleinen mit Hilfe der Bibliothek Spark MLLib ML Aufgaben ausführen können. Nebenbei wollte ich erklären, warum Spark schneller auf verteilte Daten als die Vorgängerversionen führt und Freigeben von Bits von faszinierende des wie wir, wo wir heute im Bereich Analytics verteilte Daten sind eingetroffen.

Microsoft ist stark investieren, in der Zukunft großer Datenmengen, ML, Analysen und insbesondere Spark. Dies ist der richtige Zeitpunkt, um zu erfahren, diese Technologien tatsächlich die Chancen für eine extrem hohe Skalierbarkeit Compute und Big Data-Analyse von Microsoft-Cloud bereitgestellt werden. Azure macht erste übergeht mit Spark schnell, einfach und bereit zur Skala bis zu großen Datasets, alle gesicherten von Garantien auf Dienstebene, die Sie nur über die beste Enterprise Cloud-Dienstanbieter erwarten können.

Nun, dass Sie ein ML-Modell erstellt und Vorhersagen auf bekannten Daten vorgenommen haben, können Sie auch die Daten Vorhersagen, die die Bezeichnung "true" umfasst; d. h. auf die Datei test.csv aus Kaggle.com. Sie können dann eine Übermittlung an, Kaggle.com als Teil der Ziffer Erkennung Wettbewerb auf dieser Plattform. Alle der Code für diesen Artikel als auch den Code zum Schreiben einer Datei Übermittlung finden Sie unter GitHub.com/echuvyrov/SparkOnAzure. Ich würde gerne erfahren Sie mehr über die Ergebnisse, die Sie erhalten. Eine e-Mail mit Fragen, Kommentare, Vorschläge und ML Erfolge auf eugene.chuvyrov@microsoft.com.


Eugene Chuvyrovist ein Cloud-Lösungsarchitekt bei Microsoft im Technical Evangelism and Development-Team, wo er Unternehmen, um den Bereich San Francisco Bay hilft, nutzen hyper Skala verfügbaren Microsoft-Cloud. Obwohl er derzeit auf Partner für umfangreiche Daten konzentriert, wird er noch nicht seine Stämme als Softwareentwickler vergessen und profitiert von Cloud-gerechten Programmieren in c#, JavaScript und Python. Ihm auf Twitter folgen: @EugeneChuvyrov.

Vielen Dank an den folgenden technischen Experten von Microsoft für die Überprüfung dieses Artikels: Bruno Terkaly
Bruno Terkaly ist ein leitender Software Engineer bei Microsoft mit dem Ziel der Entwicklung von branchenweit führenden Anwendungen und Diensten für Geräte aktivieren. Er ist unter Technologiegesichtspunkten für die wichtigsten Cloud-basierten und mobilen Geschäftsmodelle in den gesamten USA und darüber hinaus zuständig. Er hilft Partnern, die Marktreife ihrer Anwendungen zu erreichen, indem er bei der Beurteilung, Entwicklung und Bereitstellung von ISVs architektonische Führung und sein tief greifendes technisches Engagement aufbietet. Terkaly arbeitet außerdem eng mit der Cloud und Mobil, Feedback und entwicklergruppen.