是否可以逐步训练 sklearn 模型(例如 SVM)?
Is it possible to train a sklearn model (eg SVM) incrementally?
我正在尝试对 Twitter 数据集 "Sentiment140" 执行情绪分析,该数据集包含 160 万条带标签的推文。我正在使用 Bag Of Words (Unigram) 模型构建我的特征向量,因此每条推文都由大约 20000 个特征表示。现在要使用此数据集训练我的 sklearn 模型(SVM、逻辑回归、朴素贝叶斯),我必须将整个 1.6m x 20000 特征向量加载到一个变量中,然后将其提供给模型。即使在我总共有 115GB 内存的服务器机器上,它也会导致进程被终止。
所以我想知道我是否可以逐个实例地训练模型,而不是将整个数据集加载到一个变量中?
如果 sklearn 没有这种灵活性,那么您是否可以推荐任何其他库(支持顺序学习)?
走到另一个极端并逐个实例地训练是没有必要的(更不用说效率了);你要找的其实叫 incremental 或 online learning,scikit-learn 的 SGDClassifier
for linear SVM and logistic regression, which indeed contains a 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)
loss
和 penalty
参数(分别为 'hinge'
和 'l2'
)的默认值是 LinearSVC
,所以上面的代码本质上逐渐适合具有 L2 正则化的线性 SVM 分类器;这些设置当然可以更改 - 查看文档了解更多详细信息。
有必要在第一次调用中包含 classes
参数,它应该包含问题中所有现有的 类(即使其中一些可能不存在于某些问题中)部分拟合);它可以在 partial_fit
的后续调用中省略 - 再次,请参阅链接文档以获取更多详细信息。
我正在尝试对 Twitter 数据集 "Sentiment140" 执行情绪分析,该数据集包含 160 万条带标签的推文。我正在使用 Bag Of Words (Unigram) 模型构建我的特征向量,因此每条推文都由大约 20000 个特征表示。现在要使用此数据集训练我的 sklearn 模型(SVM、逻辑回归、朴素贝叶斯),我必须将整个 1.6m x 20000 特征向量加载到一个变量中,然后将其提供给模型。即使在我总共有 115GB 内存的服务器机器上,它也会导致进程被终止。
所以我想知道我是否可以逐个实例地训练模型,而不是将整个数据集加载到一个变量中?
如果 sklearn 没有这种灵活性,那么您是否可以推荐任何其他库(支持顺序学习)?
走到另一个极端并逐个实例地训练是没有必要的(更不用说效率了);你要找的其实叫 incremental 或 online learning,scikit-learn 的 SGDClassifier
for linear SVM and logistic regression, which indeed contains a 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)
loss
和 penalty
参数(分别为 'hinge'
和 'l2'
)的默认值是 LinearSVC
,所以上面的代码本质上逐渐适合具有 L2 正则化的线性 SVM 分类器;这些设置当然可以更改 - 查看文档了解更多详细信息。
有必要在第一次调用中包含 classes
参数,它应该包含问题中所有现有的 类(即使其中一些可能不存在于某些问题中)部分拟合);它可以在 partial_fit
的后续调用中省略 - 再次,请参阅链接文档以获取更多详细信息。