Heim >Technologie-Peripheriegeräte >KI >Eine einfache Möglichkeit, große Datensätze für maschinelles Lernen in Python zu verarbeiten
Die Zielgruppe dieses Artikels:
In diesem Artikel werden Dateien im CSV-Format verwendet, um verschiedene Vorgänge von Python sowie andere Formate wie Arrays und Textdateien zu demonstrieren , usw. .
Wir wissen, dass Pandas Computerspeicher (RAM) verwendet, um Ihren Datensatz für maschinelles Lernen zu laden. Wenn Ihr Computer jedoch über 8 GB Speicher (RAM) verfügt, warum können Pandas dann immer noch nicht 2 GB davon laden? Was ist damit? der Datensatz? Der Grund dafür ist, dass das Laden einer 2-GB-Datei mit Pandas nicht nur 2 GB RAM, sondern auch mehr Speicher erfordert, da der Gesamtspeicherbedarf von der Größe des Datensatzes und den Vorgängen abhängt, die Sie an diesem Datensatz ausführen.
Hier ist ein schneller Vergleich unterschiedlich großer Datensätze, die in den Computerspeicher geladen werden:
Darüber hinaus verwendet Pandas nur einen Kern des Betriebssystem, was die Verarbeitung verlangsamt. Mit anderen Worten können wir sagen, dass Pandas keine Parallelität (Aufteilung eines Problems in kleinere Aufgaben) unterstützt.
Unter der Annahme, dass der Computer über 4 Kerne verfügt, zeigt das folgende Bild die Anzahl der von Pandas beim Laden einer CSV-Datei verwendeten Kerne:
# 🎜🎜#Allgemein Es gibt zwei Hauptgründe, Pandas nicht zur Verarbeitung großer Datensätze für maschinelles Lernen zu verwenden: Der eine ist die Speichernutzung des Computers und der andere der Mangel an Parallelität. Bei NumPy und Scikit-learn besteht bei großen Datensätzen das gleiche Problem. Um diese beiden Probleme zu lösen, können Sie eine Python-Bibliothek namens Dask verwenden, die es uns ermöglicht, verschiedene Operationen wie Pandas, NumPy und ML für große Datensätze auszuführen. Wie funktioniert Dask? Dask lädt Ihren Datensatz in Partitionen, während Pandas normalerweise den gesamten Datensatz für maschinelles Lernen als Datenrahmen verwendet. In Dask wird jede Partition eines Datensatzes als Pandas-Datenrahmen betrachtet. Dask lädt jeweils eine Partition, sodass Sie sich keine Sorgen über Speicherzuweisungsfehler machen müssen. Hier ist ein Vergleich der Verwendung von Dask zum Laden von Datensätzen für maschinelles Lernen unterschiedlicher Größe in den Computerspeicher: Dask löste Parallelität Probleme, da die Daten in mehrere Partitionen aufgeteilt werden, die jeweils einen separaten Kern verwenden, was die Berechnungen für den Datensatz beschleunigt. Angenommen, der Computer verfügt über 4 Kerne, würde Dask wie folgt eine 5-GB-CSV-Datei laden: Um dask zu verwenden Bibliothek können Sie sie mit dem folgenden Befehl installieren:<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span>Dask verfügt über mehrere Module, wie zum Beispiel dask.array, dask.dataframe und dask.distributed, die nur installiert werden können, wenn Sie die entsprechenden installiert haben Bibliotheken (wie NumPy, Pandas und Tornado). Wie verwende ich Dask, um große CSV-Dateien zu verarbeiten? dask.dataframe wird zum Verarbeiten großer CSV-Dateien verwendet. Zuerst habe ich versucht, mit Pandas einen Datensatz mit einer Größe von 8 GB zu importieren.
<span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">import</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pandas</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">as</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pd</span><br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">df</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pd</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">read_csv</span>(<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">“data</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">csv”</span>)Es hat einen Speicherzuordnungsfehler in meinem 16-GB-RAM-Laptop ausgelöst. Versuchen Sie nun, dieselben 8-GB-Daten mit dask.dataframe zu importieren Die GB-Datei wird in die ddf-Variable geladen. Sehen wir uns die Ausgabe der ddf-Variablen an. Wie Sie sehen können, beträgt die Ausführungszeit 0,5 Sekunden und hier wird gezeigt, dass sie in 119 Partitionen unterteilt wurde. Sie können die Anzahl der Partitionen des Datenrahmens auch überprüfen, indem Sie Folgendes verwenden: Standardmäßig wird dask mein GB Die CSV-Datei wird in 119 Partitionen geladen (jede Partitionsgröße beträgt 64 MB), was auf der Grundlage des verfügbaren physischen Speichers und der Anzahl der Kerne des Computers erfolgt.
Ich kann beim Laden der CSV-Datei auch meine eigene Anzahl an Partitionen angeben, indem ich den Blocksize-Parameter verwende.
Jetzt wird ein Blocksize-Parameter mit einem String-Wert von 400 MB angegeben, wodurch jede Partition 400 MB groß ist. Schauen wir uns an, wie viele Partition #🎜 es gibt 🎜#
Wichtiger Punkt: Bei der Verwendung von Dask DataFrames besteht eine gute Faustregel darin, Partitionen unter 100 MB zu halten. Verwenden Sie die folgende Methode, um eine bestimmte Partition des Datenrahmens aufzurufen: Die letzte Partition kann auch mit aufgerufen werden ein negativer Index, genau wie wir es beim Aufruf des letzten Elements der Liste getan haben. Sehen wir uns die Form des Datensatzes an: Sie können len() verwenden, um die Anzahl der Zeilen zu überprüfen Datensatz: Dask enthält bereits einen Beispieldatensatz. Ich verwende Zeitreihendaten, um Ihnen zu zeigen, wie dask mathematische Operationen an einem Datensatz ausführt. Nach dem Import von dask.datasets hat ddf_20y die Zeitreihendaten vom 1. Januar 2000 bis 31. Dezember 2021 geladen. Sehen wir uns die Anzahl der Partitionen für unsere Zeitreihendaten an. Die 20-jährigen Zeitreihendaten sind in 8035 Partitionen verteilt. In Pandas verwenden wir head, um die ersten paar Zeilen des Datensatzes zu drucken, und das Gleiche gilt für dask. Lassen Sie uns den Durchschnitt der ID-Spalte berechnen. dask druckt nicht die Gesamtzahl der Zeilen des Datenrahmens, da es verzögerte Berechnungen verwendet (die Ausgabe wird erst angezeigt, wenn sie benötigt wird). Um die Ausgabe anzuzeigen, können wir die Berechnungsmethode verwenden. Angenommen, ich möchte jede Spalte des Datensatzes normalisieren (den Wert zwischen 0 und 1 umwandeln). Der Python-Code lautet wie folgt: # 🎜🎜#Durchlaufen Sie die Spalten, ermitteln Sie die Minimal- und Maximalwerte für jede Spalte und normalisieren Sie die Spalten mithilfe einer einfachen mathematischen Formel.
Kernpunkt: Denken Sie in unserem Normalisierungsbeispiel nicht, dass eine tatsächliche numerische Berechnung stattfindet, es handelt sich lediglich um eine verzögerte Auswertung (die Ausgabe wird Ihnen erst angezeigt, wenn sie benötigt wird).
Warum Dask-Array verwenden?
dask.arrays wird verwendet, um große Arrays zu verarbeiten. Der folgende Python-Code verwendet dask, um ein Array von 10000 x 10000 zu erstellen und es im x zu speichern variabel.
Der Aufruf der x-Variablen erzeugt verschiedene Informationen über das Array.
Spezifische Elemente eines Arrays anzeigen
Python-Beispiel für die Ausführung mathematischer Operationen an einem Dask-Array:
# 🎜🎜 #正如您所看到的,由于延迟执行,它不会向您显示输出。我们可以使用compute来显示输出:
dask 数组支持大多数 NumPy 接口,如下所示:
但是,Dask Array 并没有实现完整 NumPy 接口。
你可以从他们的官方文档中了解更多关于 dask.arrays 的信息。
假设您想对机器学习数据集执行一些耗时的操作,您可以将数据集持久化到内存中,从而使数学运算运行得更快。
从 dask.datasets 导入了时间序列数据
让我们取数据集的一个子集并计算该子集的总行数。
计算总行数需要 27 秒。
我们现在使用 persist 方法:
持久化我们的子集总共花了 2 分钟,现在让我们计算总行数。
同样,我们可以对持久化数据集执行其他操作以减少计算时间。
persist应用场景:
Dask ML有助于在大型数据集上使用流行的Python机器学习库(如Scikit learn等)来应用ML(机器学习)算法。
什么时候应该使用 dask ML?
正如你所看到的,随着模型大小的增加,例如,制作一个具有大量超参数的复杂模型,它会引起计算边界的问题,而如果数据大小增加,它会引起内存分配错误。因此,在这两种情况下(红色阴影区域)我们都使用 Dask 来解决这些问题。
如官方文档中所述,dask ml 库用例:
让我们看一下 Dask.distributed 的架构:
Dask 让您能够在计算机集群上运行任务。在 dask.distributed 中,只要您分配任务,它就会立即开始执行。
简单地说,client就是提交任务的你,执行任务的是Worker,调度器则执行两者之间通信。
python -m <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span> distributed –upgrade
如果您使用的是单台机器,那么就可以通过以下方式创建一个具有4个worker的dask集群
如果需要dashboard,可以安装bokeh,安装bokeh的命令如下:
<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">bokeh</span>
就像我们从 dask.distributed 创建客户端一样,我们也可以从 dask.distributed 创建调度程序。
要使用 dask ML 库,您必须使用以下命令安装它:
<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">pip</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">dask</span>-ml
我们将使用 Scikit-learn 库来演示 dask-ml 。
Angenommen, wir verwenden die Grid_Search-Methode, verwenden wir normalerweise den folgenden Python-Code
Erstellen Sie einen Cluster mit dask.distributed:
Um das Scikit-Learn-Modell mithilfe von Clustern anzupassen, müssen wir lediglich joblib verwenden.
Das obige ist der detaillierte Inhalt vonEine einfache Möglichkeit, große Datensätze für maschinelles Lernen in Python zu verarbeiten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!