当前位置:主页 > 查看内容

数据太多而无法使用?快试试这个Kaggle大数据集高效访问教程

发布时间:2021-04-27 00:00| 位朋友查看

简介:大规模数据集 对数据科学家和Kaggler来说,数据永远不嫌多。 我敢肯定,你在解决某些问题时,一定报怨过没有足够的数据,但偶尔也会抱怨数据量太多难以处理。本文探讨的问题就是对超大规模数据集的处理。 在数据过多的情况下,最常见的解决方案是根据RAM采样……

大规模数据集

对数据科学家和Kaggler来说,数据永远不嫌多。

我敢肯定,你在解决某些问题时,一定报怨过没有足够的数据,但偶尔也会抱怨数据量太多难以处理。本文探讨的问题就是对超大规模数据集的处理。

在数据过多的情况下,最常见的解决方案是根据RAM采样适量数据,但这却浪费了未使用的数据,甚至可能导致信息缺失问题。针对这些问题,研究人员提出多种不同的非子采样方法。需要注意的时,某一方法是无法解决所有问题的,因此在不同情况下要根据具体需求选择恰当的解决方案

本文将对一些相关技术进行描述和总结。由于Riiid! Answer Correctness Prediction数据集由10列,超1亿行的数据组成,在Kaggle Notebook中使用pd.read_csv方法读取会导致内存不足,因此本文将该数据集做为典型示例。

不同安装包读取数据的方式有所不同,Notebook中可用方法包括(默认为Pandas,按字母表排序):

  • Pandas
  • Dask
  • Datatable
  • Rapids

除了从csv文件读取数据外,还可以将数据集转换为占有更少磁盘空间、更少内存、读取速度快的其他格式。Notebook可处理的文件类型包括(默认csv,按字母表排序):

  • csv
  • feather
  • hdf5
  • jay
  • parquet
  • pickle

请注意,在实际操作中不单单是读取数据这么简单,还要同时考虑数据的下游任务和应用流程,综合衡量以确定读取方法。本文对此不做过多介绍,读者可自行查阅相关资料。

同时,你还会发现,对于不同数据集或不同环境,最有效的方法往往是不同的,也就是所,没有哪一种方法就是万能的。

后续会陆续添加新的数据读取方法。

方法

我们首先使用Notebook默认的pandas方法,如前文所述,这样的读取因内存不足失败。

  1. import pandas as pd 
  2. import dask.dataframe as dd 
  3.  
  4. # confirming the default pandas doesn't work (running thebelow code should result in a memory error) 
  5. # data = pd.read_csv("../input/riiid-test-answer-prediction/train.csv"

Pandas介绍

Pandas是最常用的数据集读取方法,也是Kaggle的默认方法。Pandas功能丰富、使用灵活,可以很好的读取和处理数据。

使用pandas读取大型数据集的挑战之一是其保守性,同时推断数据集列的数据类型会导致pandas dataframe占用大量非必要内存。因此,在数据读取时,可以基于先验知识或样品检查预定义列数据的最佳数据类型,避免内存损耗。

RiiiD竞赛官方提供的数据集读取方法就是如此。

