Aprile 2016

Volume 31 Numero 4

Il presente articolo è stato tradotto automaticamente.

Big Data - Elaborazione dei dati e Machine Learning in Spark

Da Eugene Chuvyrov

Ecco una domanda è: Qual è il nome di framework preso in prestito frequentemente dal progetto Dryad Microsoft, è diventato il progetto open source più diffuso di 2015 e anche impostare un record di elaborazione dei dati, ordinamento 100TB di dati in soli 23 minuti? Ovviamente Apache Spark.

In questo articolo, parlerò la velocità e la popolarità di Spark e perché è il vincitore deselezionare corrente di Big Data di elaborazione e spazio di analisi. Usando la sottoscrizione di Microsoft Azure, illustrerò alcuni esempi di risoluzione dei problemi di machine learning (ML) con Spark, passo piccole dalla progettazione del software nell'ambiente di analisi scientifica dei dati. Ma prima di addentrarci subito nell'analisi dei dati e ML, è importante pronunciare alcune parole sui vari componenti del framework Spark e sulla relazione Spark con Azure.

Componenti di Spark

Il valore di framework Spark è che consente l'elaborazione dei carichi di lavoro di Big Data nei cluster di computer apposito. Spark Core è il motore che rende l'elaborazione possibili, le query di data di creazione di pacchetti e distribuirli facilmente all'interno del cluster. Oltre a Spark Core, sono presenti diversi componenti aggiuntivi per il framework di Spark e ognuno di questi componenti è applicabile a un dominio specifico problema. È possibile che non occorre utilizzare uno qualsiasi di tali componenti se si è interessati solo la modifica e il reporting sui carichi di lavoro di dati di grandi dimensioni. Tuttavia, in questo articolo, utilizzerò MLLib Spark per creare un modello ML che verrà consentono piuttosto accuratamente "indovinare" le cifre che sono stato scritto a mano (più avanti in questo articolo). Altri componenti del framework Spark consentono per l'elaborazione del flusso di dati (Streaming Spark), la modifica di grafici e il calcolo dell'algoritmo PageRank famoso (GraphX) e l'esecuzione di query SQL su dati distribuiti (Spark SQL).

Esecuzione di Spark in Azure

Sono disponibili alcune opzioni in sperimentare Spark, dall'utilizzo di servizi gestiti da databricks.com (società creato e continua a migliorare Spark), per il provisioning di un contenitore Docker e cattura preinstallate Spark immagini Docker Hub, per ottenere il repository di codice di origine da GitHub (github.com/apache/spark) e creare manualmente il prodotto. Tuttavia, poiché in questo articolo è su Azure, vorrei viene illustrato come creare i cluster Spark in Azure. Questa opzione è estremamente interessante, infatti poiché Azure non fornisce garanzie a livello aziendale per Spark distribuita in Azure compute cluster. Azure offre un contratto di servizio supportati da Microsoft 99,9% per tutti i cluster Spark e offre inoltre supporto 24 / 7 enterprise e il monitoraggio del cluster. Queste garanzie, associate a una quantità di annunci Spark e Azure e la facilità di distribuzione in cluster durante il 2016 compilare apportare conferenza Microsoft Cloud un ottimo ambiente per i processi di Big Data.

I necessari Pixie

Il segreto che rende estremamente diffuso tra gli scienziati dati Spark oggi è duplice: È veloce ed è un piacere lavorare con programma su tale framework. In primo luogo, diamo un'occhiata a ciò che rende molto più rapido del Framework e Spark.

Predecessore Spark, MapReduce, Hadoop è il componente di base dello spazio di analisi dei Big Data sin Doug Taglia e Mike Cafarella cofondato il progetto di Apache Hadoop nel 2005. Strumenti di MapReduce in precedenza erano disponibili solo all'interno dei Data Center di Google e sono stati completamente chiusi originati. Hadoop ha lavorato anche per l'esecuzione di analisi batch nel cluster di elaborazione, ma tuttavia aveva rigidità estremi. Mappa e ridurre le operazioni associate tra loro; prima completare l'attività di mappa, quindi completare l'attività di riduzione. Attività complesse era necessario combinare più mappa e ridurre i passaggi. Inoltre, ogni attività dovevano essere scomposto in una mappa per ridurre le operazioni. Che impiega molto tempo per eseguire queste operazioni sequenziale e non è difficile da programma. In altre parole, questo non era di analisi in tempo reale.

