【问题标题】:How to overcome SVM memory requirement如何克服 SVM 内存需求
【发布时间】:2016-02-23 18:15:10
【问题描述】:

我在 scikit-learn 中使用 SVM 函数 (LinearSVC)。我的数据集和特征数量非常大,但我的 PC RAM 不足,这会导致交换,减慢速度。请建议我如何处理这个问题(除了增加 RAM)。

【问题讨论】:

  • n 是您的观察数量,d 是特征数量。您可以减少 n 或减少 d 或两者兼而有之。
  • 我的问题是大量的特征(按 10**5 的顺序)

标签: python scikit-learn svm


【解决方案1】:

简而言之,如果不减少数据大小或增加机器上的 RAM,您将无法在此处使用 SVC。正如在 scikit-learn 中实现的(通过 libsvm 包装器),该算法需要一次查看所有数据。

较大数据集的一个选择是通过partial_fit() 方法转移到允许在线拟合的模型。一个非常接近 SVC 的在线算法示例是随机梯度下降分类器,在 sklearn.linear_model.SGDClassifier 中实现。通过它的partial_fit 方法,您可以一次只调整一点数据,而不会遇到在像SVC 这样的单批算法中可能会遇到的那种内存问题。这是一个例子:

from sklearn.linear_model import SGDClassifier
from sklearn.datasets import make_blobs

# make some fake data
X, y = make_blobs(n_samples=1000010,
                  random_state=0)

# train on a subset of the data at a time
clf = SGDClassifier()
for i in range(10):
    subset = slice(100000 * i, 100000 * (i + 1))
    clf.partial_fit(X[subset], y[subset], classes=np.unique(y))

# predict on unseen data
y_pred = clf.predict(X[-10:])

print(y_pred)
# [2 0 1 2 2 2 1 0 1 1]

print(y[-10:])
# [2 0 1 2 2 2 1 0 1 1]

有关将 scikit-learn 用于大型数据集的更多信息,您可以查看 sklearn 文档中的 Strategies to scale computationally: bigger data 页面。

【讨论】:

  • 如果我理解正确,SGDClassifier() 在使用 partial_fit 时只运行 1 次迭代或 epoch。我想知道这是否会为我的 3000 个样本数据集提供良好的准确度分数。我的问题来自大量的功能(按 10^5 的顺序)
  • 您确定需要具有这么多功能的 SVM 吗?在这样一个高维空间中,一个更简单的模型通常可以表现得一样好,但复杂度要低得多。您也可以尝试通过RandomizedPCA 之类的方法或直接通过feature selection 例程来减少数据维度。
  • 我自己也想知道这一点,但在我提到的一些类似的工作中它似乎是如何完成的。感谢您的建议。
猜你喜欢
  • 2011-12-29
  • 2013-11-14
  • 2019-11-19
  • 2014-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多