Como vimos en el anterior articulo de Blog (Clasificador MultiClase - SciKit Learn) estamos realizando un experimento de clasificación lo suficientemente complejo para permitirnos probar las distintas tecnologías existentes en el mercado y las diferencias relativas a los siguientes 4 puntos:
1) Performance
2) Consumo de recursos
3) Dificultad para implementar la algorítmica asociada
4) Tiempo de aprendizaje
Para la realización del experimento estamos utilizando un conjunto de datos de caracteres alfanuméricos en formato imagen (28x28) provistos por Google para la realización del curso "Deep Learning by Google" a través de la plataforma Udacity.
Es un conjunto de caracteres NOMINST en distintas formas y formatos simulando lo que sería un reconocimiento de escritura natural sobre 10 clases de caracteres y etiquetados por una clase de 0 a 9. de esta forma la correspondencia será:
Para estos experimentos trabajamos con un conjunto de 200.000 datos de entrenamiento y dos conjuntos de validación y test de 10.000 sucesos.
Todos los conjuntos han sido previamente mezclados aleatoriamente para el experimento y almacenados en fichero con formato cpickle para reproducir las mismas circunstancias en todos los experimentos.
Spark ™ es un motor de cálculo rápido, distribuido y de uso general para los datos de Hadoop proporcionando un modelo de programación simple y expresivo que soporta una amplia gama de aplicaciones, incluyendo ETL, machine learning, streaming y cálculo de operaciones sobre grafos.
Veamos cada uno de ellos:
Spark SQL:
componete Spark para procesamiento de datos estructurado. Hay varias maneras de interactuar con Spark SQL, incluyendo SQL y la API Dataset. Cuando se calcula un resultado, se utiliza el mismo motor de ejecución, independientemente de qué API / idioma se utiliza para expresar el cálculo. Esta unificación significa que los desarrolladores pueden cambiar fácilmente de un API a otro, basándose en el que proporciona la forma más natural de expresar una transformación dada.
GraphX:
componente en Spark para gráficos y cálculo gráfico-paralelo. Para soportar el cálculo de gráficos, GraphX expone un conjunto de operadores fundamentales (por ejemplo, subgraph, joinVertices y aggregateMessages), así como una variante optimizada de la API Pregel. Además, GraphX incluye una creciente colección de algoritmos de gráficos y constructores para simplificar las tareas de análisis gráfico.
MLlib:
es la biblioteca de aprendizaje automático (ML) de Spark. Su objetivo es hacer que el aprendizaje práctico de la máquina sea escalable y fácil. A un nivel alto, proporciona herramientas tales como:
Spark Streaming:
es una extensión de la API Spark principal que permite el procesamiento escalable, de alto rendimiento y tolerante a fallos de flujo de datos en vivo.
Los datos pueden ser ingeridos de muchas fuentes como Kafka, Flume, Kinesis o sockets TCP, y pueden ser procesados usando algoritmos complejos expresados con funciones de alto nivel como mapa, reducir, unir y ventana.
Los datos procesados pueden ser enviados a sistemas de archivos, bases de datos y cuadros de mando en vivo.
En nuestro caso utilizaremos el modulo MLlib y el algoritmo LogisticRegression para nuestro experimento.
1) Performance
2) Consumo de recursos
3) Dificultad para implementar la algorítmica asociada
4) Tiempo de aprendizaje
Para la realización del experimento estamos utilizando un conjunto de datos de caracteres alfanuméricos en formato imagen (28x28) provistos por Google para la realización del curso "Deep Learning by Google" a través de la plataforma Udacity.
Es un conjunto de caracteres NOMINST en distintas formas y formatos simulando lo que sería un reconocimiento de escritura natural sobre 10 clases de caracteres y etiquetados por una clase de 0 a 9. de esta forma la correspondencia será:
A - 0
B - 1
C - 2
D - 3
E - 4
F - 5
G - 6
H - 7
I - 8
J - 9
Para estos experimentos trabajamos con un conjunto de 200.000 datos de entrenamiento y dos conjuntos de validación y test de 10.000 sucesos.
Todos los conjuntos han sido previamente mezclados aleatoriamente para el experimento y almacenados en fichero con formato cpickle para reproducir las mismas circunstancias en todos los experimentos.
Apache Spark 2.1.0
Según la definición de la página oficial de Apache Hadoop,Spark ™ es un motor de cálculo rápido, distribuido y de uso general para los datos de Hadoop proporcionando un modelo de programación simple y expresivo que soporta una amplia gama de aplicaciones, incluyendo ETL, machine learning, streaming y cálculo de operaciones sobre grafos.
Veamos cada uno de ellos:
Spark SQL:
componete Spark para procesamiento de datos estructurado. Hay varias maneras de interactuar con Spark SQL, incluyendo SQL y la API Dataset. Cuando se calcula un resultado, se utiliza el mismo motor de ejecución, independientemente de qué API / idioma se utiliza para expresar el cálculo. Esta unificación significa que los desarrolladores pueden cambiar fácilmente de un API a otro, basándose en el que proporciona la forma más natural de expresar una transformación dada.
GraphX:
componente en Spark para gráficos y cálculo gráfico-paralelo. Para soportar el cálculo de gráficos, GraphX expone un conjunto de operadores fundamentales (por ejemplo, subgraph, joinVertices y aggregateMessages), así como una variante optimizada de la API Pregel. Además, GraphX incluye una creciente colección de algoritmos de gráficos y constructores para simplificar las tareas de análisis gráfico.
MLlib:
es la biblioteca de aprendizaje automático (ML) de Spark. Su objetivo es hacer que el aprendizaje práctico de la máquina sea escalable y fácil. A un nivel alto, proporciona herramientas tales como:
- ML Algoritmos: algoritmos comunes de aprendizaje tales como clasificación, regresión, agrupación y filtrado colaborativo
- Transformación de Datos: extracción de características, transformación, reducción de dimensionalidad y selección
- Pipelines: herramientas para construir, evaluar y afinar los ductos de ML
- Persistencia: algoritmos de ahorro y carga, modelos y pipelines.
- Otras: Utilidades: álgebra lineal, estadística, manejo de datos, etc.
Spark Streaming:
es una extensión de la API Spark principal que permite el procesamiento escalable, de alto rendimiento y tolerante a fallos de flujo de datos en vivo.
Los datos pueden ser ingeridos de muchas fuentes como Kafka, Flume, Kinesis o sockets TCP, y pueden ser procesados usando algoritmos complejos expresados con funciones de alto nivel como mapa, reducir, unir y ventana.
Los datos procesados pueden ser enviados a sistemas de archivos, bases de datos y cuadros de mando en vivo.
En nuestro caso utilizaremos el modulo MLlib y el algoritmo LogisticRegression para nuestro experimento.
Inicialización
Lo primero que vamos a hacer es cargar las librerías y módulos necesarios.
# These are all the modules we'll be using later. Make sure you can import them
# before proceeding further.
from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np
import os
import pickle as pickle
import time
import sys
try:
# Now we are ready to import Spark Modulestry:
from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.mllib.classification import LogisticRegressionWithLBFGS as LogisticRegression
from pyspark.mllib.regression import LabeledPoint
print("Successfully imported all Spark stuff")
except ImportError as e:
print("Error importing Spark Modules", e)
sys.exit(1)
# Config the matplotlib backend as plotting inline in IPython
%matplotlib inline
Successfully imported all Spark stuff
Y Cargamos la imagenes empaquetadas en un fichero cPickle.
Nos basamos en un conjunto de imagenes 28X28 NOMINST (provisto por Google) de distintos tipos de fuentes para los caracteres y etiquetas asociadas:
[A,B,C,D,E,F,G,H,I,J] = [0,1,2,3,4,5,6,7,8,9]
os.chdir('d:/Data/Gdeeplearning-Udacity')
pickle_file = 'notMNIST.pickle'
with open(pickle_file, 'rb') as f:
save = pickle.load(f)
train_dataset = save['train_dataset']
train_labels = save['train_labels']
valid_dataset = save['valid_dataset']
valid_labels = save['valid_labels']
test_dataset = save['test_dataset']
test_labels = save['test_labels']
del save # hint to help gc free up memory
print('Training set', train_dataset.shape, train_labels.shape)
print('Validation set', valid_dataset.shape, valid_labels.shape)
print('Test set', test_dataset.shape, test_labels.shape)
statinfo = os.stat(pickle_file)
print ('Compressed pickle size:', statinfo.st_size)
Como vemos nuestras imágenes y etiquetas han sido perfectamente cargadas y estamos listos para trabajar con ellas.
Training set (200000, 28, 28) (200000,)
Validation set (10000, 28, 28) (10000,)
Test set (10000, 28, 28) (10000,)
Inicialización
# These are all the modules we'll be using later. Make sure you can import them
# before proceeding further.
from __future__ import print_function
import matplotlib.pyplot as plt
import numpy as np
import os
import pickle as pickle
import time
import sys
try:
# Now we are ready to import Spark Modulestry:
from pyspark.sql import SparkSession
from pyspark import SparkContext
from pyspark import SparkConf
from pyspark.mllib.classification import LogisticRegressionWithLBFGS as LogisticRegression
from pyspark.mllib.regression import LabeledPoint
print("Successfully imported all Spark stuff")
except ImportError as e:
print("Error importing Spark Modules", e)
sys.exit(1)
# Config the matplotlib backend as plotting inline in IPython
%matplotlib inline
Successfully imported all Spark stuff
Y Cargamos la imagenes empaquetadas en un fichero cPickle.
Nos basamos en un conjunto de imagenes 28X28 NOMINST (provisto por Google) de distintos tipos de fuentes para los caracteres y etiquetas asociadas:
[A,B,C,D,E,F,G,H,I,J] = [0,1,2,3,4,5,6,7,8,9]
os.chdir('d:/Data/Gdeeplearning-Udacity')
pickle_file = 'notMNIST.pickle'
with open(pickle_file, 'rb') as f:
save = pickle.load(f)
train_dataset = save['train_dataset']
train_labels = save['train_labels']
valid_dataset = save['valid_dataset']
valid_labels = save['valid_labels']
test_dataset = save['test_dataset']
test_labels = save['test_labels']
del save # hint to help gc free up memory
print('Training set', train_dataset.shape, train_labels.shape)
print('Validation set', valid_dataset.shape, valid_labels.shape)
print('Test set', test_dataset.shape, test_labels.shape)
statinfo = os.stat(pickle_file)
print ('Compressed pickle size:', statinfo.st_size)
Como vemos nuestras imágenes y etiquetas han sido perfectamente cargadas y estamos listos para trabajar con ellas.
Training set (200000, 28, 28) (200000,)
Validation set (10000, 28, 28) (10000,)
Test set (10000, 28, 28) (10000,)
No hay comentarios:
Publicar un comentario
"Lo cortés no quita lo valiente".
Gracias por usar un lenguaje respetuoso