繁体   English   中英

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

[英]How to train/upscale a very large dataset using 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()RandomForestClassifier()

classifier.fit(train_vectors,trainy)

然而,在我向量化的转换集转换为numpy的阵列与toarray()函数的trainset ,我看到该程序是使用了内存很大(约4-5 GB)只需100K与特征向量的例子每个示例的大小为2000,即100,000x2000特征向量。

这是我的系统可以做的最大值,因为我只有8GB的RAM。 有人可以提出关于我如何进行的建议,以便能够通过可能修改代码来训练整个1.6M的训练数据集和可用的内存。 如果我尝试使用上面的代码,它将需要大约72 GB的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中没有实现稀疏输入的一个原因是非常稀疏的数据几乎肯定不符合算法的假设 - 当大部分值为零时,简单的高斯不适合数据,并且几乎不会导致有用的分类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM