我正在学习一些人工智能课程,并了解了一些基本算法,我想尝试这些算法。我通过Kaggle获得了几个包含大量真实世界数据的数据集,Kaggle是一个举办数据分析竞赛的平台。
我尝试参加了几次竞赛以提升我的机器学习技能,但一直无法找到一种好的方法在我的代码中访问这些数据。Kaggle为每个竞赛提供一个大型数据文件,格式为csv,文件大小在50-200mb之间。
在我的代码中加载和使用这些表格的最佳方法是什么?我首先想到的是使用数据库,所以我尝试将csv文件加载到sqlite的单一数据库中,但这给我的电脑带来了巨大的负担,在提交过程中,我的电脑经常崩溃。接下来,我尝试在共享主机上使用mysql服务器,但查询速度非常慢,这使得我的分析代码变得非常慢。此外,我担心会超出我的带宽限制。
到目前为止,在我的课程中,我的教师通常会清理数据并给我们提供可以完全加载到内存中的可管理数据集。显然,这对于我当前的兴趣来说是不可能的。请建议我应该如何继续。我目前使用的是一台4年前的MacBook,配备4GB内存和双核2.1GHz处理器。
顺便说一下,我希望在Python中进行大部分分析,因为这是我最熟悉的语言。我希望有一个解决方案,可以让我在这种语言中完成所有或几乎所有的编码工作。
回答:
原型——这是处理大数据时最重要的事情。合理地分割数据,使其能够加载到内存中,以便通过解释器(例如,Python,R)访问。这是创建和优化大规模分析流程的最佳方法。
换句话说,将您的多GB大小的数据文件裁剪得足够小,以便进行命令行分析。
这是我用来实现这一点的工作流程——当然不是最好的方法,但这是一种方法,而且它有效:
I. 使用延迟加载方法(希望在您选择的语言中可用)来读取大型数据文件,特别是那些超过约1GB的文件。然后,我建议根据我下面讨论的技术处理这个数据流,最后将这些完全预处理的数据存储在数据市场或中间暂存容器中。
使用Python延迟加载大型数据文件的一个例子:
# 'filename' 是数据文件的完整路径名,其大小超过所在设备的内存。
#import tokenize
data_reader = open(some_filename, 'r')
tokens = tokenize.generate_tokens(reader)
tokens.next() # 从大型数据文件中返回一行。
II. 白化和重铸:
-
将存储分类变量的列(例如,男/女)重铸为整数(例如,-1, 1)。维护一个查找表(与用于此转换的哈希表相同,只是键和值互换)以将这些整数转换回人类可读的字符串标签,作为分析流程的最后一步;
-
白化您的数据——即,“标准化”存储连续数据的列。这两个步骤将大大减少您的数据集大小——而不会引入任何噪音。白化的附带好处是防止由于过度加权引起的分析错误。
III. 抽样:纵向裁剪您的数据。
IV. 降维:抽样的正交类比。识别对因变量(也称为“结果”或响应变量)没有影响或影响微乎其微的变量(列/字段/特征),并从您的工作数据立方体中删除它们。
主成分分析(PCA)是一种简单且可靠的技术来实现这一点:
import numpy as NP
from scipy import linalg as LA
D = NP.random.randn(8, 5) # 一个模拟数据集
# 计算协方差矩阵:
#R = NP.corrcoef(D, rowvar=1)
# 计算协方差矩阵的特征值:
#eigval, eigvec = NP.eig(R)
# 按降序排列它们:
#egval = NP.sort(egval)[::-1]
# 制作一个值比例表
#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})