Al contrario, il framework Spark applica intelligence alle attività di analisi dei dati in questione. Costruisce un aciclico diretto grafico (DAG) di esecuzione prima di pianificare attività, molto simile a come SQL Server crea un piano di esecuzione di query prima di eseguire un'operazione di recupero o la modifica di dati. DAG forniscono informazioni sulle trasformazioni che verranno eseguite sui dati e Spark è in grado di combinare in modo intelligente molte di queste trasformazioni in una singola fase e quindi eseguire le trasformazioni in una sola volta, l'idea è inizialmente da Microsoft Research nel progetto Dryad.

Inoltre, Spark è in grado di mantenere in modo intelligente i dati in memoria tramite i costrutti chiamato resiliente distribuiti i set di dati (RDDs), che verrà descritta più avanti e condividerlo tra DAG. La condivisione dei dati tra i processi DAG consente di completare più rapidamente rispetto a quelli senza che l'ottimizzazione. Figura 1 Mostra un DAG per "hello world" dello spazio di analisi scientifica dei dati, il conteggio delle parole in un file di testo specificato. Si noti come diverse operazioni, vale a dire la lettura di file di testo, flatMap e mappa, vengono combinate in una singola fase, consentendo di velocizzare l'esecuzione. Il codice seguente viene illustrato il codice effettivo di Scala (poiché Spark è scritto in Scala) esegue il conteggio delle parole (anche se non si è mai visto una riga di codice Scala prima, ho disposto a scommettere che verrà immediatamente comprendere come implementare il conteggio delle parole in Spark):

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

Rappresentazione grafica Aciclica (DAG) diretta per il conteggio delle parole
Figura 1 indirizzati grafico aciclico (DAG) per il conteggio delle parole

Il secondo motivo che è estremamente diffuso Spark è a causa di modello di programmazione. Implementa il conteggio delle parole in Spark (codice di Scala) è molto più semplice rispetto all'implementazione di conteggio delle parole in MapReduce di Hadoop. Oltre alla Scala, è possibile creare Spark applicazioni Java e Python, che è il linguaggio di che utilizzo in questo articolo. Prima di Spark, con MapReduce di Hadoop, dati gli scienziati/i programmatori era utilizzare un paradigma non naturale di scomposizione di un'attività complessa in un set di mapping e riduzione delle operazioni. Con Spark, un approccio di programmazione funzionale familiare per qualsiasi sviluppatore .NET utilizzo delle funzioni LINQ e lambda viene utilizzato per trasformare e analizzare i dati.

A breve, si noterà quanto semplice ma potente, il modello di programmazione è di Spark. Ma prima è sufficiente scrivere codice funzionale awesome che funzioneranno altrettanto bene in set di dati grandi e piccole dimensioni, è necessario creare un cluster distribuito di computer che disporrà di tutti i componenti necessari di Spark installato e pronto per accettare le attività di programmazione si invia a esso. La creazione di un cluster Spark sarebbe assolutamente scoraggiante se è necessario creare e configurare il cluster. Fortunatamente, Microsoft Cloud consente di eseguire il provisioning in pochi semplici clic. Nella sezione successiva, vi mostrerò solo come eseguire questa operazione.

Distribuzione di un Cluster Spark

A questo punto, creare un cluster HDInsight in Azure. Pensare "HDInsight" come un termine generico che comprende tecnologie Hadoop sia Spark; Hadoop HDInsight e HDInsight Spark sono due esempi di servizi di dati gestiti in Azure.

Per eseguire il provisioning di un cluster Spark, accedere al portale di Azure (portal.azure.com) e fare clic su nuovo | Dati e analisi | HDInsight | Creare. Compilare le proprietà del HDInsight Cluster, nome, tipo di Cluster = Spark, impostare sistema operativo del Cluster come Linux (perché è in fase di sviluppo Spark su Linux) e lasciare il campo versione invariato, come illustrato nella Figura 2. Completare il resto delle informazioni necessarie, ad esempio specificando le credenziali per accedere al cluster e archiviazione, il nome di account/contenitore. Premere il pulsante Crea. Il processo di creazione di un cluster richiede 15-30 minuti.

Creazione di un Cluster Spark in Azure
Figura 2 Creazione di un Cluster Spark in Azure

Al termine del processo di creazione, è necessario un riquadro nel portale di Azure che rappresenta il cluster HDInsight appena creato. Infine, ottenere approfondimenti codice! Prima di ottenere codice, tuttavia, esaminare l'ambiente di programmazione e le lingue disponibili per l'utente con Spark.

