Gau*_*mar 12 classification machine-learning document-classification scikit-learn text-classification
在这个问题上,过去2-3周我一直在绞尽脑汁.我有一个多标签(不是多级)的问题,每个样品可以属于多个标签的.
我有大约450万个文本文档作为训练数据,大约100万个作为测试数据.标签大约35K.
我正在使用scikit-learn.对于特征提取我以前使用TfidfVectorizer它没有规模可言,我现在用的HashVectorizer这是更好的,但不是可扩展鉴于我有文件的数量.
vect = HashingVectorizer(strip_accents='ascii', analyzer='word', stop_words='english', n_features=(2 ** 10))
Run Code Online (Sandbox Code Playgroud)
SKlearn提供OneVsRestClassifier,我可以在其中提供任何估算器.对于多标签,我发现LinearSVC和SGDClassifier只能正常工作.根据我的基准,SGD在内存和时间方面都优于LinearSVC.所以,我有这样的事情
clf = OneVsRestClassifier(SGDClassifier(loss='log', penalty='l2', n_jobs=-1), n_jobs=-1)
Run Code Online (Sandbox Code Playgroud)
但是这有一些严重的问题:
我会手工做多标签部分.无论如何,OneVsRestClassifier将它们视为独立问题.您可以创建n_labels许多分类器,然后在它们上调用partial_fit.如果你只想要哈希一次(我建议),你不能使用管道.不确定加速哈希矢量化器.你得问@Larsmans和@ogrisel;)
有partial_fit上OneVsRestClassifier将是一个很好的补充,我看不出它一个特别的问题,其实.您也可以尝试自己实现并发送PR.
OneVsRestClassifier实现的算法非常简单:当有K类时,它只适合K二元分类器.您可以在自己的代码中执行此操作,而不是依赖于此.您也可以并行处理最多K个核心:只运行K个进程.如果您的机器中有多个类而不是处理器,则可以使用GNU parallel等工具安排培训.OneVsRestClassifierHashingVectorizer,但我(其中一个散列码的作者)还没有完成它.至于功能的数量,它取决于问题,但对于大规模的文本分类2 ^ 10 = 1024似乎非常小.我会尝试2 ^ 18 - 2 ^ 22左右的东西.如果训练具有L1惩罚的模型,则可以调用sparsify训练模型将其权重矩阵转换为更节省空间的格式.