目录
为什么我们不能将 pandas 用于大型机器学习数据集呢?
Dask是如何工作的?
如何使用 dask 处理大型 CSV 文件?
为什么要使用 Dask 数组?
查看数组的特定元素
什么是Dask Persist?
为什么选择 Dask ML?
首页 科技周边 人工智能 在 Python中处理大型机器学习数据集的简单方法

在 Python中处理大型机器学习数据集的简单方法

Apr 09, 2023 pm 07:51 PM
python 机器学习 数据集

本文的目标受众:

  1. 想要对大量数据集执行 Pandas/NumPy 操作的人。
  2. 希望使用Python在大数据上执行机器学习任务的人。

在 Python中处理大型机器学习数据集的简单方法

本文将使用 .csv 格式的文件来演示 python 的各种操作,其他格式如数组、文本文件等也是如此。

为什么我们不能将 pandas 用于大型机器学习数据集呢?

我们知道 Pandas 使用计算机内存 (RAM) 来加载您的机器学习数据集,但是,如果您的计算机有8 GB 的内存 (RAM),那么为什么 pandas 仍然无法加载 2 GB 的数据集呢?原因是使用 Pandas 加载 2 GB 文件不仅需要 2 GB RAM,还需要更多内存,因为总内存需求取决于数据集的大小以及您将在该数据集上执行的操作。

以下是加载到计算机内存中的不同大小的数据集的快速比较:

在 Python中处理大型机器学习数据集的简单方法

此外,Pandas只使用操作系统的一个内核,这使得处理速度很慢。换句话说,我们可以说pandas不支持并行(将一个问题分解成更小的任务)。

假设电脑有 4 个内核,下图是加载 CSV 文件的时候 pandas 使用的内核数:

在 Python中处理大型机器学习数据集的简单方法

普遍不使用 pandas 处理大型机器学习数据集的主要原因有以下两点,一是计算机内存使用量,二是缺乏并行性。在 NumPy 和 Scikit-learn中,对于大数据集也面临同样的问题。

为了解决这两个问题,可以使用名为Dask的python库,它能够使我们在大型数据集上执行pandas、NumPy和ML等各种操作。

Dask是如何工作的?

Dask是在分区中加载你的数据集,而pandas通常是将整个机器学习数据集作为一个dataframe。在Dask中,数据集的每个分区都被认为是一个pandas dataframe。

在 Python中处理大型机器学习数据集的简单方法

Dask 一次加载一个分区,因此您不必担心出现内存分配错误问题。

以下是使用 dask 在计算机内存中加载不同大小的机器学习数据集的比较:

在 Python中处理大型机器学习数据集的简单方法

Dask 解决了并行性问题,因为它将数据拆分为多个分区,每个分区使用一个单独的内核,这使得数据集上的计算更快。

假设电脑有 4 个内核,以下是 dask 在加载 5 GB csv 文件时的方式:

在 Python中处理大型机器学习数据集的简单方法

要使用 dask 库,您可以使用以下命令进行安装:

<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 有几个模块,如dask.array、dask.dataframe 和 dask.distributed,只有在您分别安装了相应的库(如 NumPy、pandas 和 Tornado)后才能工作。

如何使用 dask 处理大型 CSV 文件?

dask.dataframe 用于处理大型 csv 文件,首先我尝试使用 pandas 导入大小为 8 GB 的数据集。

<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>)
登录后复制

它在我的 16 GB 内存笔记本电脑中引发了内存分配错误。

现在,尝试使用 dask.dataframe 导入相同的 8 GB 数据

在 Python中处理大型机器学习数据集的简单方法

dask 只用了一秒钟就将整个 8 GB 文件加载到 ddf 变量中。

让我们看看 ddf 变量的输出。

在 Python中处理大型机器学习数据集的简单方法

如您所见,执行时间为 0.5 秒,这里显示已划分为 119 个分区。

您还可以使用以下方法检查数据帧的分区数:

在 Python中处理大型机器学习数据集的简单方法

默认情况下,dask 将我的 8 GB CSV 文件加载到 119 个分区(每个分区大小为 64MB),这是根据可用的物理内存和电脑的内核数来完成的。

还可以在加载 CSV 文件时使用 blocksize 参数指定我自己的分区数。

在 Python中处理大型机器学习数据集的简单方法

现在指定了一个字符串值为 400MB 的 blocksize 参数,这使得每个分区大小为 400 MB,让我们看看有多少个分区

在 Python中处理大型机器学习数据集的简单方法

关键点:使用 Dask DataFrames 时,一个好的经验法则是将分区保持在 100MB 以下。

使用以下方法可调用dataframe的特定分区:

