非超级计算机处理大量数据的一般技术

14
我正在上一些AI课程,学习了一些基础算法,想要进行实验。通过Kaggle,我已经获得了几个包含大量优秀真实数据的数据集,该网站举办数据分析竞赛。
我尝试参加几个比赛以提高我的机器学习技能,但是一直找不到一个好的方法来在代码中访问这些数据。 Kaggle为每个比赛提供一个大型数据文件,大小在50-200mb之间,格式为csv。
最佳的方法是如何在我的代码中加载和使用这些表格?我的第一反应是使用数据库,所以我尝试将csv加载到sqlite单个数据库中,但这给我的计算机带来了巨大的负担,在提交期间,我的计算机经常崩溃。接下来,我尝试在共享主机上使用mysql服务器,但对其进行查询需要很长时间,并且使我的分析代码变得非常缓慢。此外,我担心会超出我的带宽限制。
到目前为止,在我的课程中,我的教练通常清理数据并为我们提供可管理的数据集,可以完全加载到RAM中。显然,这对于我的当前兴趣是不可能的。请建议我应该如何继续。我目前使用一台4年的MacBook,配有4GB RAM和双核2.1Ghz CPU。
顺便说一下,我希望在Python中完成大部分分析,因为我最擅长这种语言。我希望有一个解决方案,可以让我在这种语言中完成所有或几乎所有的编码。

SQLite应该可以轻松处理4GB机器上的200MB数据库。如果您的机器崩溃了,那么肯定有问题。首先解决这个问题。 - Dour High Arch
1
许多Kaggle竞赛选手都在使用R语言。Python是一种非常棒的编程语言,但是在统计和建模工具方面,R拥有显著优势。这并不是在宣传R语言,而是在鼓励大家增加更多编程语言技能,以便完成更多任务。 - Iterator
2
我觉得我漏掉了什么。怎么可能把一个200MB的文本文件加载到你的4GB内存中是“不可能”的呢? - Michael J. Barber
5个回答

18

原型--在处理大数据时最重要的是将其合理地划分,以便可以将其加载到内存中,并使用解释器(例如Python、R)访问它。这是创建和完善规模化分析流程的最佳方法。

换句话说,将多GB大小的数据文件削减到足够小,以便进行命令行分析

以下是我用来完成这一过程的工作流程--肯定不是最好的方法,但它是一种方式,并且有效:

I. 使用您选择的语言中(希望)提供的惰性加载方法读取大型数据文件,特别是那些超过约1 GB的文件。然后,我建议根据下面讨论的技术处理此数据流,最后将经过完全预处理的数据存储在数据集市或中间暂存容器中。

以下是使用Python 惰性加载大型数据文件的示例:

# 'filename' is the full path name for a data file whose size 
# exceeds the memory on the box it resides. #

import tokenize

data_reader = open(some_filename, 'r')
tokens = tokenize.generate_tokens(reader)
tokens.next()           # returns a single line from the large data file.


II. 数据白化和重塑:

  • 将存储分类变量(例如男/女)的列重新塑造为整数(例如-1,1)。在分析工作流的最后一步中保留一个查找表(与此转换使用相同的哈希值,除了键和值被交换),以将这些整数转换回人类可读的字符串标签;

  • 对持续数据的列进行数据白化 - 即“归一化”。这两个步骤将大大减小数据集的大小 - 而不会引入任何噪声。从白化中获得的附带好处是防止由于过度加权而导致的分析错误。

III. 采样:从数据长度方向上修剪数据.


IV. 降维: 采样的正交类比。识别对因变量(也称为“结果”或响应变量)没有影响或微小影响的变量(列/字段/特征),并将它们从您的工作数据立方体中删除。

主成分分析(PCA)是一个简单可靠的技术,可用于实现此目的:

import numpy as NP
from scipy import linalg as LA

