我正在使用由160万条推文组成的sentiment140数据集来训练和分析python scikit-learn库中不同分类器的准确性。我正在使用以下代码片段将推文矢量化为特征向量,然后再将其提供给分类器。
vectorizer = CountVectorizer(max_features = 2000)
train_set = (vectorizer.fit_transform(trainX)).toarray()
这之后,我训练我的classifier
对象,其中包括GaussianNB()
,MultinomialNB()
,BernoulliNB()
,LogisticRegression()
,LinearSVC()
和RandomForestClassifier()
使用下面的代码片段:
classifier.fit(train_vectors,trainy)
但是,将我的向量化器的转换后的集合转换为带有的toarray()
函数的numpy数组时trainset
,我看到该程序仅用了100k个示例,而特征向量的大小为2000,就占用了大量内存(大约4-5 GB)。每个示例,即100,000x2000特征向量。
这是我的系统可以执行的最大操作,因为我只有8GB的RAM。有人可以给我一些建议,建议我如何进行操作,以便能够通过可能的方式修改代码来使用可用的内存来训练整个1.6M的训练数据集。如果我尝试使用上面的代码,它将需要大约72 gigs RAM,这是不可行的。
我还知道,有一些规定可以用迭代设置的一部分训练增量地训练某些分类器。量词如MultinomialNB()
和BernoulliNB()
具有该(使用规定partial_fit
的是我还使用),但是其他分类不这样做,所以这不是一个选项。
问题是,您首先要实现什么目标?我要问的原因是,根据问题的本质,矢量化文本具有大量尺寸。此外,max_features=2000
在文本分类方面,您也无法获得足够的表现。
长话短说:您提到的大多数分类器都适用于稀疏向量,除了GaussianNB
,可以使用以下方法轻松验证:
from sklearn.naive_bayes import GaussianNB, MultinomialNB, BernoulliNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.ensemble import GradientBoostingClassifier
from scipy.sparse import csr_matrix
from sklearn.datasets import load_digits
digits = load_digits()
X, y = digits.data, digits.target
for CLF in [GaussianNB, MultinomialNB, BernoulliNB, LogisticRegression, LinearSVC, GradientBoostingClassifier]:
print(CLF.__name__, end='')
try:
CLF().fit(csr_matrix(X), y == 0)
print(' PASS')
except TypeError:
print(' FAIL')
哪个输出:
GaussianNB FAIL
MultinomialNB PASS
BernoulliNB PASS
LogisticRegression PASS
LinearSVC PASS
GradientBoostingClassifier PASS
我建议您只是GaussianNB
从列表中删除,然后使用支持稀疏向量的分类器。您至少应该能够处理8g限制内的更多样品。
关于scikit-learn,另请参见本期,引用Jake Vanderplas:
稀疏输入未实现的原因之一
GaussianNB
是,非常稀疏的数据几乎可以肯定不符合算法的假设-当值的大部分为零时,简单的高斯不能很好地拟合数据,并且几乎永远不会导致进行有用的分类。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句