Esistono diversi modi per programma nell'ambiente di Spark. In primo luogo, è possibile accedere shell di Spark mediante, in modo intuitivo sufficiente, il comando shell di spark, fornite in bit.ly/1ON5Vy4, in cui, dopo aver stabilito una sessione SSH al nodo head del cluster Spark, è possibile scrivere programmi di Scala in modo simile a REPL e inviare costrutti di programmazione uno alla volta (non preoccuparsi se questa frase suona come è stata scritta in una lingua straniera, appena procedere direttamente con l'opzione 3). In secondo luogo, è possibile eseguire le applicazioni di Scala completate in Spark (inviarle tramite il comando illustrato in spark-submit bit.ly/1fqgZHY). Infine, è disponibile anche un'opzione per usare i notebook Jupyter (jupyter.org) su Spark. Se non si ha familiarità con il progetto Jupyter, notebook Jupyter offrono un ambiente interattivo visual basate sul Web in cui eseguire gli script di analisi dei dati. Sono convinto che, quando si tenta di essi, che sarà diventino il metodo preferito di programmazione troppo Spark, questi notebook sono il mio metodo preferito di analisi dei dati. Azure HDInsight verrà installato l'ambiente di notebook Jupyter nella parte superiore del cluster, rendendo più semplice iniziare a usarlo.

Per accedere a notebook Jupyter, fare clic sul riquadro dashboard del Cluster come illustrato nella Figura 3, quindi fare clic sul riquadro di notebook Jupyter nella finestra della diapositiva-out. Accedere utilizzando le credenziali specificate durante la creazione del cluster e verrà visualizzato l'ambiente Jupyter pronto per accettare nuovi o modificare i blocchi appunti precedenti. Fare clic sul pulsante nuovo nell'angolo superiore destro e selezionare Python 2. Perché Python 2? Perché mentre Spark stesso è scritto in Scala molto Spark programmazione avviene in Scala, è disponibile tramite Pyspark un bridge di Python. Per inciso, è un dibattito raging se è necessario codificare in Scala o Python. Ogni linguaggio ha i suoi vantaggi non crittografati, con Scala viene potenzialmente più veloce, mentre Python forse è più espressivo e più comunemente utilizzato per l'analisi scientifica (vedere bit.ly/1WTSemP). Ciò consente di utilizzare un Python espressivo ancora conciso durante la programmazione all'inizio del cluster Spark. È possibile utilizzare tutte le potenti librerie Python che sono abituato a Python è anche la lingua preferita per l'analisi di dati (con R).

L'accesso a Jupyter notebook in Azure HDInsight tramite il dashboard Cluster
Figura 3 accesso Jupyter notebook in Azure HDInsight tramite il dashboard Cluster

Sei pronto per l'analisi approfondita ed eseguire attività di analisi di ML e dati all'interno di notebook Jupyter.

Machine Learning con Spark

Per illustrare ML in Spark, si utilizzerà un esempio di dati "minori a livello" sotto forma di problemi classici in ML, riconoscendo cifre scritte a mano, ad esempio quelli che vengono visualizzati in codici di avviamento postale nelle buste. Anche se questo set di dati non è grande con qualsiasi mezzo, il vantaggio di questa soluzione è che, dati aumenteranno mille - riduzione, è possibile aggiungere altre macchine al cluster e ancora completare l'analisi dei dati in un intervallo di tempo ragionevole. Non sarà necessaria alcuna modifica al codice illustrato di seguito, il framework Spark si occuperà di distribuire i carichi di lavoro ai singoli computer del cluster. Il file di dati che si userà è anche uno classico, viene spesso definito set di dati MNIST, e che contenga 50.000 cifre scritte a mano, è possibile analizzare. Sebbene esistano molte posizioni online per ottenere il set di dati MNIST, il sito Kaggle Web consente di accedere ai dati (vedere bit.ly/1QJN20c).

Come nota a margine, se non si ha familiarità con kaggle.com, esso ospita ML concorsi online, in cui gli scienziati quasi 500.000 dati da tutto il mondo contendono premi monetari o la possibilità di intervistare in una delle prime società ML. È stata completata in cinque Kaggle concorsi e, se avete una persona competitiva, si tratta dell'esperienza estremamente tossicomanigene. E il sito Kaggle stesso è in esecuzione in Azure!

