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

Ris*_*shi 14 python database machine-learning data-analysis kaggle

我正在学习一些AI课程,并且已经学习了一些我想要实验的基本算法.通过Kaggle,我可以访问包含大量真实数据的多个数据集,Kaggle主持数据分析竞赛.

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

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

到目前为止,在我的课程中,我的教师通常会清理数据并为我们提供可以完全加载到RAM中的可管理数据集.显然,这对我目前的兴趣是不可能的.请建议我该怎么做.我目前正在使用4GB的macbook和4gb ram以及一个双核2.1Ghz cpu.

顺便说一句,我希望在Python中进行大量的分析,因为我最了解这种语言.我想要一个允许我用这种语言完成所有或几乎所有编码的解决方案.

dou*_*oug 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.
Run Code Online (Sandbox Code Playgroud)


II. Whiten和Recast:

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

  • 白化您的数据 - 即"标准化"保存连续数据的列.这两个步骤都将大大减小数据集的大小 - 不会产生任何噪音.美白的伴随益处是防止由超重引起的分析错误.

III. 采样:按长度调整数据.


.降维:正交模拟采样.确定对因变量(也就是"结果"或响应变量)没有影响或微不足道影响的变量(列/字段/特征),并从工作数据立方体中消除它们.

主成分分析(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
Run Code Online (Sandbox Code Playgroud)

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

D = D[:,:-2]
Run Code Online (Sandbox Code Playgroud)


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})
Run Code Online (Sandbox Code Playgroud)