如何使用scikit-learn训练/升级非常大的数据集?

时间:2016-03-23 14:15:33

标签: python numpy machine-learning scipy scikit-learn

我正在使用由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,这是不可行的。

我也理解有些条款可以迭代地训练某些分类器和一小部分列车。 trainsetMultinomialNB()等分类符对此有所规定(使用BernoulliNB()),但我也使用的其他分类器没有,因此这不是一个选项。

1 个答案:

答案 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中未实现稀疏输入的一个原因是,非常稀疏的数据几乎肯定不符合算法的假设 - 当大部分值为零时,简单的高斯不适合于数据,几乎不会导致有用的分类。