数据大小的实际限制朴素的贝耶斯伯努林

2024-04-26 23:08:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我手头有一个机器学习任务,我想尝试一下Bernoulli Naive Bayes。
因为我需要很快产生一些有意义的结果,所以我想使用Python,更具体地说,我想使用Python,更具体地说,sklearn。数据是“简单”的,但我有很多,所以我试图找出正确的方法,让我写一个“快速和肮脏的”基于伯努林的原型,我可以应用到尽可能多的数据。在

详情如下:

  1. 特性是二进制的(True/False
  2. 类也是二进制的(可以把它看作垃圾邮件过滤器)
  3. 特征向量的长度可达30000。它也许可以通过选择一个特性来大大减少这一点,但是现在让我们假设它有这么长的时间
  4. 我有多达200000个数据点可以用来训练我的模型

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

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对象?


Tags: 数据方法importsizenp二进制random特性
1条回答
网友
1楼 · 发布于 2024-04-26 23:08:33

你需要计算出有多少数据可以放入内存中。在

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

分块处理数据

BernoulliNB和许多scikit learn分类器都有一个partial_fit方法来实现这一点(请参见this more complete example):

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属性计算出np.array的大小:

^{pr2}$

因此,X数组的内存约为480MB。
请注意,如果在加载数据时使用布尔变量并正确指定类型,则可以大大减少占用空间:

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 ** 6MB。在

剩下的取决于你可用的内存。整个X数组是6GB,但是您需要考虑scikit learn将需要的RAM。 “不应该太多”这是我可以自信地说的;)。
但是,不要忘记将binarize=None传递给BernoulliNB构造函数,以避免X数组的副本(数据已经二进制化)。在

PyTables

您是否需要PyTables?不,但如果你愿意的话,你还是可以用的。 sklearn与numpy数组一起工作,PyTables也可以,因此可以使用它将数据块馈送到partial_fit循环。在

希望这有帮助。在

相关问题 更多 >