D = NP.random.randn(8, 5)       # a simulated data set
# calculate the covariance matrix: #
R = NP.corrcoef(D, rowvar=1)
# calculate the eigenvalues of the covariance matrix: #
eigval, eigvec = NP.eig(R)
# sort them in descending order: #
egval = NP.sort(egval)[::-1]
# make a value-proportion table #
cs = NP.cumsum(egval)/NP.sum(egval)
print("{0}\t{1}".format('eigenvalue', 'var proportion'))
for i in range(len(egval)) :
    print("{0:.2f}\t\t{1:.2f}".format(egval[i], cs[i]))

  eigenvalue    var proportion
    2.22        0.44
    1.81        0.81
    0.67        0.94
    0.23        0.99
    0.06        1.00

如您所见,前三个特征值占原始数据方差的94%。根据您的目的,通常可以通过删除最后两列来修剪原始数据矩阵D:

D = D[:,:-2]
V. 数据集市存储:在永久存储(数据仓库)和分析流程之间插入一层。换句话说,强烈依赖于数据集市/数据立方体——这是一个“暂存区”,位于数据仓库和分析应用程序层之间。这个数据集市是分析应用程序的更好的IO层。 R语言中的“数据框”或“数据表”(来自同名CRAN软件包)是不错的选择。我还强烈推荐redis——它具有快速读取、简洁语义和零配置的特点,非常适合此用例。redis可以轻松处理你在问题中提到的数据大小。例如,使用redis中的哈希数据结构,你可以获得与MySQL或SQLite相同的结构和关系灵活性,而无需繁琐的配置。另一个优点是:与SQLite不同,redis实际上是一个数据库服务器。我真的很喜欢SQLite,但我认为出于刚才提到的原因,redis在这里运行得更好。
from redis import Redis
r0 = Redis(db=0)
r0.hmset(user_id : "100143321, {sex : 'M', status : 'registered_user', 
       traffic_source : 'affiliate', page_views_per_session : 17, 
       total_purchases : 28.15})

我原本以为tokenize只能解析Python源代码。你是如何使用它来解析任意数据的?你发现它足够灵活吗? - bsamek
我使用tokenize,例如在预处理步骤中--解析可能不够干净以供csv解析器使用的数据。特别地,在tokenize生成器上调用“next”不仅返回下一行数据,还返回该行相对于文档的位置,这对于诊断格式不规则的数据文件非常有用。当然,没有关于tokenize主要用例的问题--源代码解析是文档中唯一的用例。但是,我想知道我在答案中使用它是否会产生误导。 - doug

2

对于加载到数据库中的文件来说,200兆字节并不算特别大。您可能需要尝试将输入文件拆分成较小的文件。

split -l 50000 your-input-filename
split实用程序可以将输入文件分割成您喜欢的任意大小的多个文件。我上面使用了每个文件50000行的常见Unix和Linux命令行实用程序;虽然不知道它是否随Mac一起发货。

本地安装PostgreSQL甚至MySQL可能比SQLite更适合您所做的工作。
如果您不想将数据加载到数据库中,则可以使用grep、awk和sed等命令行实用程序(或像python、ruby和perl这样的脚本语言)获取其子集。将子集导入程序。

1
你需要使用'Pandas'。我认为现在你一定已经得到了它。但如果其他人也遇到了这个问题,他们可以从答案中受益。所以你不必将数据加载到任何RDBMS中。将其保留在文件中并通过简单的Pandas加载数据框架来使用它。这是pandas库的链接-->http://pandas.pydata.org/ 如果数据太大,你需要使用集群。Apache Spark或Mahout可以在Amazon EC2云上运行。在那里购买一些空间,使用起来很容易。Spark还有一个Python API。

1
我使用H2O在R中加载了一个2GB的Kaggle数据集。H2O是建立在Java上的,它创建了一个虚拟环境,在内存中可用,由于H2O是Java,因此可以更快地访问数据。您只需要熟悉H2O的语法即可。它具有许多精美构建的机器学习算法,并提供良好的分布式计算支持。您还可以轻松地使用所有CPU核心。查看h2o.ai以了解如何使用它。它可以轻松处理200MB的数据,前提是您只有4GB的RAM。您应该升级到8G或16G。

0
通常的技术是"分而治之"。如果您可以将数据分割成部分并单独处理它们,则可以由一台机器处理。某些任务可以通过这种方式解决(PageRank、NaiveBayes、HMM等),而有些任务则不行(其中一个需要全局优化),例如LogisticeRegression、CRF、许多维度降低技术。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接