En esta guía aprenderás:
- La definición de lote
- Por qué procesar conjuntos de datos por lotes
- Cómo dividir un conjunto de datos en lotes en Python
- El enfoque de la opción
por lotesmap()del conjunto de datos
¡Empecemos!
¿Qué es un lote?
En el mundo del aprendizaje automático y el procesamiento de datos, un lote no es más que un subconjunto de un Conjunto de datos. Los lotes se utilizan normalmente para manejar de forma eficiente grandes volúmenes de datos. En lugar de procesar todo el Conjunto de datos a la vez, los datos se dividen en fragmentos más pequeños, también llamados lotes. Cada lote se puede procesar de forma independiente, lo que ayuda a reducir el uso de memoria y a mejorar la eficiencia computacional.
Por ejemplo, supongamos que tienes algunos datos de muestra en formato CSV:
id,nombre,edad,puntuación
1,John,28,85
2,Jane,34,90
3,Bob,25,72
4,Alice,30,88
5,Charlie,29,91
6,David,35,79
7,Eve,22,95
8,Frank,31,82
9,Grace,27,86
10,Hannah,26,80
Un lote del conjunto de datos anterior es:
6, David, 35, 79
7, Eve, 22, 95
8, Frank, 31, 82
9, Grace, 27, 86
10, Hannah, 26, 80
Este lote divide el conjunto de datos original de la fila 5 a la 10.
Ventajas de procesar un conjunto de datos por lotes
Supongamos que tiene un conjunto de datos que ha creado utilizando algunas técnicas de obtención de datos. Si no está familiarizado con ese proceso, siga nuestra guía sobre cómo crear un conjunto de datos.
Ahora bien, ¿por qué querría procesar este conjunto de datos por lotes? Porque eso le reporta las siguientes ventajas:
- Eficiencia de la memoria: trabaje con porciones más pequeñas y manejables a la vez, en lugar de cargar todo el Conjunto de datos en la memoria.
- Procesamiento más rápido: el procesamiento por lotes se puede paralelizar, lo que reduce el tiempo necesario para procesar conjuntos de datos grandes.
- Mejor entrenamiento para los modelos de ML: ayuda a entrenar los modelos de aprendizaje automático actualizando los pesos de forma incremental, lo que puede dar lugar a una convergencia más estable y rápida.
- Mejora de la escalabilidad: facilita la ampliación del procesamiento a conjuntos de datos grandes que pueden no caber en la memoria de una sola vez.
Cómo dividir un conjunto de datos en lotes: los 5 mejores enfoques
Antes de explorar los mejores métodos de Python para dividir un conjunto de datos en lotes, debemos identificar algunos criterios para evaluar estos enfoques. A continuación se incluye una lista significativa de aspectos a tener en cuenta:
- Implementación: un fragmento de código que muestre cómo utilizar el enfoque en un ejemplo sencillo.
- Escenarios: situaciones reales en las que se puede aplicar el enfoque de división de Conjuntos de datos.
- Entrada: los tipos de archivos de Conjuntos de datos y estructuras de datos que admite la estrategia de división.
- Ventajas: los beneficios que ofrece el enfoque.
- Inconvenientes: las limitaciones o desventajas del método.
¡Es hora de analizarlos uno por uno!
Enfoque n.º 1: división de matrices
El corte de matrices es un método sencillo para dividir un conjunto de datos en lotes más pequeños y manejables. La idea es dividir un conjunto de datos (representado por una lista, una matriz u otra secuencia) en fragmentos mediante su corte.
👨💻 Implementación:
def create_batches(data, batch_size):
return [data[i:i + batch_size] for i in range(0, len(data), batch_size)]
# ejemplo de uso
data = list(range(1, 51)) # conjunto de datos de muestra
batches = create_batches(data, batch_size=5)
print(batches)
# salida: [[1, 2, 3, 4, 5], ..., [46, 47, 48, 49, 50]]
🎯 Escenarios:
- Tareas de preprocesamiento de datos en las que las limitaciones de memoria son mínimas
- Tareas de procesamiento de datos en paralelo que requieren fragmentos gestionables en memoria
- Procesamiento por lotes sencillo en canalizaciones de datos
🔠 Entrada:
- Listas, matrices y tuplas en Python.
- Matrices Numpy
- Datos CSV, cargados en la memoria como una lista de filas
- Pandas DataFrames, si se convierten en listas o matrices
👍 Ventajas:
- Sencillo y fácil de implementar
- No requiere bibliotecas externas
- Proporciona control directo sobre los tamaños de los lotes
👎 Desventajas:
- Limitado por la memoria disponible
- No admite conjuntos de datos extremadamente grandes ni estructuras de datos complejas
- Requiere lógica personalizada para la reorganización de datos
Enfoque n.º 2: generadores
Los generadores de Python permiten dividir un conjunto de datos en lotes, produciendo un lote cada vez. Si no está familiarizado con este mecanismo, un generador es un tipo especial de función que se comporta como un iterador. En lugar de devolver los datos directamente, utiliza la palabra clave yield para producir un objeto iterador. Esto permite acceder a los lotes de forma secuencial utilizando un bucle for o la función next().
👨💻 Implementación:
def data_generator(data, batch_size):
for i in range(0, len(data), batch_size):
yield data[i:i + batch_size]
# ejemplo de uso
data = list(range(1, 51)) # conjunto de datos de muestra
for batch in data_generator(data, batch_size=5):
print(batch)
# salida:
# [1, 2, 3, 4, 5]
# ...
# [46, 47, 48, 49, 50]
🎯 Escenarios:
- Procesamiento por lotes en canalizaciones de datos
- Tareas de preprocesamiento y aumento de datos a gran escala
- Del procesamiento por lotes simple al complejo en canalizaciones de datos
🔠 Entrada:
- Listas, matrices y tuplas
- Matrices NumPy
- Conjuntos de datos basados en archivos en los que es posible cargar cada lote desde el disco
👍 Ventajas:
- Puede manejar grandes conjuntos de datos sin cargarlos completamente en la memoria
- Configuración mínima y fácil de implementar
- Permite la carga de datos controlada y bajo demanda
👎 Desventajas:
- Limitado por el orden de los datos, a menos que se implemente una reorganización adicional.
- Menos eficaz para tamaños de lotes dinámicos o variables
- Puede que no sea la mejor solución para el procesamiento paralelo, especialmente en operaciones multihilo
Enfoque n.º 3: PyTorch DataLoader
La clase DataLoader de PyTorch le ayuda a dividir de forma eficiente los Conjuntos de datos en lotes manejables. Como estructura de datos especializada para manejar Conjuntos de datos, también proporciona funciones útiles como la reorganización y la carga de datos en paralelo.
Tenga en cuenta que DataLoader funciona con TensorDataset, otra estructura de datos de PyTorch destinada a representar un Conjunto de datos. En concreto, un TensorDataset acepta dos argumentos:
inps: los datos de entrada, normalmente en forma detensor.tgts: las etiquetas o valores objetivo, también normalmente en forma de tensor, correspondientes a los datos de entrada.
TensorDataset empareja los datos y el objetivo, que luego pueden ser cargados por DataLoader para su procesamiento por lotes y entrenamiento.
👨💻 Implementación:
from torch.utils.data import DataLoader, TensorDataset
import torch
# datos para definir un conjunto de datos simple
inputs = torch.arange(1, 51).float().reshape(-1, 1) # un conjunto de datos de tensor 1D (entrada)
targets = inputs ** 2 # cuadrado de los valores de entrada (simulando una tarea de regresión)
# crear un TensorDataset y un DataLoader
dataset = TensorDataset(inputs, targets)
dataloader = DataLoader(dataset, batch_size=5, shuffle=True)
# iterar a través de DataLoader
for batch in dataloader:
print(batch)
# ejemplo de salida:
# [tensor([[46.],
# [42.],
# [25.],
# [10.],
# [34.]]), tensor([[2116.],
# [1764.],
# [ 625.],
# [ 100.],
# [1156.]])]
# ...
# [tensor([[21.],
# [ 9.],
# [ 2.],
# [38.],
# [44.]]), tensor([[ 441.],
# [ 81.],
# [ 4.],
# [1444.],
# [1936.]])]
🎯 Escenarios:
- Entrenamiento y prueba de modelos de aprendizaje automático en PyTorch
- Barajado de datos para lotes de entrenamiento imparciales
- Procesamiento de datos a gran escala para tareas de aprendizaje profundo
🔠 Entrada:
- Conjuntos de datos personalizados cargados en PyTorch
TensorDatasets - Datos tabulares y matrices numéricas en formato
Tensor
👍 Ventajas:
- Optimizado para grandes conjuntos de datos con procesamiento por lotes y barajado
- Admite la carga de datos en paralelo, lo que acelera la recuperación por lotes
- Funciona a la perfección con modelos PyTorch y bucles de entrenamiento
- Compatible con el procesamiento por GPU
👎 Desventajas:
- Requiere PyTorch
- Necesita conversión de datos a tensores.
- No es ideal para tareas de procesamiento por lotes que no sean de ML
Enfoque n.º 4: método batch() de TensorFlow
El método batch() de TensorFlow Dataset para dividir Conjuntos de datos en lotes. Este método divide el conjunto de datos en fragmentos más pequeños, con características como la paralelización, el control sobre el orden de procesamiento y la denominación.
Como biblioteca de aprendizaje automático, TensorFlow también ofrece características adicionales como barajar, repetir y precargar.
👨💻 Implementación:
import tensorflow as tf
# crear un conjunto de datos de muestra
inputs = tf.range(1, 51, dtype=tf.float32) # un conjunto de datos tensorial 1D (entradas)
targets = inputs ** 2 # cuadrado de los valores de entrada (simulando una tarea de regresión)
# convertir las entradas y los objetivos en tf.data.Dataset
inputs_dataset = tf.data.Dataset.from_tensor_slices(inputs)
targets_dataset = tf.data.Dataset.from_tensor_slices(targets)
# crear un conjunto de datos comprimiendo las entradas y los objetivos juntos
dataset = tf.data.Dataset.zip((inputs_dataset, targets_dataset))
# producir un conjunto de datos por lotes
batched_dataset = dataset.batch(batch_size=5)
for batch in batched_dataset:
print(batch)
# salida:
# (<tf.Tensor: shape=(5,), dtype=float32, numpy=array([1., 2., 3., 4., 5.], dtype=float32)>, <tf.Tensor: shape=(5,), dtype=float32, numpy=array([ 1., 4., 9., 16., 25.], dtype=float32)>)
# ...
# (<tf.Tensor: shape=(5,), dtype=float32, numpy=array([46., 47., 48., 49., 50.], dtype=float32)>, <tf.Tensor: forma=(5,), tipo de datos=float32, numpy=matriz([2116., 2209., 2304., 2401., 2500.], tipo de datos=float32)>)
🎯 Escenarios:
- Entrenamiento y prueba de modelos de aprendizaje automático en PyTorch
- Barajar datos para obtener lotes de entrenamiento imparciales
- Procesamiento de datos a gran escala para tareas de aprendizaje profundo
🔠 Entrada:
- Objetos TensorFlow
tf.data.Dataset - Matrices NumPy (que se pueden convertir a
Conjuntos de datos) - Archivos TFRecord, un formato de archivo binario especial que se utiliza habitualmente para almacenar grandes conjuntos de datos en TensorFlow
👍 Ventajas:
- Optimizado para un uso eficiente de la memoria
- Se integra perfectamente con el ecosistema TensorFlow para el entrenamiento y la evaluación de modelos
- Admite barajado, precarga y otras funciones útiles
- Admite una amplia variedad de formatos de datos, incluyendo imágenes, texto y datos estructurados
👎 Desventajas:
- Requiere TensorFlow
- Para conjuntos de datos más complejos, puede ser necesaria una configuración adicional para formatear y preprocesar correctamente los datos
- Puede introducir una sobrecarga para el procesamiento por lotes de conjuntos de datos más pequeños
Enfoque n.º 5: formato HDF5
HDF5 es un formato de datos ampliamente adoptado para gestionar grandes conjuntos de datos, especialmente cuando se trata de estructuras de datos jerárquicas. Permite dividir un gran conjunto de datos en fragmentos y almacenarlos de manera eficiente.
La biblioteca Python h5py proporciona herramientas para trabajar con archivos HDF5 y cargarlos como estructuras de datos NumPy. Esto abre la puerta al procesamiento por lotes de Conjuntos de datos mediante el acceso a segmentos o partes específicas de datos bajo demanda.
👨💻 Implementación:
import h5py
import numpy as np
# cargar y procesar por lotes los datos del archivo HDF5
def load_data_in_batches(batch_size=10):
# abrir un archivo HDF5
with h5py.File("dataset.h5", "r") as f:
inputs = f["input"]
targets = f["target"]
# agrupar los datos con un iterador desde el disco
for i in range(0, len(data), batch_size):
yield inputs[i:i+batch_size], targets[i:i+batch_size]
# iterar a través de lotes
for batch_data, batch_target in load_data_in_batches():
print("Lote de entrada:", batch_input)
print("Lote de destino:", batch_target)
# salida:
# Lote de entrada: [[ 1]
# [ 2]
# [ 3]
# [ 4]
# [ 5]
# [ 6]
# [ 7]
# [ 8]
# [ 9]
# [10]]
# Lote de destino: [[ 1]
# [ 4]
# [ 9]
# [ 16]
# [ 25]
# [ 36]
# [ 49]
# [ 64]
# [ 81]
# [100]]
# ...
# Lote de entrada: [[41]
# [42]
# [43]
# [44]
# [45]
# [46]
# [47]
# [48]
# [49]
# [50]]
# Lote objetivo: [[1681]
# [1764]
# [1849]
# [1936]
# [2026]
# [2116]
# [2209]
# [2304]
# [2401]
# [2500]]
🎯 Escenarios:
- Ideal para conjuntos de datos muy grandes que no se pueden cargar por completo en la memoria
- Útil cuando se trabaja con datos multidimensionales
- Adecuado para almacenar y recuperar datos del disco en un formato comprimido y eficiente para tareas de aprendizaje automático
🔠 Entrada:
- Archivos HDF5
👍 Ventajas:
- HDF5 admite la compresión y fragmentación de datos, lo que reduce los requisitos de almacenamiento para grandes Conjuntos de datos
- Permite un acceso aleatorio eficiente a partes de grandes conjuntos de datos sin necesidad de cargar todo en la memoria
- Puede almacenar múltiples conjuntos de datos en un solo archivo, lo que lo hace muy adecuado para conjuntos de datos complejos.
- Es compatible con muchas bibliotecas científicas, como NumPy, TensorFlow y PyTorch.
👎 Desventajas:
- Requiere una configuración adicional y conocimientos sobre el formato HDF5.
- Para disponer de una API completa que gestione archivos HDF5, depende de la biblioteca
h5py. - No todos los conjuntos de datos están disponibles en formato HDF5.
Otras soluciones
Aunque los enfoques presentados anteriormente se encuentran entre las mejores formas de dividir un conjunto de datos en lotes, también existen otras soluciones viables.
Otra posible solución es utilizar la biblioteca de Conjuntos de datos Hugging Face. Esta le proporciona todo lo que necesita para aplicar transformaciones a un conjunto de datos completo mientras lo procesa por lotes. Al establecer batched=True, puede definir transformaciones a nivel de lote sin tener que dividir manualmente el conjunto de datos, como en el ejemplo siguiente:
from Conjuntos de datos import load_dataset
# cargar un conjunto de datos de muestra
dataset = load_dataset("imdb", split="train")
# definir una función de procesamiento por lotes
def process_batch(batch):
# tarea de tokenización simple
return {"tokens": [text.split() for text in batch["text"]]}
# aplicar el procesamiento por lotes
batched_dataset = dataset.map(process_batch, batched=True, batch_size=32)
La opción dataset map() batched=True es ideal cuando se necesita aplicar transformaciones, como la tokenización, por lotes.
Tenga en cuenta que el uso de map(batched=True) es muy eficiente para procesar lotes, ya que minimiza el uso de memoria y acelera los flujos de trabajo de transformación. Este método es especialmente útil para manejar datos de texto y tabulares en tareas de PLN y aprendizaje automático.
Conclusión
En esta guía sobre cómo dividir un conjunto de datos en lotes, ha explorado los mejores enfoques, bibliotecas y soluciones para dividir datos en Python. El objetivo es dividir un conjunto de datos grande en partes más manejables para simplificar y acelerar el procesamiento de datos.
Independientemente del enfoque que elija, todas las soluciones anteriores dependen de tener acceso a un conjunto de datos con la información de interés. Si bien algunos conjuntos de datos están disponibles gratuitamente para la investigación científica, no siempre es así.
Si necesita conjuntos de datos que abarquen categorías que van desde las finanzas hasta los datos cinematográficos, eche un vistazo al mercado de conjuntos de datos de Bright Data. Este le proporciona acceso a cientos de conjuntos de datos de sitios populares, clasificados en:
- Conjuntos de datos empresariales: datos de fuentes clave como LinkedIn, CrunchBase, Owler e Indeed.
- Conjuntos de datos de comercio electrónico: datos de Amazon, Walmart, Target, Zara, Zalando, Asos y muchos más.
- Conjuntos de datos inmobiliarios: datos de sitios web como Zillow, MLS y muchos más.
- Conjuntos de datos de redes sociales: datos de Facebook, Instagram, YouTube y Reddit.
- Conjuntos de datos financieros: datos de Yahoo Finance, Market Watch, Investopedia y más.
Si estas opciones predefinidas no satisfacen sus necesidades, considere nuestrosservicios de recopilación de datos personalizados.
Además, Bright Data ofrece una amplia gama de potentes herramientas de scraping, incluidas las API de Web Scraper y el Navegador de scraping.
¡Cree una cuenta gratuita en Bright Data para empezar a explorar estos Conjuntos de datos!