每当我开始处理较多的类别(1000个及以上)时,MultinominalNB就会变得非常慢,并且需要数千兆字节的RAM。所有支持.partial_fit()的scikit-learn分类算法(如SGDClassifier、Perceptron)也存在同样的问题。在使用卷积神经网络时,处理10000个类别没有问题。但当我想用相同的数据训练MultinominalNB时,我的12GB RAM就不够用了,而且速度非常慢。根据我对Naive Bayes的理解,即使有大量的类别,它也应该快得多。这可能是scikit-learn实现的问题(可能是.partial_fit()函数的问题)吗?我怎样才能在10000+个类别上批量训练MultinominalNB/SGDClassifier/Perceptron?
回答:
简短回答,信息不多:
-
MultinomialNB为每个类别拟合一个独立模型,因此,如果你有
C=10000+
个类别,它将拟合C=10000+
个模型,因此,仅模型参数就会是[n_classes x n_features]
,如果n_features
很大,这将占用相当多的内存。 -
scikits-learn的SGDClassifier使用OVA(一对所有)策略来训练多类模型(因为SGDC本身不是多类的),因此,需要训练另外
C=10000+
个模型。 -
而Perceptron,根据scikits-learn的文档:
Perceptron和SGDClassifier共享相同的底层实现。实际上,Perceptron()相当于SGDClassifier(loss=”perceptron”, eta0=1, learning_rate=”constant”, penalty=None)。
因此,你提到的这三个分类器在处理大量类别时表现不佳,因为需要为每个类别训练一个独立的模型。我建议你尝试一些天生支持多类分类的算法,比如RandomForestClassifier。