数据预处理技术相关内容,数据预处理及数据集划分

  

  3行代码,Python数据预处理提速6倍!(附链接)   

  

  资料来源:新智元   

  

  这篇文章是关于2600字,建议阅读8分钟.   

  

  本文介绍了一种简单的方法,只用3行代码就可以将Python数据处理速度提高2~6倍。   

  

  Python是所有机器学习的首选编程语言。很容易使用,有很多很棒的库,可以轻松处理数据。但是当我们需要处理大量数据时,事情就变得棘手了。   

  

  “大数据”一词通常指数据集。一个数据集中有数十万甚至数百万个数据点。在这个尺度上,每一个小的计算都会累积起来,我们需要在编码过程的每一步都保持效率。在考虑机器学习系统的效率时,一个经常被忽略的关键步骤是预处理阶段。我们必须对所有数据点进行一些预处理操作。   

  

  默认情况下,Python程序使用单个CPU作为单个进程执行。大多数用于机器学习的计算机至少有2个CPU核心。这意味着,以2个CPU核为例,运行预处理时,计算机50%甚至更多的处理能力默认不会做任何事情!当你使用4核(英特尔i5)或6核(英特尔i7)时,就更浪费了。   

  

  不过好在内置的Python库有一些隐藏的函数,可以让我们充分利用所有的CPU内核!得益于Python的concurrent.futures模块,只需要3行代码就可以将一个普通的程序转换成可以跨CPU内核并行处理数据的程序。   

  

  3行代码,Python数据预处理提速6倍!(附链接)   

  

  标准方法   

  

  我们举一个简单的例子,我们在一个文件夹里有一个图像数据集;或者我们甚至有成千上万的图像!为了节省处理时间,我们在这里使用1000张图片。我们希望在将所有图像传输到深度神经网络之前,将它们的大小调整为600x600。下面是一些你经常在GitHub上看到的非常标准的Python代码。   

  

  3行代码,Python数据预处理提速6倍!(附链接)   

  

  该程序遵循数据处理脚本中常见的简单模式:   

  

  是首先要处理的文件(或其他数据)的列表;您可以使用for循环逐个处理每个数据段,然后在每次循环迭代中运行预处理。   

  

  让我们在一个包含1000个jpeg文件的文件夹上测试这个程序,看看运行它需要多长时间:   

ge/pgc-image/1538870873543440d095dd2" img_width="447" img_height="58" inline="0" alt="3行代码,Python数据预处理提速6倍!(附链接)" onerror="javascript:errorimg.call(this);">


在我的具有6个CPU核心的i7-8700k上,这个程序的运行时间是7.9864秒!对于这样的高端CPU来说,似乎有点慢。让我们看看我们可以做些什么来加快速度。

快速方式


为了理解我们希望Python如何并行处理事物,直观地思考并行处理本身是有帮助的。假设我们必须执行相同的任务,例如将钉子钉入一块木头,我们的桶中有1000个钉子。如果钉每个钉子需要1秒钟,那么1个人的话需要花1000秒完成工作。但是如果有4个人,我们会将整桶钉子平均分成4堆,然后每个人处理自己的一堆钉子。这样,只需250秒即可完成任务!

在这个包含1000张图像的任务中,也可以这样处理:

  • 将jpg文件列表分为4个较小的组。
  • 运行Python解释器的4个独立实例。
  • 让每个Python实例处理4个较小数据组中的一个。
  • 结合4个过程的结果,得到最终的结果列表。


这里最重要的部分是Python为我们处理了所有艰苦的工作。我们只是告诉它我们想要运行哪个函数,以及使用多少Python实例,然后它完成了所有其他操作!我们只需修改3行代码。

3行代码,Python数据预处理提速6倍!(附链接)


上面的代码中的:

3行代码,Python数据预处理提速6倍!(附链接)


你有多少CPU核心就启动多少Python进程,在我的例子中是6个。实际的处理代码是这样的:

3行代码,Python数据预处理提速6倍!(附链接)


executor.map()将你想要运行的函数和一个列表作为输入,列表中的每个元素都是函数的单个输入。由于我们有6个核心,我们将同时处理列表中的6个项!

再次运行程序看看:

3行代码,Python数据预处理提速6倍!(附链接)


运行时间是1.14265秒,几乎加速了6倍!

注意:产生更多Python进程并在它们之间移动数据时,会产生一些开销,因此不会总是得到这么大的速度提升。 但总的来说,加速相当显著。


是否总能大幅加速?


当你有要处理的数据列表并且要对每个数据点执行类似的计算时,使用Python并行池是一个很好的解决方案。但是,它并不总是完美的。并行池处理的数据不会以任何可预测的顺序处理。如果你需要处理的结果按特定顺序排列,那么这种方法可能不适合。

你处理的数据还必须是Python知道如何“pickle”的类型。幸运的是,这些类型很常见。以下来自Python官方文档:

  • None, True, 及 False
  • 整数,浮点数,复数
  • 字符串,字节,字节数组
  • 仅包含可选对象的元组,列表,集合和词典
  • 在模块的顶层定义的函数(使用def,而不是lambda)
  • 在模块顶层定义的内置函数
  • 在模块顶层定义的类
  • 这些类的实例,__dict__或调用__getstate __()的结果是可选择的


原文链接:https://towardsdatascience.com/heres-how-you-can-get-a-2-6x-speed-up-on-your-data-pre-processing-with-python-847887e63be5

相关文章