帮助文档: https://pandas.pydata.org/docs/

  1. %%time 
  2. dtypes = { 
  3.    "row_id""int64"
  4.    "timestamp""int64"
  5.    "user_id""int32"
  6.    "content_id""int16"
  7.    "content_type_id""boolean"
  8.    "task_container_id""int16"
  9.    "user_answer""int8"
  10.    "answered_correctly""int8"
  11.    "prior_question_elapsed_time""float32"
  12.    "prior_question_had_explanation""boolean"
  13. data = pd.read_csv("../input/riiid-test-answer-prediction/train.csv", dtype=dtypes) 
  14. print("Train size:", data.shape) 
  15. Train size: (101230332, 10) 
  16. CPU times: user 8min 11s, sys: 10.8 s, total: 8min 22s 
  17. Wall time: 8min 22s 

 

Dask介绍

Dask提供并行处理框架对pandas工作流进行扩展,其与Spark具有诸多相似之处。

帮助文档:https://docs.dask.org/en/latest/

  1. %%time 
  2. dtypes = { 
  3.    "row_id""int64"
  4.    "timestamp""int64"
  5.    "user_id""int32"
  6.    "content_id""int16"
  7.    "content_type_id""boolean"
  8.    "task_container_id""int16"
  9.    "user_answer""int8"
  10.    "answered_correctly""int8"
  11.    "prior_question_elapsed_time""float32"
  12.    "prior_question_had_explanation""boolean"
  13. data = dd.read_csv("../input/riiid-test-answer-prediction/train.csv", dtype=dtypes).compute() 
  14. print("Train size:", data.shape) 
  15. Train size: (101230332, 10) 
  16. CPU times: user 9min 24s, sys: 28.8 s, total: 9min 52s 
  17.  
  18. Wall time: 7min 41s 
  19.  
  20. data.head() 

 

Datatable介绍

受R语言data.table的启发,python中提出Datatable,该包可快速读取大型数据集,一般要比pandas快得多。值得注意的是,该包专门用于处理表格数据集,能够快速读取大规模的表格数据集。

帮助文档:https://datatable.readthedocs.io/en/latest/index.html

  1. # datatable installation with internet 
  2. # !pip install datatable==0.11.0 > /dev/null 
  3.  
  4. # datatable installation without internet! 
  5. pip install ../input/python-datatable/datatable-0.11.0-cp37-cp37m-manylinux2010_x86_64.whl > /dev/null 
  6.  
  7. import datatable as dt 
  8. %%time 
  9. data = dt.fread("../input/riiid-test-answer-prediction/train.csv"
  10. print("Train size:", data.shape)Train size: (101230332, 10) 
  11. CPU times: user 52.5 s, sys: 18.4 s, total: 1min 10s 
  12. Wall time: 20.5 sdata.head() 

 

10*10 

Rapids介绍

Rapids提供了在GPU上处理数据的方法。通过将机器学习模型转移到GPU,Rapids可以在一个或多个GPU上构建端到端的数据解决方案。

帮助文档:https://docs.rapids.ai/

  1. # rapids installation (make sure to turn on GPU) 
  2. import sys 
  3. !cp ../input/rapids/rapids.0.15.0 /opt/conda/envs/rapids.tar.gz 
  4. !cd /opt/conda/envs/ && tar -xzvf rapids.tar.gz > /dev/null 
  5. sys.path = ["/opt/conda/envs/rapids/lib/python3.7/site-packages"] + sys.path 
  6. sys.path = ["/opt/conda/envs/rapids/lib/python3.7"] + sys.path 
  7. sys.path = ["/opt/conda/envs/rapids/lib"] + sys.path 
  8.  
  9. import cudf 
  10. %%time 
  11. data = cudf.read_csv("../input/riiid-test-answer-prediction/train.csv"
  12. print("Train size:", data.shape) 
  13. Train size: (101230332, 10) 
  14. CPU times: user 4.58 s, sys: 3.31 s, total: 7.89 s 
  15.  
  16. Wall time: 30.7 s 
  17.  
  18. data.head() 

 

文件格式

通常,我们会将数据集存储为容易读取、读取速度快或存储容量较小的格式。数据集存储有各种不同的格式,但不是每一种都可以被处理,因此接下来,我们将介绍如何将这些数据集转换为不同的格式。

  1. # data = dt.fread("../input/riiid-test-answer-prediction/train.csv").to_pandas() 
  2.  
  3. # writing dataset as csv 
  4. # data.to_csv("riiid_train.csv"index=False
  5.  
  6. # writing dataset as hdf5 
  7. # data.to_hdf("riiid_train.h5""riiid_train"
  8.  
  9. # writing dataset as feather 
  10. # data.to_feather("riiid_train.feather"
  11.  
  12. # writing dataset as parquet 
  13. # data.to_parquet("riiid_train.parquet"
  14.  
  15. # writing dataset as pickle 
  16. # data.to_pickle("riiid_train.pkl.gzip"
  17.  
  18. # writing dataset as jay 
  19. # dt.Frame(data).to_jay("riiid_train.jay"

数据集的所有格式可从此处获取,不包括竞赛组提供的原始csv数据。

csv格式

大多数Kaggle数据集都提供了csv格式文件。该格式几乎成为数据集的标准格式,而且所有方法都支持从csv读取数据。

更多相关信息见: https://en.wikipedia.org/wiki/Comma-separated_values

  1. %%time 
  2. dtypes = { 
  3.    "row_id""int64"
  4.    "timestamp""int64"
  5.    "user_id""int32"
  6.    "content_id""int16"
  7.    "content_type_id""boolean"
  8.    "task_container_id""int16"
  9.    "user_answer""int8"
  10.    "answered_correctly""int8"
  11.    "prior_question_elapsed_time""float32"
  12.    "prior_question_had_explanation""boolean"
  13. data = pd.read_csv("../input/riiid-test-answer-prediction/train.csv", dtype=dtypes) 
  14. print("Train size:", data.shape) 
  15. Train size: (101230332, 10) 
  16. CPU times: user 8min 36s, sys: 11.3 s, total: 8min 48s 
  17. Wall time: 8min 49s 

feather格式

以feature(二进制)格式存储数据对于pandas极其友好,该格式提供了更快的读取速度。

了解更多信息:https://arrow.apache.org/docs/python/feather.html

  1. %%time 
  2. data = pd.read_feather("../input/riiid-train-data-multiple-formats/riiid_train.feather"
  3. print("Train size:", data.shape) 
  4. Train size: (101230332, 10) 
  5. CPU times: user 2.59 s, sys: 8.91 s, total: 11.5 s 
  6. Wall time: 5.19 s 

hdf5格式

HDF5是用于存储、管理和处理大规模数据和复杂数据的高性能数据管理组件。

了解更多信息:https://www.hdfgroup.org/solutions/hdf5

  1. %%time 
  2. data = pd.read_hdf("../input/riiid-train-data-multiple-formats/riiid_train.h5""riiid_train"
  3. print("Train size:", data.shape) 
  4. Train size: (101230332, 10) 
  5. CPU times: user 8.16 s, sys: 10.7 s, total: 18.9 s 
  6. Wall time: 19.8 s 

jay格式

Datatable支持.jay(二进制)格式,其在读取jay格式数据时速度快得超乎想象。从下面的示例可以看到,该方法读取整个riiid数据集用时甚至不到1秒!

了解更多信息:https://datatable.readthedocs.io/en/latest/api/frame/to_jay.html

  1. %%time 
  2. data = dt.fread("../input/riiid-train-data-multiple-formats/riiid_train.jay"
  3. print("Train size:", data.shape) 
  4. Train size: (101230332, 10) 
  5. CPU times: user 4.88 ms, sys: 7.35 ms, total: 12.2 ms 
  6. Wall time: 38 ms 

parquet格式

在Hadoop生态系统中,parquet是tabular的主要文件格式,同时还支持Spark。经过近年的发展,该数据格式更加成熟,高效易用,pandas目前也支持了该数据格式。

  1. %%time 
  2. data = pd.read_parquet("../input/riiid-train-data-multiple-formats/riiid_train.parquet"
  3. print("Train size:", data.shape) 
  4. Train size: (101230332, 10) 
  5. CPU times: user 29.9 s, sys: 20.5 s, total: 50.4 s 
  6. Wall time: 27.3 s 

pickle格式

Python对象可以以pickle格式存储,pandas内置支持pickle对象的读取和写入。

了解更多信息:https://docs.python.org/3/library/pickle.html

  1. %%time 
  2. data = pd.read_pickle("../input/riiid-train-data-multiple-formats/riiid_train.pkl.gzip"
  3. print("Train size:", data.shape) 
  4. Train size: (101230332, 10) 
  5. CPU times: user 5.65 s, sys: 7.08 s, total: 12.7 s 
  6. Wall time: 15 s 

不同方法各有千秋

每种方法都有自己的优缺点,例如:

  • Pandas在处理大规模数据时对RAM的需求增加
  • Dask有时很慢,尤其是在无法并行化的情况下
  • Datatable没有丰富的数据处理功能
  • Rapids只适用于GPU

因此,希望读者掌握不同的方法,并根据实际需求选择最恰当的方法。我始终相信,研究不是技术驱动的,技术方法只是手段,要有好主意、新想法、改进技术才能推动数据科学的研究与发展。

在经过大量研究后,我确信不同数据集具有不同的适用方法,因此要多尝试,千万不要试图一招半式闯江湖。

在不断更新的开源软件包和活跃的社区支持下,数据科学必将持续蓬勃发展。

本文转自雷锋网,如需转载请至雷锋网官网申请授权。

【责任编辑:未丽燕 TEL:(010)68476606】
本文转载自网络,原文链接:https://www.leiphone.com/news/202012/cx6MZchwO7zpQE3s.html
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!

推荐图文

  • 周排行
  • 月排行
  • 总排行

随机推荐