可以逐步训练sklearn模型(例如SVM)吗?

时间:2019-02-16 12:03:47

标签: machine-learning scikit-learn svm logistic-regression

我正在尝试对包含160万条带标签推文的Twitter数据集“ Sentiment140”进行情感分析。我正在使用单词袋(Unigram)模型构建特征向量,因此每条推文都由约20000个特征表示。现在要使用该数据集训练我的sklearn模型(SVM,Logistic回归,朴素贝叶斯),我必须将整个1.6m x 20000特征向量加载到一个变量中,然后将其输入模型。即使在我的服务器计算机上总共有115GB的内存,它也会导致进程被终止。

所以我想知道是否可以逐个实例训练模型实例,而不是将整个数据集加载到一个变量中?

如果sklearn不具有这种灵活性,那么您是否可以推荐其他库(支持顺序学习)?

1 个答案:

答案 0 :(得分:0)

去另一个极端并逐个实例进行训练并不是真正必要(更不用说高效了)。您正在寻找的内容实际上称为 incremental online 学习,它在scikit-learn的SGDClassifier中可用于 linear SVM和逻辑回归,其中确实包含一个partial_fit方法。

这是一个有关伪数据的简单示例:

import numpy as np
from sklearn import linear_model
X = np.array([[-1, -1], [-2, -1], [1, 1], [2, 1]])
Y = np.array([1, 1, 2, 2])
clf = linear_model.SGDClassifier(max_iter=1000, tol=1e-3)

clf.partial_fit(X, Y, classes=np.unique(Y))

X_new = np.array([[-1, -1], [2, 0], [0, 1], [1, 1]])
Y_new = np.array([1, 1, 2, 1])
clf.partial_fit(X_new, Y_new)

losspenalty参数的默认值(分别为'hinge''l2')是LinearSVC的默认值,因此上述代码基本上适合具有L2正则化的线性SVM分类器;这些设置当然可以更改-请查看文档以了解更多详细信息。

有必要在第一个调用中包含classes参数,该参数应包含问题中所有现有的类(即使其中一些可能不存在于某些局部拟合中);可以在随后的partial_fit调用中将其省略-再次,请参阅链接的文档以获取更多详细信息。