本文的目标读者:想要对大型数据集执行Pandas/NumPy操作的人。想要使用Python对大数据执行机器学习任务的人。本文将使用.csv格式的文件来演示python的各种操作,其他格式如数组、文本文件等,为什么我们不能用pandas处理大型机器学习数据集呢?我们知道Pandas使用计算机内存(RAM)来加载您的机器学习数据集,但是如果您的计算机有8GB的内存(RAM),为什么pandas仍然无法加载2GB的数据集?原因是用Pandas加载一个2GB的文件需要超过2GB的RAM,因为总内存需求取决于数据集的大小和您将对其执行的操作。以下是加载到计算机内存中的不同大小数据集的快速比较:此外,Pandas仅使用操作系统的一个核心,这使得处理速度变慢。换句话说,我们可以说pandas不支持并行性(将问题分解为更小的任务)。假设电脑有4核,下图是pandas在加载CSV文件时使用的核数:pandas一般不用来处理大型机器学习数据集的原因主要有两个,一是电脑内存占用量,另一个是缺乏平行性。在NumPy和Scikit-learn中,大型数据集面临同样的问题。为了解决这两个问题,我们可以使用一个名为Dask的python库,它使我们能够在大型数据集上执行各种操作,例如pandas、NumPy和ML。达斯克是如何运作的?Dask将你的数据集加载到分区中,而pandas通常将整个机器学习数据集作为一个数据框。在Dask中,数据集的每个分区都被视为一个pandas数据框。Dask一次加载一个分区,因此您不必担心内存分配错误。下面是使用dask在计算机内存中加载不同大小的机器学习数据集的比较:Dask解决了并行性问题,因为它将数据拆分为多个分区,每个分区使用单独的核心,这使得数据集上的计算速度更快。假设一台有4个内核的计算机,这是加载5GBcsv文件时dask的样子:要使用dask库,你可以安装它:pipinstalldaskDask有几个模块,如dask.array、dask.dataframe和dask.distributed,仅当您分别安装了相应的库(例如NumPy、pandas和Tornado)时才有效。如何使用dask处理大型CSV文件?dask.dataframe用于处理大型csv文件,首先我尝试使用pandas导入大小为8GB的数据集。importpandasaspddf=pd.read_csv("data.csv")它在我的16GBRAM笔记本电脑中引发内存分配错误。现在,尝试使用dask.dataframe导入相同的8GB数据dask只需一秒钟即可将整个8GB文件加载到ddf变量中。让我们看看ddf变量的输出。可以看到,执行时间为0.5秒,这说明已经划分了119个分区。您还可以使用以下方式检查数据帧的分区数:默认情况下,dask将我的8GBCSV文件加载到119个分区(每个64MB),这是根据您计算机的可用物理内存和内核数来完成的。也可以在加载CSV文件时使用blocksize参数指定我自己的分区数。现在指定一个字符串值为400MB的blocksize参数,这使得每个分区大小为400MB,让我们看看有多少个分区关键点:使用DaskDataFrames时,一个好的经验法则是将分区保持在100MB以下。数据帧的特定分区可以使用以下方式调用:最后一个分区也可以使用负索引调用,就像我们在调用列表的最后一个元素时所做的那样。让我们看一下数据集的形状:您可以使用len()检查数据集的行数:Dask已经包含一个示例数据集。我将使用时间序列数据向您展示dask如何对数据集执行数学运算。导入dask.datasets后,ddf_20y加载了从2000年1月1日到2021年12月31日的时间序列数据。让我们看看我们的时间序列数据的分区数。20年时间序列数据分布在8035个分区中。在pandas中,我们使用head来打印数据集的前几行,而dask也是这样做的。让我们计算id列的平均值。dask不打印数据帧的总行数,因为它使用惰性计算(直到需要时才显示输出)。要显示输出,我们可以使用compute方法。假设我想对数据集的每一列进行归一化(将值转换为0和1之间的值),Python代码如下:循环遍历列,找到每一列的最小值和最大值,并使用一个简单的数学公式对这些列进行归一化。关键点:在我们的归一化示例中,不要认为实际的数值计算会发生,这只是惰性评估(直到需要时才会向您显示输出)。为什么使用Dask阵列?Dask将数组分成小块,其中每个块都是一个NumPy数组。dask.arrays用于处理大型数组,下面的Python代码使用dask创建一个10000x10000的数组并将其存储在x变量中。调用x变量会产生有关数组的各种信息。查看针对数组的特定元素对dask数组进行数学运算的Python示例:如您所见,由于延迟执行,它没有显示输出。我们可以使用compute来显示输出:dask数组支持大多数NumPy接口,如下所示:数学运算:+,*,exp,log,...sum(),mean(),std(),sum(axis=0),...张量/点积/矩阵乘法:张量点重新排序/转置:转置切片:x[:100,500:100:-2]使用列表或NumPy数组的索引:x[:,[10,1,5]]线性代数:svd、qr、solve、solve_triangular、lstsq但是,DaskArray没有实现完整的NumPy接口。你可以从他们的官方文档中了解更多关于dask.arrays的信息。什么是DaskPersist?假设您想对机器学习数据集执行一些耗时的操作,您可以将数据集保存在内存中以使数学运算运行得更快。从dask.datasets导入时间序列数据让我们获取数据集的一个子集并计算该子集中的总行数。计算总行数需要27秒。我们现在使用persist方法:总共花了2分钟来持久化我们的子集,现在我们来统计总行数。同样,我们可以对持久数据集执行其他操作以减少计算时间。持久化应用场景:大量数据获取数据子集对子集应用不同的操作为什么选择DaskML?DaskML使用流行的Python机器学习库(如Scikitlearn等)帮助在大型数据集上应用ML(机器学习)算法。我什么时候应该使用daskML?数据并不大(或适合RAM),但经过训练的机器学习模型需要大量超参数,并且调整或集成技术需要花费大量时间。数据量巨大。可以看到,随着模型大小的增加,比如制作一个复杂的模型,有大量的超参数,会导致计算边界的问题,如果数据大小增加,则会导致内存分配错误。所以在这两种情况下(红色阴影区域)我们都使用Dask来解决这些问题。正如官方文档中所述,daskml库用例:对于内存问题,只需使用scikit-learn(或其他ML库)。对于大型模型,使用dask_ml.joblib和scikit-learn估计器。对于大型数据集,使用dask_ml估计器。让我们看看Dask的架构。分布式:Dask使您能够在计算机集群上运行任务。在dask.distributed中,一旦你分发了一个任务,它就会立即开始执行。简单的说,client就是提交任务的你,执行任务的worker,scheduler执行两者之间的通信。python-mpipinstalldaskdistributed--upgrade如果你使用的是单机,你可以通过以下方式创建一个有4个worker的dask集群。如果你需要一个仪表板,你可以安装bokeh。安装bokeh的命令如下:pipinstallbokeh就像我们从dask.distributed创建客户端一样,我们也可以从dask.distributed创建调度器。要使用daskML库,您必须使用以下命令安装它:pipinstalldask-ml我们将使用Scikit-learn库来演示dask-ml。假设我们使用Grid_Search方法,我们通常使用dask.distributed创建一个集群,使用以下Python代码:为了用集群拟合scikit-learn模型,我们只需要使用joblib。
