14

我正在学习一些人工智能课程,并且已经了解了一些我想尝试的基本算法。我通过举办数据分析竞赛的Kaggle访问了包含大量真实世界数据的多个数据集。

我曾尝试参加几场比赛来提高我的机器学习技能,但一直无法找到访问代码中数据的好方法。Kaggle 以 csv 格式为每个比赛提供一个 50-200mb 的大数据文件。

在我的代码中加载和使用这些表的最佳方式是什么?我的第一直觉是使用数据库,所以我尝试将 csv 加载到 sqlite 单个数据库中,但这给我的计算机带来了巨大的负载,并且在提交期间,我的计算机经常崩溃。接下来,我尝试在共享主机上使用 mysql 服务器,但对其进行查询需要很长时间,这让我的分析代码非常慢。另外,我担心我会超出我的带宽。

到目前为止,在我的课程中,我的导师通常会清理数据并为我们提供可完全加载到 RAM 中的可管理数据集。显然,这对我目前的兴趣来说是不可能的。请建议我应该如何进行。我目前正在使用一台 4 年前的 4gb ram 和双核 2.1Ghz cpu 的 macbook。

顺便说一句,我希望在 Python 中进行大部分分析,因为我最了解这种语言。我想要一个解决方案,让我可以用这种语言进行所有或几乎所有编码。

4

5 回答 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.


二、 美白和重铸

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

  • 白化你的数据——即,“规范化”包含连续数据的列。这两个步骤都将大大减少数据集的大小——而不会引入任何噪音。美白的一个附带好处是防止因过度加权而导致的分析错误。

三、 采样:按长度修剪您的数据


降维:正交模拟采样。识别对因变量(又名“结果”或响应变量)没有影响或影响微乎其微的变量(列/字段/特征),并将它们从您的工作数据立方体中消除。

主成分分析(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 中使用 hash 数据结构,您可以拥有与 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})
于 2011-08-23T00:22:27.517 回答
2

200 MB 对于加载到数据库中并不是一个特别大的文件。您可能想尝试将输入文件拆分为较小的文件。

split -l 50000 your-input-filename

split实用程序会将您的输入文件拆分为您喜欢的任何大小的多个文件。我在上面的每个文件中使用了 50000 行。它是一个常见的 Unix 和 Linux 命令行实用程序;不过,不知道它是否随 Mac 一起提供。

对于您正在做的事情,本地安装PostgreSQL甚至MySQL可能是比 SQLite 更好的选择。

如果您不想将数据加载到数据库中,可以使用命令行实用程序(如 grep、awk 和 sed)获取数据的子集。(或者像 python、ruby 和 perl 这样的脚本语言。)将子集通过管道传输到您的程序中。

于 2011-08-18T22:33:39.573 回答
1

你需要“熊猫”。我想你现在一定已经明白了。但是,如果其他人面临这个问题,仍然可以从答案中受益。因此,您不必将数据加载到任何 RDBMS 中。将其保存在文件中,并通过简单的 Pandas 加载、数据帧来使用它。这是熊猫库的链接-> http://pandas.pydata.org/

如果数据太大,您需要任何集群。可以在 Amazon EC2 云上运行的 Apache Spark 或 Mahout。在那里买一些空间,它会很容易使用。Spark 还有一个用于 Python 的 API。

于 2014-09-14T06:00:19.910 回答
1

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

于 2017-03-04T04:48:13.557 回答
0

通用技术是“分而治之”。如果您可以将数据拆分为多个部分并分别处理它们,那么它可以由一台机器处理。有些任务可以通过这种方式解决(PageRank、NaiveBayes、HMM 等),而有些则不是(需要全局优化),例如 LogisticeRegression、CRF、许多降维技术

于 2011-08-25T11:15:09.717 回答