我正在设计一个scikit学习分类器,它有5000多个类别,训练数据至少是8000万,每年可能会增加到1亿。我已经尝试过所有类别,但它生成的分类器的顺序是100s的GBs二进制文件。因此,我认为每个类别有一个分类器将是有帮助的,也将帮助我微调每个类别的特征,从而提高准确性,但这意味着每个类别有5k+分类器。那么,考虑到我将继续获取额外的训练数据,并可能发现新的类别,如何处理这种大数据需求,以及在这种情况下使用哪些增量分类器?
更新:
功能的数量约为45个,大部分是基于文本的,大多数是基于文本的值,基数很大,即许多功能可能有大量可能的值,可用的RAM为32gb,8核CPU。我尝试了多项式NB和线性SGD,稀疏矩阵非常稀疏。使用scikit学习听写矢量器对特征字典进行矢量化。pandas数据帧是否也有助于优化总体配置?

最佳答案

总结一下我们的讨论:
增量分类器
当你需要进行非核心学习(即你的所有数据都不适合内存)时,“增量”分类器是很好的候选者。
在scikit learn中,您提到了MultinomialNBSGDClassifier,这是实现partial_fitapi的两个主要分类器。
对于你来说,在线学习算法似乎是完美的。如果你想走那条路的话,你可以去看看沃夫帕瓦比特。我有机会用它来解决一个类似的问题(6k+类),而且模型比100GBs要轻得多。我不记得确切的尺寸,但我能在我的个人电脑上储存一堆;)。
请注意,VW的文档有点少(不像scikit学习那样),如果您有一个复杂的用例,您可能需要阅读一些文档。这里有a good tutorial开始。
腌制模型的大小
你的整个腌制管道大约是100GBs,这对我来说太大了。我建议每一步都单独腌制,以此来描述这个问题。
有时,您可以在选取估计器之前删除一些属性。例如stop_words_表示TfidfVectorizer(参见the docs)。
如果这些步骤存储的是大型numpy数组,joblib.dumpfrom sklearn.externals import joblib)可以是pickle的一种更节省内存的替代方法。
训练多个二进制分类器
你可能不想自己去关心5k+的分类器。您所描述的是执行多类分类的一对多策略。
注意,当使用LogisticRegressionSGDClassifier时,这已经是解决多类问题的方法。
结论
我认为VowpalWabbit看起来非常适合,但是可能还有其他工具可以用于您的用例。
最后一点:pandas不会帮助制作更轻的模型,但它是一个很好的处理/转换数据的库。

关于python - 用于大量类别的分类器和技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32557895/

10-12 00:22
查看更多