我手头有一项机器学习任务,我想尝试一下伯努利的朴素贝叶斯。
由于我需要很快产生一些有意义的结果,所以我想使用Python,更具体地说,使用sklearn.。数据是“简单的”,但我有很多,所以我试图找出正确的方法,让我可以写一个“快速和肮脏”伯努利NB的原型,我可以应用到尽可能多的数据。
详情如下:
True / False ).fit()训练我的模型。我还没有对实际数据进行预处理,所以我没有实际的特征矩阵和类向量来进行训练,但是在进行预处理时,我想知道我可以处理多大的数据块。实际上,我要做的是重写以下代码块,以便它可以使用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对象吗?
发布于 2015-08-31 17:56:00
您需要弄清楚这些数据中有多少可以存储在内存中。
如果你的矩阵是稀疏的,你不需要把它分割成块。但看起来不像你的。
用块处理数据
BernoulliNB和许多scikit学习分类器都有一个partial_fit方法来实现这个目的(参见这个更完整的例子):
clf = BernoulliNB()
all_classes = [0, 1]
for X_train, y_train in iter_batches:
clf.partial_fit(X_train, y_train, classes=all_classes)其中,iter_batches是一个迭代器,它为您提供大量数据。
现在,您需要确保这些块在内存中。
它有多大?
您可以使用np.array属性计算出nbytes的大小:
from sklearn.naive_bayes import BernoulliNB
import numpy as np
nSamples = 2000
nFeatures = 30000
X = np.random.randint(2, size=(nSamples,nFeatures))
X.nbytes / 10 ** 6
Out[11]: 480.0因此,在这里,X数组在内存中大约为480 is。
请注意,如果您有布尔变量,并在加载数据时正确地指定类型,则可以大大减少占用空间:
X = np.random.randint(2, size=(nSamples,nFeatures)).astype(np.int8)
X.nbytes / 10 ** 6
Out[12]: 60.0不过,np.bool仍然是1字节(8位)。
还可以手工计算这些数字:数组将是关于nSamples * nFeatures * 1 / 10 ** 6 MB的。
其余的取决于您可用的RAM。整个X数组是6GB的,但是您需要考虑到scikit学习所需要的内存。“那应该不是很多”,这是我所能说的唯一有信心的东西。)
但是,不要忘记将binarize=None传递给BernoulliNB构造函数,以避免X数组的副本(您的数据已经被绑定)。
PyTables
你需要PyTables吗?不是的。但如果你愿意的话你还是可以用的。sklearn适用于numpy数组,但PyTables也是如此,因此您可以使用它将大块数据提供给partial_fit循环。
希望这能有所帮助。
https://stackoverflow.com/questions/32314873
复制相似问题