我正在使用由1.6M推文组成的sentiment140数据集来训练和分析python中scikit-learn库中不同分类器的准确性。我正在使用以下代码片段将推文矢量化为特征向量,然后将它们提供给分类器。
vectorizer = CountVectorizer(max_features = 2000)
train_set = (vectorizer.fit_transform(trainX)).toarray()
在此之后,我训练classifier
对象,其中包括GaussianNB()
,MultinomialNB()
,BernoulliNB()
,LogisticRegression()
,LinearSVC()
和{{1}使用以下代码片段:
RandomForestClassifier()
然而,在将我的矢量化器的变换集转换为具有classifier.fit(train_vectors,trainy)
toarray()
函数的numpy数组时,我发现该程序耗尽了大量内存(约4-5 GB) )对于每个示例,只有100k示例,其特征向量为2000,即100,000x2000特征向量。
这是我的系统可以做的最大值,因为我只有8GB的RAM。有人可以提出关于我如何进行的建议,以便能够通过可能修改代码来训练整个1.6M的训练数据集和可用的内存。如果我尝试使用上面的代码,它将需要大约72 GB的RAM,这是不可行的。
我也理解有些条款可以迭代地训练某些分类器和一小部分列车。 trainset
和MultinomialNB()
等分类符对此有所规定(使用BernoulliNB()
),但我也使用的其他分类器没有,因此这不是一个选项。
答案 0 :(得分:3)
问题是,你首先要做的是什么?我要问的原因是,矢量化文本因问题的本质而具有大量维度。此外,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限制范围内使用更多样本。
另请参阅this issue了解scikit-learn,引用Jake Vanderplas:
GaussianNB
中未实现稀疏输入的一个原因是,非常稀疏的数据几乎肯定不符合算法的假设 - 当大部分值为零时,简单的高斯不适合于数据,几乎不会导致有用的分类。