在 scikit-learn 中将数据加载到 SVC 模型时尝试避免 .toarray()

Posted

技术标签:

【中文标题】在 scikit-learn 中将数据加载到 SVC 模型时尝试避免 .toarray()【英文标题】:Trying to avoid .toarray() when loading data into an SVC model in scikit-learn 【发布时间】:2015-02-15 05:48:41 【问题描述】:

我正在尝试使用 scikit-learn 将一堆数据(带有情感标签的推文)插入 SVM。我一直在使用 CountVectorizer 来构建一个稀疏的字数数组,并且对于小型数据集(约 5000 条推文)都可以正常工作。但是,当我尝试使用更大的语料库(理想情况下是 150,000 条推文,但我目前正在探索 15,000 条)时,.toarray() 将稀疏格式转换为更密集的格式,立即开始占用大量内存(30k 条推文在 MemoryError 之前命中超过 50gb。

所以我的问题是——有没有办法将LinearSVC() 或 SVM 的另一种表现形式提供给稀疏矩阵?我是否必须使用密集矩阵?似乎不同的矢量化器无法解决这个问题(因为这个问题似乎可以通过:MemoryError in toarray when using DictVectorizer of Scikit Learn 解决)。不同的模型是解决方案吗?似乎所有 scikit-learn 模型在某些时候都需要密集的数组表示,除非我一直在寻找错误的地方。

cv = CountVectorizer(analyzer=str.split)
clf = svm.LinearSVC()

X = cv.fit_transform(data)
trainArray = X[:breakpt].toarray()
testArray = X[breakpt:].toarray()

clf.fit(trainArray, label)
guesses = clf.predict(testArray)

【问题讨论】:

【参考方案1】:

LinearSVC.fit 及其predict 方法都可以将稀疏矩阵作为第一个参数处理,因此只需从代码中删除toarray 调用即可。

所有采用稀疏输入的估计器都记录在案。例如,LinearSVC 的文档字符串声明:

Parameters
----------
X : array-like, sparse matrix, shape = [n_samples, n_features]
    Training vector, where n_samples in the number of samples and
    n_features is the number of features.

【讨论】:

哇 - 我不敢相信我错过了,感谢您指出

以上是关于在 scikit-learn 中将数据加载到 SVC 模型时尝试避免 .toarray()的主要内容,如果未能解决你的问题,请参考以下文章

在 Scikit-learn 中将训练标签拟合到 2D 列表中

如何在 scikit-learn 管道中将时代添加到 Keras 网络

初试scikit-learn库

初试scikit-learn库

如何在 scikit-learn 中正确加载文本数据?

在 scikit-learn 中将 RandomizedSearchCV(或 GridSearcCV)与 LeaveOneGroupOut 交叉验证相结合