在 Python中处理大型机器学习数据集的简单方法

也可通过使用负索引来调用最后一个分区,就像我们在调用列表的最后一个元素时所做的那样。

让我们看看数据集的形状:

在 Python中处理大型机器学习数据集的简单方法

您可以使用 len() 检查数据集的行数:

在 Python中处理大型机器学习数据集的简单方法

Dask 已经包含了示例数据集。我将使用时间序列数据向您展示 dask 如何对数据集执行数学运算。

在 Python中处理大型机器学习数据集的简单方法

导入dask.datasets后,ddf_20y 加载了从 2000 年 1 月 1 日到 2021 年 12 月 31 日的时间序列数据。

让我们看看我们的时间序列数据的分区数。

在 Python中处理大型机器学习数据集的简单方法

20 年的时间序列数据分布在 8035 个分区中。

在 pandas 中,我们使用 head 打印数据集的前几行,dask 也是这样。

在 Python中处理大型机器学习数据集的简单方法

让我们计算一下 id 列的平均值。

在 Python中处理大型机器学习数据集的简单方法

dask不会打印dataframe的总行数,因为它使用惰性计算(直到需要时才显示输出)。为了显示输出,我们可以使用compute方法。

在 Python中处理大型机器学习数据集的简单方法

假设我想对数据集的每一列进行归一化(将值转换为0到1之间),Python代码如下:

在 Python中处理大型机器学习数据集的简单方法

循环遍历列,找到每列的最小值和最大值,并使用简单的数学公式对这些列进行归一化。

关键点:在我们的归一化示例中,不要认为会发生实际的数值计算,它只是惰性求值(在需要之前永远不会向您显示输出)。

为什么要使用 Dask 数组?

Dask 将数组分成小块,其中每个块都是一个 NumPy 数组。

在 Python中处理大型机器学习数据集的简单方法

dask.arrays 用于处理大数组,以下Python代码使用 dask 创建了一个 10000 x 10000 的数组并将其存储在 x 变量中。

在 Python中处理大型机器学习数据集的简单方法

调用该 x 变量会产生有关数组的各种信息。

查看数组的特定元素

在 Python中处理大型机器学习数据集的简单方法

对dask 数组进行数学运算的Python示例:

在 Python中处理大型机器学习数据集的简单方法

正如您所看到的,由于延迟执行,它不会向您显示输出。我们可以使用compute来显示输出:

在 Python中处理大型机器学习数据集的简单方法

dask 数组支持大多数 NumPy 接口,如下所示:

  • 数学运算:+, *, exp, log, ...
  • sum(), mean(), std(), sum(axis=0), ...
  • 张量/点积/矩阵乘法:tensordot
  • 重新排序/转置:transpose
  • 切片:x[:100, 500:100:-2]
  • 使用列表或 NumPy 数组进行索引:x[:, [10, 1, 5]]
  • 线性代数:svd、qr、solve、solve_triangular、lstsq

但是,Dask Array 并没有实现完整 NumPy 接口。

你可以从他们的官方文档中了解更多关于 dask.arrays 的信息。

什么是Dask Persist?

假设您想对机器学习数据集执行一些耗时的操作,您可以将数据集持久化到内存中,从而使数学运算运行得更快。

从 dask.datasets 导入了时间序列数据

在 Python中处理大型机器学习数据集的简单方法

让我们取数据集的一个子集并计算该子集的总行数。

在 Python中处理大型机器学习数据集的简单方法

计算总行数需要 27 秒。

我们现在使用 persist 方法:

在 Python中处理大型机器学习数据集的简单方法

持久化我们的子集总共花了 2 分钟,现在让我们计算总行数。

在 Python中处理大型机器学习数据集的简单方法

同样,我们可以对持久化数据集执行其他操作以减少计算时间。

在 Python中处理大型机器学习数据集的简单方法

persist应用场景:

  • 数据量大
  • 获取数据的一个子集
  • 对子集应用不同的操作

为什么选择 Dask ML?

Dask ML有助于在大型数据集上使用流行的Python机器学习库(如Scikit learn等)来应用ML(机器学习)算法。

什么时候应该使用 dask ML?

  • 数据不大(或适合 RAM),但训练的机器学习模型需要大量超参数,并且调优或集成技术需要大量时间。
  • 数据量很大。

在 Python中处理大型机器学习数据集的简单方法

正如你所看到的,随着模型大小的增加,例如,制作一个具有大量超参数的复杂模型,它会引起计算边界的问题,而如果数据大小增加,它会引起内存分配错误。因此,在这两种情况下(红色阴影区域)我们都使用 Dask 来解决这些问题。

