我正在尝试使用scikit-learn将一堆数据(情绪标记的推文(插入SVM。我一直在使用 CountVectorizer 来构建一个稀疏的字数数组,它都可以很好地处理小数据集(~5000 条推文(。但是,当我尝试使用更大的语料库(理想情况下是 150,000 条推文,但我目前正在探索 15,000 条推文(时,将稀疏格式转换为更密集格式的 .toarray()
立即开始占用大量内存(在 MemoryError 之前,30k 条推文达到 50GB 以上。
所以我的问题是 - 有没有办法LinearSVC()
或SVM的不同表现形式提供稀疏矩阵?我是否必须使用密集矩阵?似乎没有不同的矢量化器可以帮助解决这个问题(因为这个问题似乎可以通过以下方法解决:使用Scikit Learn的DictVectorizer时,toarray中的MemoryError(。不同的模型是解决方案吗?似乎所有的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)
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.