È opportuno conoscere il contenuto di train.csv. Ogni riga del file rappresenta una rappresentazione di pixel per pixel di un'immagine di 28 x 28 contenente una cifra scritte a mano, come quella illustrata Figura 4 (figura mostra una rappresentazione di ingrandimento). La prima colonna contiene la cifra effettivamente novità; il resto delle colonne contengono intensità pixel, da 0 a 255, di tutti i 784 pixel (28 x 28).

Nell'esempio di cifra "7" rappresentato nel set di dati MNIST ingrandita
Figura 4 ingrandita campione della cifra "7" rappresentato nel set di dati MNIST

Con il nuovo notebook Jupyter aperto, incollare il codice seguente nella prima cella:

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)

Importa le librerie necessarie per l'esecuzione di ML in Spark questo codice, quindi specifica il percorso dei file di dati che verranno usati per il training e test del modello (si noti che questi file devono trovarsi nell'account di archiviazione, sono accessibili da Spark nel Cloud di Microsoft wasb: / / riferimento). Infine, le ultime due righe è dove vengono creati il RDD dai file di testo. RDDs sono la magia dietro Spark, che sono distribuite su strutture di dati, ma la complessità della loro implementazione in genere è nascosta dal programmatore/utente. Inoltre, questi RDDs vengono valutate in modo differito e sono persistenti, pertanto nel caso in cui è necessario utilizzare tale RDD nuovamente, risultano immediatamente disponibile senza computation/recupero. Quando si modificano RDDs, provoca la generazione di DAG e l'esecuzione di attività di gestione temporanea del cluster Spark, come trattato in precedenza al momento.

Premere MAIUSC + INVIO all'interno della cella Jupyter per eseguire il codice incollato. Nessuna notizia deve essere positivo (se non viene visualizzato di un messaggio di errore, è buona), e a questo punto è RDDs disponibili per l'esecuzione di query e la modifica. Questi RDDs contengono righe di testo delimitato da virgole al momento, in quanto si tratta come dati MNIST fornito.

L'operazione successiva che si intende eseguire è definire una funzione semplice che sarà consentono di convertire le righe di testo in un oggetto LabeledPoint personalizzato. Questo oggetto è richiesto per l'algoritmo di Machine Learning che si utilizzerà per eseguire il training e stime. In breve, questo oggetto contiene una matrice di "funzionalità" (talvolta è utile considerare di funzionalità come le colonne in una tabella di database) o le caratteristiche di un singolo punto dati, nonché la relativa etichetta"" o il valore si sono tentando di imparano a prevedere. Se tutto ciò suona un po' poco chiara adesso, ad esempio esaminando il file train.csv MNIST può essere utile. Si noterà che ogni riga in train.csv con un numero della prima colonna e una serie di numeri da 0 a 255, in tutte le altre colonne. La prima colonna viene denominata "label", perché stiamo cercando di informazioni su come stimare il numero. Tutte le altre colonne sono "funzionalità" e la funzionalità di tutto sono dette "vettore funzionalità". Queste funzionalità sono l'intensità di ciascun pixel dell'immagine della cifra digitalizzate, 0 è nero e 255 bianco, con molti valori intermedi. Le immagini sono tutti 28 pixel elevata e 28 pixel, che costituiscono 784 colonne contenenti intensità pixel nel file train.csv (28 x 28 = 784).

Copiare e incollare la nuova cella notebook Jupyter la funzione seguente:

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:])

Premere MAIUSC + INVIO per eseguire il codice. È stata così definita la funzione parsePoint, che è stata valutata dal Spark ed è disponibile per l'utilizzo con il set di dati che appena letti. Questa funzione accetta una singola riga di testo delimitato da virgole, suddivide i singoli valori e converte questi valori nell'oggetto LabeledPoint.

Eseguire quindi alcuni dati di base di pulizia per renderlo pronto per l'algoritmo di apprendimento; Sfortunatamente, l'algoritmo di apprendimento non è ancora abbastanza per sapere quale parte dei dati ha valore predittivo. Pertanto, ignorare l'intestazione del file train.csv utilizzando un hacker preso in prestito da stackoverflow.com; quindi, verranno stampate la prima riga il RDD risultante per assicurarsi che sia stato previsto in:

#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()

A questo punto, si è pronti per applicare un approccio di programmazione funzionale con l'operatore .map(parsePoint) nella sezione successiva per trasformare il RDD Ready il formato per gli algoritmi ML in Spark. Questa trasformazione essenzialmente analizzerà ogni riga all'interno di mnist_train RDD e convertire tale RDD in un set di oggetti LabeledPoint.

