In diesem Leitfaden erfahren Sie:
- Die Definition von Batch
- Warum Datensätze in Batches verarbeitet werden sollten
- Wie man Datensätze in Python in Batches aufteilt
- Der Ansatz der
Datensatz-map()-Batch-Option
Lassen Sie uns loslegen!
Was ist ein Batch?
In der Welt des maschinellen Lernens und der Datenverarbeitung ist ein Batch nichts anderes als eine Teilmenge eines Datensatzes. Batches werden in der Regel verwendet, um große Datenmengen effizient zu verarbeiten. Anstatt einen gesamten Datensatz auf einmal zu verarbeiten, werden die Daten in kleinere Einheiten, sogenannte Batches, aufgeteilt. Jeder Batch kann unabhängig verarbeitet werden, was zur Reduzierung des Speicherbedarfs und zur Verbesserung der Recheneffizienz beiträgt.
Nehmen wir zum Beispiel an, Sie haben einige Beispieldaten im CSV-Format:
id,name,age,score
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
Ein Teil des oben genannten Datensatzes lautet:
6,David,35,79
7,Eve,22,95
8,Frank,31,82
9,Grace,27,86
10,Hannah,26,80
Dieser Stapel schneidet den ursprünglichen Datensatz von Zeile 5 bis 10.
Vorteile der Verarbeitung eines Datensatzes in Batches
Angenommen, Sie haben einen Datensatz, den Sie mithilfe bestimmter Datenbeschaffungstechniken erstellt haben. Wenn Sie mit diesem Prozess nicht vertraut sind, folgen Sie unserer Anleitung zum Erstellen eines Datensatzes.
Warum sollten Sie diesen Datensatz in Batches verarbeiten? Weil dies die folgenden Vorteile mit sich bringt:
- Speichereffizienz: Arbeiten Sie mit kleineren, besser verwaltbaren Teilen auf einmal, anstatt den gesamten Datensatz in den Speicher zu laden.
- Schnellere Verarbeitung: Die Stapelverarbeitung kann parallelisiert werden, wodurch sich die für die Verarbeitung großer Datensätze erforderliche Zeit verkürzt.
- Besseres Training für ML-Modelle: Unterstützt das Training von Machine-Learning-Modellen durch inkrementelle Aktualisierung der Gewichte, was zu einer stabileren und schnelleren Konvergenz führen kann.
- Verbesserte Skalierbarkeit: Erleichtern Sie die Skalierung Ihrer Verarbeitung auf große Datensätze, die möglicherweise nicht auf einmal in den Speicher passen.
So teilen Sie einen Datensatz in Batches auf: Die 5 besten Ansätze
Bevor wir uns mit den besten Python-Methoden zum Aufteilen eines Datensatzes in Batches befassen, sollten wir einige Kriterien zur Bewertung dieser Ansätze festlegen. Hier ist eine Liste mit wichtigen Aspekten, die es zu berücksichtigen gilt:
- Implementierung: Ein Snippet, das anhand eines einfachen Beispiels zeigt, wie der Ansatz verwendet wird.
- Szenarien: Die realen Situationen, in denen der Ansatz zur Aufteilung von Datensätzen anwendbar ist.
- Eingabe: Die Arten von Datensatzdateien und Datenstrukturen, die die Aufteilungsstrategie unterstützt.
- Vorteile: Die Vorteile des Ansatzes.
- Nachteile: Die Einschränkungen oder Nachteile der Methode.
Zeit, sie einzeln zu analysieren!
Ansatz Nr. 1: Array-Slicing
Array Slicing ist eine einfache Methode, um einen Datensatz in kleinere, besser verwaltbare Einheiten aufzuteilen. Die Idee besteht darin, einen Datensatz (dargestellt durch eine Liste, ein Array oder eine andere Sequenz) durch Aufteilen in Blöcke zu unterteilen.
👨💻 Implementierung:
def create_batches(data, batch_size):
return [data[i:i + batch_size] for i in range(0, len(data), batch_size)]
# Anwendungsbeispiel
data = list(range(1, 51)) # Beispieldatensatz
batches = create_batches(data, batch_size=5)
print(batches)
# Ausgabe: [[1, 2, 3, 4, 5], ..., [46, 47, 48, 49, 50]]
🎯 Szenarien:
- Datenvorverarbeitungsaufgaben, bei denen die Speicherbeschränkungen minimal sind
- Parallele Datenverarbeitungsaufgaben, die überschaubare In-Memory-Blöcke erfordern
- Einfache Stapelverarbeitung in Datenpipelines
🔠 Eingabe:
- Listen, Arrays und Tupel in Python.
- Numpy-Arrays
- CSV-Daten, die als Liste von Zeilen in den Speicher geladen werden
- Pandas DataFrames, wenn sie in Listen oder Arrays konvertiert wurden
👍 Vorteile:
- Einfach und leicht zu implementieren
- Erfordert keine externen Bibliotheken
- Bietet direkte Kontrolle über die Batch-Größen
👎 Nachteile:
- Begrenzt durch verfügbaren Speicher
- Unterstützt keine extrem großen Datensätze oder komplexen Datenstrukturen
- Erfordert benutzerdefinierte Logik für das Mischen von Daten
Ansatz Nr. 2: Generatoren
Mit Python-Generatoren können Sie einen Datensatz in Batches aufteilen, indem Sie jeweils einen Batch ausgeben. Falls Sie mit diesem Mechanismus nicht vertraut sind: Ein Generator ist eine spezielle Art von Funktion, die sich wie ein Iterator verhält. Anstatt Daten direkt zurückzugeben, verwendet er das Schlüsselwort „yield“, um ein Iterator-Objekt zu erzeugen. Dadurch können Batches mit einer for-Schleife oder der Funktion next() sequenziell abgerufen werden.
👨💻 Implementierung:
def data_generator(data, batch_size):
for i in range(0, len(data), batch_size):
yield data[i:i + batch_size]
# Anwendungsbeispiel
data = list(range(1, 51)) # Beispieldatensatz
for batch in data_generator(data, batch_size=5):
print(batch)
# Ausgabe:
# [1, 2, 3, 4, 5]
# ...
# [46, 47, 48, 49, 50]
🎯 Szenarien:
- Batch-Verarbeitung in Datenpipelines
- Groß angelegte Datenvorverarbeitungs- und -erweiterungsaufgaben
- Von einfacher bis komplexer Batch-Verarbeitung in Datenpipelines
🔠 Eingabe:
- Listen, Arrays und Tupel
- NumPy-Arrays
- Dateibasierte Datensätze, bei denen das Laden jedes Batches von der Festplatte möglich ist
👍 Vorteile:
- Kann große Datensätze verarbeiten, ohne sie vollständig in den Arbeitsspeicher zu laden
- Minimaler Einrichtungsaufwand und einfache Implementierung
- Ermöglicht kontrolliertes Laden von Daten nach Bedarf
👎 Nachteile:
- Begrenzt durch die Datenreihenfolge, sofern kein zusätzliches Shuffling implementiert wird
- Weniger effektiv bei dynamischen oder variablen Batch-Größen
- Möglicherweise nicht die beste Lösung für die parallele Verarbeitung, insbesondere bei Multithread-Operationen
Ansatz Nr. 3: PyTorch DataLoader
Die DataLoader-Klasse von PyTorch hilft Ihnen dabei, Datensätze effizient in überschaubare Batches aufzuteilen. Als spezialisierte Datenstruktur für die Verarbeitung von Datensätzen bietet sie auch nützliche Funktionen wie Shuffling und paralleles Laden von Daten.
Beachten Sie, dass DataLoader mit TensorDataset zusammenarbeitet, einer weiteren PyTorch-Datenstruktur, die zur Darstellung eines Datensatzes dient. Konkret akzeptiert ein TensorDataset zwei Argumente:
inps: Die Eingabedaten, typischerweise in Form einesTensors.tgts: Die Labels oder Zielwerte, ebenfalls typischerweise als Tensor, die den Eingabedaten entsprechen.
TensorDataset verknüpft die Daten und das Ziel miteinander, die dann vom DataLoader für die Stapelverarbeitung und das Training geladen werden können.
👨💻 Implementierung:
from torch.utils.data import DataLoader, TensorDataset
import torch
# Daten zur Definition eines einfachen Datensatzes
inputs = torch.arange(1, 51).float().reshape(-1, 1) # ein 1D-Tensor-Datensatz (Eingabe)
targets = inputs ** 2 # Quadrat der Eingabewerte (Simulation einer Regressionsaufgabe)
# Erstellen eines TensorDataset und DataLoader
dataset = TensorDataset(inputs, targets)
dataloader = DataLoader(dataset, batch_size=5, shuffle=True)
# DataLoader durchlaufen
for batch in dataloader:
print(batch)
# Beispielausgabe:
# [tensor([[46.],
# [42.],
# [25.],
# [10.],
# [34.]]), tensor([[2116.],
# [1764.],
# [ 625.],
# [ 100.],
# [1156.]])]
# ...
# [Tensor([[21.],
# [ 9.],
# [ 2.],
# [38.],
# [44.]]), Tensor([[ 441.],
# [ 81.],
# [ 4.],
# [1444.],
# [1936.]])]
🎯 Szenarien:
- Training und Testen von Machine-Learning-Modellen in PyTorch
- Mischen von Daten für unverzerrte Trainingsstapel
- Groß angelegte Datenverarbeitung für Deep-Learning-Aufgaben
🔠 Eingabe:
- Benutzerdefinierte Datensätze, die in PyTorch
TensorDatasetsgeladen wurden - Tabellarische Daten und numerische Arrays im
Tensor-Format
👍 Vorteile:
- Optimiert für große Datensätze mit Batching und Shuffling
- Unterstützt paralleles Laden von Daten und beschleunigt so den Batch-Abruf
- Funktioniert nahtlos mit PyTorch-Modellen und Trainingsschleifen
- Kompatibel mit GPU-Verarbeitung
👎 Nachteile:
- Erfordert PyTorch
- Erfordert Datenkonvertierung in Tensoren.
- Nicht ideal für Batch-Verarbeitungsaufgaben außerhalb des ML-Bereichs
Ansatz Nr. 4: TensorFlow-Methode batch()
Die TensorFlow Dataset batch() -Methode zum Aufteilen von Datensätzen in Batches. Diese Methode unterteilt den Datensatz in kleinere Teile und bietet Funktionen wie Parallelisierung, Kontrolle über die Verarbeitungsreihenfolge und Benennung.
Als Bibliothek für maschinelles Lernen bietet TensorFlow auch zusätzliche Funktionen wie Shuffling, Wiederholung und Prefetching.
👨💻 Implementierung:
import tensorflow as tf
# Erstellen eines Beispieldatensatzes
inputs = tf.range(1, 51, dtype=tf.float32) # ein 1D-Tensor-Datensatz (Eingaben)
targets = inputs ** 2 # Quadrat der Eingabewerte (Simulation einer Regressionsaufgabe)
# Konvertieren der Eingaben und Ziele in tf.data.Dataset
inputs_dataset = tf.data.Dataset.from_tensor_slices(inputs)
targets_dataset = tf.data.Dataset.from_tensor_slices(targets)
# Erstellen eines Datensatzes durch Zusammenfügen der Eingaben und Ziele
dataset = tf.data.Dataset.zip((inputs_dataset, targets_dataset))
# Erstellen eines Batch-Datensatzes
batched_dataset = dataset.batch(batch_size=5)
for batch in batched_dataset:
print(batch)
# Ausgabe:
# (<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: shape=(5,), dtype=float32, numpy=array([2116., 2209., 2304., 2401., 2500.], dtype=float32)>)
🎯 Szenarien:
- Training und Testen von Machine-Learning-Modellen in PyTorch
- Mischen von Daten für unverzerrte Trainingsstapel
- Groß angelegte Datenverarbeitung für Deep-Learning-Aufgaben
🔠 Eingabe:
- TensorFlow
tf.data.Dataset-Objekte - NumPy-Arrays (die in
Datasetkonvertiert werden können) - TFRecord-Dateien, ein spezielles Binärdateiformat, das häufig zum Speichern großer Datensätze in TensorFlow verwendet wird
👍 Vorteile:
- Optimiert für effiziente Speichernutzung
- Nahtlose Integration in das TensorFlow-Ökosystem für das Training und die Bewertung von Modellen
- Unterstützt Shuffling, Prefetching und andere nützliche Funktionen
- Unterstützt eine Vielzahl von Datenformaten, darunter Bilder, Text und strukturierte Daten
👎 Nachteile:
- Erfordert TensorFlow
- Bei komplexeren Datensätzen sind möglicherweise zusätzliche Einstellungen erforderlich, um die Daten ordnungsgemäß zu formatieren und vorzuverarbeiten
- Kann bei kleineren Datensätzen zu einem Mehraufwand beim Batching führen
Ansatz Nr. 5: HDF5-Format
HDF5 ist ein weit verbreitetes Datenformat für die Verwaltung großer Datensätze, insbesondere bei hierarchischen Datenstrukturen. Es unterstützt die Aufteilung großer Datensätze in Blöcke und deren effiziente Speicherung.
Die Python-Bibliothek h5py bietet Tools für die Arbeit mit HDF5-Dateien und deren Laden als NumPy-Datenstrukturen. Dies eröffnet die Möglichkeit der Stapelverarbeitung von Datensätzen, indem bei Bedarf auf bestimmte Ausschnitte oder Segmente der Daten zugegriffen werden kann.
👨💻 Implementierung:
import h5py
import numpy as np
# Laden und Batch-Verarbeitung der Daten aus der HDF5-Datei
def load_data_in_batches(batch_size=10):
# Öffnen einer HDF5-Datei
with h5py.File("dataset.h5", "r") as f:
inputs = f["input"]
targets = f["target"]
# Daten mit einem Iterator von der Festplatte stapeln
for i in range(0, len(data), batch_size):
yield inputs[i:i+batch_size], targets[i:i+batch_size]
# Batches durchlaufen
for batch_data, batch_target in load_data_in_batches():
print("Input Batch:", batch_input)
print("Targe Batch:", batch_target)
# Ausgabe:
# Input Batch: [[ 1]
# [ 2]
# [ 3]
# [ 4]
# [ 5]
# [ 6]
# [ 7]
# [ 8]
# [ 9]
# [10]]
# Ziel-Batch: [[ 1]
# [ 4]
# [ 9]
# [ 16]
# [ 25]
# [ 36]
# [ 49]
# [ 64]
# [ 81]
# [100]]
# ...
# Eingabebatch: [[41]
# [42]
# [43]
# [44]
# [45]
# [46]
# [47]
# [48]
# [49]
# [50]]
# Zielbatch: [[1681]
# [1764]
# [1849]
# [1936]
# [2026]
# [2116]
# [2209]
# [2304]
# [2401]
# [2500]]
🎯 Szenarien:
- Ideal für sehr große Datensätze, die nicht vollständig in den Arbeitsspeicher geladen werden können
- Nützlich bei der Arbeit mit mehrdimensionalen Daten
- Geeignet zum Speichern und Abrufen von Daten von der Festplatte in einem effizienten, komprimierten Format für Machine-Learning-Aufgaben
🔠 Eingabe:
- HDF5-Dateien
👍 Vorteile:
- HDF5 unterstützt Datenkomprimierung und Chunking, wodurch der Speicherbedarf für große Datensätze reduziert wird
- Ermöglicht effizienten Direktzugriff auf Teile großer Datensätze, ohne dass diese vollständig in den Arbeitsspeicher geladen werden müssen
- Kann mehrere Datensätze in einer einzigen Datei speichern und eignet sich daher gut für komplexe Datensätze.
- Wird von vielen wissenschaftlichen Bibliotheken unterstützt, darunter NumPy, TensorFlow und PyTorch
👎 Nachteile:
- Erfordert zusätzliche Einrichtung und Kenntnisse des HDF5-Formats
- Für eine vollständige API zur Verarbeitung von HDF5-Dateien ist die
h5py-Bibliothek erforderlich - Nicht alle Datensätze sind im HDF5-Format verfügbar
Andere Lösungen
Die oben vorgestellten Ansätze gehören zwar zu den besten Möglichkeiten, einen Datensatz in Stapel aufzuteilen, aber es gibt auch andere praktikable Lösungen.
Eine weitere mögliche Lösung ist die Verwendung der Hugging Face-Datensätze. Diese bietet Ihnen alles, was Sie benötigen, um Transformationen auf einen gesamten Datensatz anzuwenden und ihn gleichzeitig stapelweise zu verarbeiten. Durch Setzen von batched=True können Sie Transformationen auf Stapelebene definieren, ohne den Datensatz manuell zu zerlegen, wie im folgenden Beispiel gezeigt:
from Datensätze import load_dataset
# Laden eines Beispieldatensatzes
dataset = load_dataset("imdb", split="train")
# Batch-Verarbeitungsfunktion definieren
def process_batch(batch):
# einfache Tokenisierungsaufgabe
return {"tokens": [text.split() for text in batch["text"]]}
# Batch-Verarbeitung anwenden
batched_dataset = dataset.map(process_batch, batched=True, batch_size=32)
Die Option dataset map() batched=True ist ideal, wenn Sie Transformationen wie Tokenisierung in Batches anwenden müssen.
Beachten Sie, dass die Verwendung von map(batched=True) für die Verarbeitung von Batches sehr effizient ist, da sie den Speicherverbrauch minimiert und Transformations-Workflows beschleunigt. Diese Methode ist besonders nützlich für die Verarbeitung von Text- und Tabellendaten in NLP- und Machine-Learning-Aufgaben.
Fazit
In diesem Leitfaden zum Aufteilen von Datensätzen in Batches haben Sie die besten Ansätze, Bibliotheken und Lösungen für das Aufteilen von Daten in Python kennengelernt. Das Ziel besteht darin, einen großen Datensatz in besser verwaltbare Teile aufzuteilen, um die Datenverarbeitung zu vereinfachen und zu beschleunigen.
Unabhängig davon, für welchen Ansatz Sie sich entscheiden, sind alle oben genannten Lösungen davon abhängig, dass Sie Zugriff auf einen Datensatz mit den gewünschten Daten haben. Einige Datensätze sind für wissenschaftliche Forschungszwecke frei verfügbar, dies ist jedoch nicht immer der Fall.
Wenn Sie Datensätze benötigen, die verschiedene Kategorien von Finanzdaten bis hin zu Filmdaten umfassen, schauen Sie sich den Datensatz-Marktplatz von Bright Data an. Dort erhalten Sie Zugriff auf Hunderte von Datensätzen aus beliebten Websites, die in folgende Kategorien unterteilt sind:
- Geschäftsdatensätze: Daten aus wichtigen Quellen wie LinkedIn, CrunchBase, Owler und Indeed.
- E-Commerce-Datensätze: Daten von Amazon, Walmart, Target, Zara, Zalando, Asos und vielen anderen.
- Immobiliendatensätze: Daten von Websites wie Zillow, MLS und anderen.
- Social-Media-Datensätze: Daten von Facebook, Instagram, YouTube und Reddit.
- Finanzdatensätze: Daten von Yahoo Finance, Market Watch, Investopedia und anderen.
Wenn diese vorgefertigten Optionen Ihren Anforderungen nicht entsprechen, sollten Sie unseremaßgeschneiderten Datenerfassungsdienste in Betracht ziehen.
Darüber hinaus bietet Bright Data eine breite Palette leistungsstarker Scraping-Tools, darunter Web Scraper APIs und Scraping-Browser.
Erstellen Sie kostenlos ein Bright Data-Konto, um diese Datensätze zu erkunden!