首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sklearn.naive_bayes.BernoulliNB数据大小的实用限制

sklearn.naive_bayes.BernoulliNB数据大小的实用限制
EN

Stack Overflow用户
提问于 2015-08-31 15:33:13
回答 1查看 1.2K关注 0票数 2

我手头有一项机器学习任务,我想尝试一下伯努利的朴素贝叶斯。

由于我需要很快产生一些有意义的结果,所以我想使用Python,更具体地说,使用sklearn.。数据是“简单的”,但我有很多,所以我试图找出正确的方法,让我可以写一个“快速和肮脏”伯努利NB的原型,我可以应用到尽可能多的数据。

详情如下:

  1. 特性是二进制的( True / False )
  2. 类也是二进制类(将其视为垃圾邮件筛选器)
  3. 特征向量的长度可达30,000。它可能可以通过一个特性选择大大减少这一点,但现在让我们假设它是这么长
  4. 我有多达200000个数据点,可以用来.fit()训练我的模型。

我还没有对实际数据进行预处理,所以我没有实际的特征矩阵和类向量来进行训练,但是在进行预处理时,我想知道我可以处理多大的数据块。实际上,我要做的是重写以下代码块,以便它可以使用nSamplesnFeatures的指定值

代码语言:javascript
复制
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对象吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-31 17:56:00

您需要弄清楚这些数据中有多少可以存储在内存中。

如果你的矩阵是稀疏的,你不需要把它分割成块。但看起来不像你的。

用块处理数据

BernoulliNB和许多scikit学习分类器都有一个partial_fit方法来实现这个目的(参见这个更完整的例子):

代码语言:javascript
复制
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的大小:

代码语言:javascript
复制
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。

请注意,如果您有布尔变量,并在加载数据时正确地指定类型,则可以大大减少占用空间:

代码语言:javascript
复制
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循环。

希望这能有所帮助。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32314873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档