我手头有一个机器学习任务,我想尝试一下Bernoulli Naive Bayes。
因为我需要很快产生一些有意义的结果,所以我想使用Python,更具体地说,我想使用Python,更具体地说,sklearn
。数据是“简单”的,但我有很多,所以我试图找出正确的方法,让我写一个“快速和肮脏的”基于伯努林的原型,我可以应用到尽可能多的数据。在
详情如下:
True
/False
)我还没有对实际数据进行预处理,所以我没有实际的特征矩阵和类向量来进行训练,但是在进行预处理时,我想弄清楚我能处理多大的数据块。我实际上要做的是重写以下代码块,以便它可以使用nSamples
和nFeatures
的指定值:
from sklearn.naive_bayes import BernoulliNB
import numpy as np
nSamples = 200000
nFeatures = 30000
# Don't care about actual values yet, just data size
X = np.random.randint( 2, size = ( nSamples, nFeatures ) )
Y = np.random.randint( 2, size = ( nSamples, ) )
clf = BernoulliNB()
clf.fit( X, Y )
res = clf.predict_proba( X[2] )
a)这方面的“最佳实践”方法是什么?
b)我是否需要合并PyTables
?
c)是否可以sklearn
处理PyTables
对象?
你需要计算出有多少数据可以放入内存中。在
如果你的矩阵是稀疏的,你不需要把它分成块。但看起来不像你的。在
分块处理数据
BernoulliNB
和许多scikit learn分类器都有一个partial_fit
方法来实现这一点(请参见this more complete example):其中
iter_batches
是一个迭代器,它为您提供数据块。现在你需要确保这些块能放入内存中。在
它有多大?
您可以使用
^{pr2}$np.array
属性计算出np.array
的大小:因此,
X
数组的内存约为480MB。请注意,如果在加载数据时使用布尔变量并正确指定类型,则可以大大减少占用空间:
但是
np.bool
仍然是1字节(8位)。在您也可以手工计算这些数字:数组大约是
nSamples * nFeatures * 1 / 10 ** 6
MB。在剩下的取决于你可用的内存。整个
X
数组是6GB,但是您需要考虑scikit learn将需要的RAM。 “不应该太多”这是我可以自信地说的;)。但是,不要忘记将
binarize=None
传递给BernoulliNB
构造函数,以避免X数组的副本(数据已经二进制化)。在PyTables
您是否需要
PyTables
?不,但如果你愿意的话,你还是可以用的。sklearn
与numpy数组一起工作,PyTables
也可以,因此可以使用它将数据块馈送到partial_fit
循环。在希望这有帮助。在
相关问题 更多 >
编程相关推荐