是否可以逐步训练 sklearn 模型(例如 SVM)? [复制]
Posted
技术标签:
【中文标题】是否可以逐步训练 sklearn 模型(例如 SVM)? [复制]【英文标题】:Is it possible to train a sklearn model (eg SVM) incrementally? [duplicate] 【发布时间】:2019-07-10 09:29:59 【问题描述】:我正在尝试对 twitter 数据集“Sentiment140”执行情感分析,该数据集由 160 万条标记的推文组成。我正在使用 Bag Of Words (Unigram) 模型构建我的特征向量,因此每条推文都由大约 20000 个特征表示。现在要使用此数据集训练我的 sklearn 模型(SVM、逻辑回归、朴素贝叶斯),我必须将整个 1.6m x 20000 特征向量加载到一个变量中,然后将其输入模型。即使在我总共有 115GB 内存的服务器机器上,它也会导致进程被杀死。
所以我想知道我是否可以逐个实例地训练模型,而不是将整个数据集加载到一个变量中?
如果 sklearn 不具备这种灵活性,那么您可以推荐任何其他库(支持顺序学习)吗?
【问题讨论】:
如果数据不适合内存,您可以考虑通过 PCA 或 word2vec 降低维度 【参考方案1】:真的没有必要(更不用说高效)走到另一个极端,逐个实例地训练;您正在寻找的实际上称为 增量 或 在线 学习,它可以在 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)
loss
和penalty
参数的默认值(分别为'hinge'
和'l2'
)是LinearSVC
的默认值,所以上面的代码本质上是逐步拟合带有L2 正则化的线性SVM 分类器;这些设置当然可以更改 - 查看文档了解更多详细信息。
有必要在第一次调用中包含classes
参数,该参数应包含问题中的所有现有类(即使其中一些可能不存在于某些部分拟合中);在后续调用 partial_fit
时可以省略它 - 再次,请参阅链接文档了解更多详细信息。
【讨论】:
类 (classes=np.unique(Y)) 是否仅适用于这个特定的数据片?还是必须是存储在某个地方的整套类? @desertnaut:你能解释一下instance by instance training是什么意思吗? @aspiring1 它只是表示当时一个样本(实例)以上是关于是否可以逐步训练 sklearn 模型(例如 SVM)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章