RDDs e interattività: Concetti di base della potenza di Spark

Esistono diverse importanti. In primo luogo, si lavora con una struttura di dati distribuita tra il cluster di computer (il RDD), ma la complessità delle applicazioni distribuite è quasi completamente visibili all'utente. Si applicano trasformazioni funzionale per il RDD e Spark consente di ottimizzare tutte l'elaborazione e pesante all'interno del cluster di macchine disponibili dietro le quinte è:

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()

Sebbene l'ultima riga (con l'istruzione print) potrebbe sembrare banale, la possibilità di eseguire una query in modo interattivo grandi set di dati è molto potente e praticamente assente dal mondo di grandi set di dati prima di Spark. Nell'analisi scientifica dei dati e i progetti di manipolazione dei dati di grandi dimensioni, si tratterà di una tecnica molto utile per verificare che vengano applicate le trasformazioni si ritiene che in realtà l'applicazione. Questa potente elaborazione interattiva è ancora un altro vantaggio di Spark su altri framework di elaborazione di Big Data.

Inoltre si noti che la suddivisione dei dati in formazione e set di dati utilizzando la funzione randomSplit di test. L'idea è creare un modello ML trainingData RDD utilizzando i dati e per testare il modello utilizzando i dati testData RDD, come si vedrà il codice a breve.

A questo punto si è pronti applicare un algoritmo ML al set di dati distribuite che è stata appena creata (mnist_train). Come una rapida panoramica, tenere presente che problemi di ML, quasi in tutti i casi esistono due set distinti di passaggi che si verificano: In primo luogo, il training del modello con il set di dati noti note conclusioni; in secondo luogo, l'esecuzione di stime in base al modello creato o apprese nel primo passaggio. Nel codice seguente, si utilizza un algoritmo RandomForest disponibile all'interno del framework di Machine Learning Spark (MLLib Spark) per il training del modello. RandomForest è uno dei diversi algoritmi distribuiti disponibili all'interno di MLLib Spark ed è uno dei più potenti. Nella nuova cella, incollare il contenuto seguente:

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))

Nota la modalità di avvio per misurare il tempo di esecuzione degli algoritmi, questo codice imposta quindi i valori iniziali per alcuni dei parametri previsti dall'algoritmo RandomForest, vale a dire maxDepth e numTrees. Eseguire codice premendo MAIUSC + INVIO. È importante sapere che cos'è questa cosa RandomForest e come funziona? RandomForest è un algoritmo di Machine Learning che, a un livello molto elevato, funziona creando molti gli alberi delle decisioni sui dati selezionando in modo casuale una variabile per suddividere un albero delle decisioni in (vale a dire una struttura potrebbe essere semplicemente come "se il pixel nell'angolo in basso a destra è il bianco, è probabilmente n. 2") e la decisione finale dopo il polling di tutti gli alberi costruiti. Fortunatamente, esiste già una versione distribuita dell'algoritmo disponibili in Spark. Tuttavia, impedita la scrittura di algoritmi personalizzati se si decide di farlo; algoritmo router adiacenti (kNN) distribuito KB più vicino non è ancora presente in framework Spark.

Tornare all'attività di riconoscimento MNIST cifre. Se si dispone di un ambiente simile a fondo, viene visualizzato il tempo di esecuzione del training dell'algoritmo di circa 21 secondi. Ciò significa che in 21 secondi, si è appreso, utilizzando l'algoritmo RandomForest, ovvero un modello che è possibile utilizzare per stimare le cifre vengono visualizzate fornito le funzionalità di aver analizzato. A questo punto si è pronti per la parte più importante dell'attività ML, esecuzione di stime basate sul modello creato. Inoltre, si è pronti anche valutare l'accuratezza di queste stime, come illustrato nella Figura 5.

Figura 5, valutare l'accuratezza delle stime

# 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())

Si noti il costrutto model.predict nella riga 4 di Figura 5. Questa è la riga che effettua la stima effettiva in base al modello che è stata creata in precedenza. Nelle righe dopo la stima (righe 5-7), si utilizza alcune modifiche di dati di base relative strategie di temporaneo, ovvero tramite la funzione zip, i valori stimati per i valori reali disponibili come parte del download. Quindi, è semplicemente calcolare la percentuale di stime corrette in base a questi dati e stampare il tempo di esecuzione.

