如何克服SVM的内存需求问题

4

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


n 成为你的观察数量,让 d 成为特征数量。你可以减少 n 或减少 d 或两者都减少。 - cel
相关答案:https://dev59.com/13HYa4cB1Zd3GeqPIjS7 - jakevdp
我的问题是特征数量太多了(达到10的5次方)。 - ng0323
1个回答

2
简而言之,如果不减小数据大小或增加计算机的 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文档中扩展计算策略:更大的数据页面。

如果我理解正确的话,SGDClassifier()在使用partial_fit时只运行1次迭代或周期。我想知道这是否会为我的3000个样本数据集提供良好的准确度分数。我的问题来自于大量特征(数量级为10^5)。 - ng0323
你确定需要那么多特征的SVM吗?在如此高维度的空间中,一个更简单的模型通常可以表现得同样好,且复杂度更低。你也可以尝试通过一些方式来减少数据的维度,例如使用"RandomizedPCA"或直接进行特征选择。详情请参见特征选择 - jakevdp
我自己也有疑问,但是在我参考的一些类似工作中似乎是这样完成的。感谢您的建议。 - ng0323

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