Scikit的LinearSVC分类器的离线训练

4
你如何训练Scikit的LinearSVC模型来处理太大或不适合放入内存的数据集?我正在尝试使用它来对文档进行分类,我有几千个已标记的示例记录,但当我尝试将所有这些文本加载到内存并训练LinearSVC时,它会占用超过65%的内存,并且在我的系统完全无响应之前我被迫将其关闭。
我是否可以将训练数据格式化为单个文件,并使用文件名将其馈送到LinearSVC中,而不必调用fit()方法?
我找到了this指南,但它只涵盖分类,并假定训练是逐步完成的,这是LinearSVC不支持的。
2个回答

4
据我所知,像LinearSVC这样的非增量实现需要整个数据集进行训练。除非您创建它的增量版本,否则您可能无法使用LinearSVC。
在scikit-learn中有一些分类器可以像您找到的指南中使用的SGDClassifier一样进行增量学习。SGDClassifier具有*partial_fit*方法,允许您分批训练它。还有几个支持增量学习的分类器,例如SGDCLassifierMultinomial Naive BayesBernoulli Naive Bayes

与LinearSVC相比,SGDClassifier的准确性要低得多,但您的结论可能是正确的。 - Cerin
@Cerin:通过提供正确的参数,可以调整SGDClassifier来实现与LinearSVC相同的模型。 - Fred Foo
@Cerin:可以理解。在scikit-learn邮件列表中,有关使用lightning替换Liblinear(用于LinearSVC)的讨论。这可能会导致更可扩展的实现。不过不要抱太大希望。 - Fred Foo
@larsmans,Lightning 看起来具有相同的 API。它如何更好地处理 out-of-core 情况?此外,我刚刚运行了一个测试,比较了 LinearSVC 和 SGDClassifier,在平均情况下,我经历了 30% 的准确率下降。 - Cerin
@Cerin 需要更多上下文:当您将数据转换为特征矩阵时,行数和列数是多少?矩阵是稀疏的还是密集的?所有特征的含义都相同(例如单词计数),还是它们不同(密集特征块、二进制特征块等)? - Peter Prettenhofer
显示剩余3条评论

-1
你可以像这样使用生成器函数。
def lineGenerator():
    with open(INPUT_FILENAMES_TITLE[0],'r') as f1:
        title_reader = csv.reader(f1)
        for line in title_reader:
            yield line[0]

然后你可以调用分类器

clf = LinearSVC()
clf.fit(lineGenerator())

这假设 INPUT_FILENAMES_TITLE[0] 是你的文件名。


Fit()在开始批量学习之前仍会将所有数据读入内存,因此使用生成器不会显着改变整体性能。我想你可能将其与partial_fit()混淆了,后者确实可以通过逐行读取数据文件的生成器来逐步进行学习。不幸的是,LinearSVC不支持partial_fit() - Cerin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接