Il risultato di questa classificazione iniziale con l'errore viene così alto è leggermente costituire (vale a dire, funziona il modello affatto con frequenza di errori, raggiungendo il 43%?). È possibile migliorare il modello utilizzando il concetto di "ricerca di iperparametri griglia" in cui si tenta una serie di valori quando si compila il modello di test immediatamente e infine convergono ai valori di iperparametri che offrono le migliori prestazioni complessive. In altre parole, provare una serie di esperimenti sistematici per determinare il valore predittivo meglio quali parametri del modello.

Iperparametri che verrà applicata ricerca griglia sarà numTrees e maxDepth; incollare il codice riportato Figura 6 nella nuova cella del notebook.

Figura 6 iterativo "Griglia ricerca" per i parametri ottimali nell'algoritmo RandomForest 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))

Si noti come righe 8-14 è possibile scorrere un set di parametri numTrees per l'algoritmo di foresta casuale da 3 a 10, la creazione di modelli e la valutazione delle prestazioni. Successivamente, nelle righe 30-32, acquisite del modello se offre risultati migliori rispetto a qualsiasi dei modelli precedenti si sono provato a, o chiudere il modello in caso contrario. Assegnare questo ciclo del tempo di esecuzione. al termine dell'esecuzione, si dovrebbero registrare valori di errore di stima non superiore al 10%.

Avvolgendo

Quando ho deciso di scrivere questo articolo, lo scopo principale era mostrare attraverso esempi di come è facile programmare con Spark, soprattutto se sei un appassionato della programmazione funzionale e Azure. Il mio obiettivo secondario era mostrare come è possibile eseguire attività di ML in set di dati di grandi e piccole con l'aiuto della libreria MLLib Spark. Parallelamente, vorrei spiegare perché Spark viene eseguito più velocemente sui dati distribuiti rispetto alle versioni precedenti e condividere i bit di informazione curiosa di come si è giunti alla traguardi raggiunti finora nell'area di analisi dei dati distribuiti.

Microsoft sta investendo capitali ingenti in futuro di Big Data, ML, analisi e, in particolare, Spark. Questo è il momento giusto per informazioni su queste tecnologie per sfruttare veramente le opportunità per l'analisi di dati e calcolo di un'iperscalabilità fornito da Microsoft Cloud. Azure consente di ottenere scalabilità fino a DataSet di grandi dimensioni, tutti supportati da garanzie a livello di servizio che è possibile prevedere solo dai provider di cloud enterprise migliore l'adozione di Spark più veloce, semplice e pronto.

Ora che è stato creato un modello ML ed è stato stime sui dati noti, è possibile eseguire stime sui dati che non includono la relativa etichetta true; in particolare, nel file di test. csv da Kaggle.com. È quindi possibile rendere un inoltro per Kaggle.com come parte del concorso riconoscimento cifra su questa piattaforma. Tutto il codice per questo articolo, nonché il codice per scrivere un file di invio, è disponibile all'indirizzo GitHub.com/echuvyrov/SparkOnAzure. Mi piacerebbe apprendere i punteggi che si ottiene. Messaggio di posta elettronica con domande, commenti, suggerimenti e traguardi ML eugene.chuvyrov@microsoft.com.


Eugene Chuvyrovè un architetto di soluzioni cloud di Microsoft nel team di sviluppo e di evangelizzazione tecnica dove aiuta le aziende di tutto l'area di San Francisco Bay sfruttare appieno la scala hyper offerta dal Cloud di Microsoft. Anche se attualmente si occupa per i partner di dati su vasta scala, egli non è stato dimenticato il suo radici come software engineer e piace scrivere codice di cloud computing in c#, JavaScript e Python. Seguirlo su Twitter: @EugeneChuvyrov.

Grazie all'esperto tecnico Microsoft seguente per la revisione di questo articolo: Bruno Terkaly
Bruno Terkaly è un principal software engineer presso Microsoft con l'obiettivo di abilitazione di sviluppo di applicazioni e servizi leader nel settore su tutti i dispositivi. È responsabile per la Guida di cloud superiore e opportunità mobile tutti gli Stati Uniti e oltre da una prospettiva di abilitazione di tecnologia. Aiuta i partner portare le applicazioni sul mercato fornendo indicazioni relative all'architettura e tecnica approfondita impegno durante la valutazione, sviluppo e distribuzione dell'ISV. Terkaly collabora con il cloud e mobili gruppi engineering, commenti e suggerimenti e che influenzano la Guida di orientamento.