如官方文档中所述,dask ml 库用例:

  • 对于内存问题,只需使用 scikit-learn(或其他ML 库)。
  • 对于大型模型,使用 dask_ml.joblib 和scikit-learn estimators。
  • 对于大型数据集,使用 dask_ml estimators。

让我们看一下 Dask.distributed 的架构:

在 Python中处理大型机器学习数据集的简单方法

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集群

在 Python中处理大型机器学习数据集的简单方法

如果需要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 。

假设我们使用 Grid_Search 方法,我们通常使用如下Python代码

在 Python中处理大型机器学习数据集的简单方法

使用 dask.distributed 创建一个集群:

在 Python中处理大型机器学习数据集的简单方法

要使用集群拟合 scikit-learn 模型,我们只需要使用 joblib。

在 Python中处理大型机器学习数据集的简单方法

以上是在 Python中处理大型机器学习数据集的简单方法的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

HadiDB:Python 中的轻量级、可水平扩展的数据库 HadiDB:Python 中的轻量级、可水平扩展的数据库 Apr 08, 2025 pm 06:12 PM

HadiDB:轻量级、高水平可扩展的Python数据库HadiDB(hadidb)是一个用Python编写的轻量级数据库,具备高度水平的可扩展性。安装HadiDB使用pip安装:pipinstallhadidb用户管理创建用户:createuser()方法创建一个新用户。authentication()方法验证用户身份。fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

Navicat查看MongoDB数据库密码的方法 Navicat查看MongoDB数据库密码的方法 Apr 08, 2025 pm 09:39 PM

直接通过 Navicat 查看 MongoDB 密码是不可能的,因为它以哈希值形式存储。取回丢失密码的方法:1. 重置密码;2. 检查配置文件(可能包含哈希值);3. 检查代码(可能硬编码密码)。

2小时的Python计划:一种现实的方法 2小时的Python计划:一种现实的方法 Apr 11, 2025 am 12:04 AM

2小时内可以学会Python的基本编程概念和技能。1.学习变量和数据类型,2.掌握控制流(条件语句和循环),3.理解函数的定义和使用,4.通过简单示例和代码片段快速上手Python编程。

如何针对高负载应用程序优化 MySQL 性能? 如何针对高负载应用程序优化 MySQL 性能? Apr 08, 2025 pm 06:03 PM

MySQL数据库性能优化指南在资源密集型应用中,MySQL数据库扮演着至关重要的角色,负责管理海量事务。然而,随着应用规模的扩大,数据库性能瓶颈往往成为制约因素。本文将探讨一系列行之有效的MySQL性能优化策略,确保您的应用在高负载下依然保持高效响应。我们将结合实际案例,深入讲解索引、查询优化、数据库设计以及缓存等关键技术。1.数据库架构设计优化合理的数据库架构是MySQL性能优化的基石。以下是一些核心原则:选择合适的数据类型选择最小的、符合需求的数据类型,既能节省存储空间,又能提升数据处理速度

Python:探索其主要应用程序 Python:探索其主要应用程序 Apr 10, 2025 am 09:41 AM

Python在web开发、数据科学、机器学习、自动化和脚本编写等领域有广泛应用。1)在web开发中,Django和Flask框架简化了开发过程。2)数据科学和机器学习领域,NumPy、Pandas、Scikit-learn和TensorFlow库提供了强大支持。3)自动化和脚本编写方面,Python适用于自动化测试和系统管理等任务。

如何将 AWS Glue 爬网程序与 Amazon Athena 结合使用 如何将 AWS Glue 爬网程序与 Amazon Athena 结合使用 Apr 09, 2025 pm 03:09 PM

作为数据专业人员,您需要处理来自各种来源的大量数据。这可能会给数据管理和分析带来挑战。幸运的是,两项 AWS 服务可以提供帮助:AWS Glue 和 Amazon Athena。

redis怎么启动服务器 redis怎么启动服务器 Apr 10, 2025 pm 08:12 PM

启动 Redis 服务器的步骤包括:根据操作系统安装 Redis。通过 redis-server(Linux/macOS)或 redis-server.exe(Windows)启动 Redis 服务。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令检查服务状态。使用 Redis 客户端,如 redis-cli、Python 或 Node.js,访问服务器。

mysql 可以连接到 sql 服务器吗 mysql 可以连接到 sql 服务器吗 Apr 08, 2025 pm 05:54 PM

否,MySQL 无法直接连接到 SQL Server。但可以使用以下方法实现数据交互:使用中间件:将数据从 MySQL 导出到中间格式,然后通过中间件导入到 SQL Server。使用数据库链接器:商业工具可提供更友好的界面和高级功能,本质上仍通过中间件方式实现。

See all articles