干货!机器学习中,如何优化数据性能 2024-06-10 20:45:41 得益于覆盖各种需求的第三方库,Python在今天已经成为了研究机器学习的主流工具。不过由于其解释型语言的特性,在运行速度上往往和传统编译型语言有较大差距。特别是当训练数据集非常庞大时,很多时候处理数据本身就会占用大量的时间。Python中自身提供了非常强大的数据存储结构:numpy库下的ndarry和pandas库下的DataFrame。前者提供了很多list没有实现的便利功能,而后者是最方便的column-row型数据的存储方式,同样提供了大量方便的随机访问函数。然而不正确的使用很多时候反而会适得其反,给人一种如此高级的三方库性能还不如list手动造轮子的错觉。本文主要通过优化数据结构以及一些使用中的注意点来提高在大数据量下数据的处理速度。01避免使用append来逐行添加结果很多人在逐行处理数据的时候,喜欢使用append来逐行将结果写入DataFrame或ndarry。类似下面的写法:这是非常不好的习惯,numpy或pandas在实现append的时候,实际上对内存块进行了拷贝——当数据块逐渐变大的时候,这一操作的开销会非常大。下面是官方文档对此的描述:Numpy: Pandas.DataFrame: 实际上,受list的append操作的影响,开发者会不假思索的认为numpy和pandas中的append也是简单的数组尾部拼接。这实际上是一个很严重的误解,会产生很多不必要的拷贝开销。笔者没有深入研究它们这么设计原因,猜测可能是为了保证拼接后的数组在内存中依然是连续区块——这对于高性能的随机查找和随机访问是很有必要的。解决办法:除非必须,在使用DataFrame的部分函数时,考虑将inplace=True。出于保证原始数据的一致性,DataFrame的大部分方法都会返回一个原始数据的拷贝,如果要将返回结果写回,用这种方式效率更高。除非必须,避免使用逐行处理。Numpy和pandas都提供了很多非常方便的区块选取及区块处理的办法。这些功能非常强大,支持按条件的选取,能满足大部分的需求。同时因为ndarry和DataFrame都具有良好的随机访问的性能,使用条件选取执行的效率往往是高于条件判断再执行的。特殊情况下,使用预先声明的数据块而避免append。如果在某些特殊需求下(例如当前行的处理逻辑依赖于上一行的处理结果)并且需要构造新的数组,不能直接写入源数据时。这种情况下,建议提前声明一个足够大的数据块,将自增的逐行添加改为逐行赋值。这种写法本质上是通过空间换取时间,即便数据量非常巨大,无法一次性写入内存,也可以通过数据块的方式,减少不必要的拼接操作。需要注意的是,数据块的边界处理条件,以避免漏行。02避免链式赋值链式赋值是几乎所有pandas的新人都会在不知不觉中犯的错误,并且产生恼人而又意义不明的SettingWithCopyWarning警告。实际上这个警告是在提醒开发者,你的代码可能没按你的预期运行,需要检查——很多时候可能产生难以调试发现的错误。当使用DataFrame作为输入的第三方库时,非常容易产生这类错误,且难以判断问题到底出现在哪儿。在继续讲解链式复制前,需要先了解pandas的方法有一部分是返回的是输入数据的视图(view)一部分返回的是输入数据的拷贝(copy),还有少部分是直接修改源数据。上图很好的解释了视图与拷贝的关系。当需要对df2进行修改时,有时候我们希望df1也能被修改,有时候则不希望。而当使用链式赋值时,则有可能产生歧义。这里的歧义指的是面向开发人员的,代码执行是不会有歧义的。链式索引,就是对同一个数据连续的使用索引,形如data[1:5][2:3]这样。而链式赋值,就是使用链式索引进行赋值操作。下图是一个链式赋值的例子,解释器给出了SettingWithCopyWarning警告,同时对data的赋值操作也没有成功。解决办法:上图中的警告建议,当你想修改原始数据时,使用loc来确保赋值操作被在原始数据上执行,这种写法对开发人员是无歧义的(开发人员往往会误认为链式赋值修改的依然是源数据)。反过来的情况并不会发生这种歧义。如果开发人员想选取源数据的一部分,修改其中某列的值并赋给新的变量而不修改源数据,那么正常的写法就是无歧义的。然而有些隐蔽的链式索引往往并不是简单的像上述情况那样,有可能跨越多行代码,甚至函数。下图的例子中,data_part是对data的选取,而赋值操作又对data_part进行了选取,此时构成了链式索引。解决办法:当你确定是要构造拷贝时,明确指明构造拷贝。避免对有可能是视图的中间变量进行修改。需要注意的是:DataFrame的索引操作到底是返回视图还是返回拷贝,取决于数据本身。对于单类型数据(全是某一类型的DataFrame)出于效率的考虑,索引操作总是返回视图,而对于多类型数据(列与列的数据类型不一样)则总是返回拷贝。但也请不要依赖这一特性,因为根据内存布局,其行为未必总是一致。最好的方法还是明确指定——如果想要写入副本数据,就在索引时明确拷贝;如果想要修改源数据,就使用loc严格赋值。03总结1.可以直接修改源数据就修改源数据,避免不必要的拷贝2.使用条件索引替代逐行遍历3.构造数据块替代逐行添加4.想修改源数据时使用data.loc[row_index, col_index]替代链式赋值5.想构造副本时严格使用copy消除隐形链式赋值参考资料:https://numpy.org/doc/stable/reference/generated/numpy.append.htmlhttps://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.htmlhttps://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#indexing-labelhttps://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#indexing-view-versus-copyhttps://zhuanlan.zhihu.com/p/41202576 赞 (0) 相关推荐 pandas笔记(5) 在Python中,dataframe可以使用默认行列索引,也可以自行设置索引. 查看索引 新建一个DataFrame import pandas as pddf = pd.DataFrame ([[' ... 数据分析——Pandas合并数据,实现多表连接查询 [导语] 学过Excel和MySQL,Pandas后,你会发现它们的都能处理数据,只是实现方式不同罢了,互相能起到互补的作用.那么,在工作中,工具没有好坏之分,只要能解决问题,都是好工具,关键是我们怎 ... 第94天:数据分析之 pandas 初步 pandas是一个常用的第三方 Python 库,提供快速灵活的数据处理功能,也是进行数据分析的有力工具.我们的口号是:"更快,更高,更强"(皮一下).啊,当然,现在经常有很多库一 ... Python的常用库的数组定义及常用操作 好奇心Log 今天 以下文章来源于阿宗的科研备忘 ,作者阿宗的科研备忘 Python支持的库非常多,这当然是它的一大优势,但是也会给我们实际应用中造成点小小的麻烦:每个库对于数据的定义和运算处理都不同 ... 机器学习中的数据级联:被低估的数据,被高估的模型 来自谷歌的研究员在一篇题为"Everyone wants to do the model work, not the data work"的论文中指出:数据质量在AI中起到的作用正 ... 冯诺伊曼理论奖得主Jorge Nocedal:零阶优化方法在机器学习中的应用 在 6 月 22 日的北京智源大会上,美国西北大学教授 Jorge Nocedal 就非线性优化问题进行了十分细致的讲解. Jorge Nocedal 教授同时还是冯诺伊曼理论奖得主,美国国家工程院院 ... 如何避免机器学习中的「7」种数据偏差 机器学习中的数据偏差是一种错误,其中数据集的某些元素比其他元素具有更大的权重和或表示.有偏见的数据集不能准确地表示模型的用例,从而导致结果偏斜,准确性水平低和分析错误. 通常,用于机器学习项目的训练数 ... 一个包工头头脑中的重要数据!!! 工程热点快讯公众号1.一般的框架结构中的混凝土用量可以按"建筑面积*0.22"得出,即一个标准层的折算厚度在550px左右:2.框架结构的含钢量暂按每m2含钢量60kg计(暂时不考 ... 菜鸟记440-柱形图中存在超常数据,应该如何处理? 万一您身边的朋友用得着呢? 截止今日小菜已分享350+篇经验之谈,可以文章编号或关键词进行搜索 以下才是今天的正式内容-- 摘要:本文介绍存在超常(过大或过小)数据时候,如何对柱形图进行处理的方法. ... 菜鸟记448—如何愉快地替换工作表中的部分数据? 万一您身边的朋友用得着呢? 各位朋友早上好,小菜继续和您分享经验之谈,截止今日小菜已分享400+篇经验之谈,可以文章编号或关键词进行搜索 以下才是今天的正式内容-- 摘要:本文介绍利用VLOOKUP函 ... 机器学习中,有哪些特征选择的工程方法? 解析: 本题解析来源:@jasonfreak,链接:http://www.cnblogs.com/jasonfreak/p/5448385.html 目录 1 特征工程是什么? 2 数据预处理 2.1 ... Excel中的身份证数据,应该如何科学处理 已经从事工作的朋友们,想必会经常和身份证号码打交道,今天我们就聊聊关于[excel身份证]那些事. (先看看视频get拆分身份证数据技巧) 大家好,我的名字叫去力果果,我的身份证号码是↓ 相信大家也看 ... 干货 | IATF16949中的制造可行性分析的应用要求 最新课程