在 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 中将 RandomizedSearchCV(或 GridSearcCV)与 LeaveOneGroupOut 交叉验证相结合