scikit-learn 可以处理多少文本?

Posted

技术标签:

【中文标题】scikit-learn 可以处理多少文本?【英文标题】:How much text can handle scikit-learn? 【发布时间】:2014-11-17 02:13:32 【问题描述】:

我有一个情绪分析任务,我需要指定 scikit 可以处理多少数据(在我的例子中是文本)。我有一个包含 2500 条意见的语料库,所有这些都已标记。我现在它是一个小型语料库,但我的论文顾问要求我专门讨论 scikit 学习可以处理多少数据。我的顾问对 python/scikit 有疑问,她想知道有多少文本参数、特征和相关的东西可以处理 scikit-learn。

【问题讨论】:

【参考方案1】:

以下是我机器上 scikit-learn 文档分类示例的一些时间安排(Python 2.7、NumPy 1.8.2、SciPy 0.13.3、scikit-learn 0.15.2、英特尔酷睿 i7-3540M 笔记本电脑使用电池供电)。数据集是 20 个新闻组;我已经对输出进行了相当多的调整。

$ python examples/document_classification_20newsgroups.py --all_categories
data loaded
11314 documents - 22.055MB (training set)
7532 documents - 13.801MB (test set)
20 categories

Extracting features from the training dataset using a sparse vectorizer
done in 2.849053s at 7.741MB/s
n_samples: 11314, n_features: 129792

Extracting features from the test dataset using the same vectorizer
done in 1.526641s at 9.040MB/s
n_samples: 7532, n_features: 129792

________________________________________________________________________________
Training: 
LinearSVC(C=1.0, class_weight=None, dual=False, fit_intercept=True,
     intercept_scaling=1, loss='l2', multi_class='ovr', penalty='l2',
     random_state=None, tol=0.001, verbose=0)
train time: 5.274s
test time:  0.033s
f1-score:   0.860
dimensionality: 129792
density: 1.000000

________________________________________________________________________________
Training: 
SGDClassifier(alpha=0.0001, class_weight=None, epsilon=0.1, eta0=0.0,
       fit_intercept=True, l1_ratio=0.15, learning_rate='optimal',
       loss='hinge', n_iter=50, n_jobs=1, penalty='l2', power_t=0.5,
       random_state=None, shuffle=False, verbose=0, warm_start=False)
train time: 3.521s
test time:  0.038s
f1-score:   0.857
dimensionality: 129792
density: 0.390184

________________________________________________________________________________
Training: 
MultinomialNB(alpha=0.01, class_prior=None, fit_prior=True)
train time: 0.161s
test time:  0.036s
f1-score:   0.836
dimensionality: 129792
density: 1.000000


________________________________________________________________________________
Training: 
BernoulliNB(alpha=0.01, binarize=0.0, class_prior=None, fit_prior=True)
train time: 0.167s
test time:  0.153s
f1-score:   0.761
dimensionality: 129792
density: 1.000000

未显示数据集加载的时间,但时间不超过半秒;输入是一个包含文本的压缩文件。 “提取特征”包括标记化和停用词过滤。所以总的来说,我可以在 5 秒内加载 18.8k 个文档并在其中的 11k 个文档上训练一个朴素贝叶斯分类器,或者在 10 秒内训练一个 SVM。这意味着要解决一个 20×130k 维度的优化问题。

我建议你在你的机器上重新运行这个例子,因为实际花费的时间取决于很多因素,包括磁盘的速度。

[免责声明:我是 scikit-learn 开发人员之一。]

【讨论】:

谢谢,正如我在我想使用 scikit 做论文之前所说的那样。 SVM算法呢,能传递多少特征呢? @anon ***.com/questions/16326699/…【参考方案2】:

如果您在尝试加载的数据量方面遇到问题,This Scikit page 可能会提供一些答案。

正如您在关于数据大小concerning Weka 的其他问题中所述,我同意 ealdent 的观点,即您的数据集看起来确实很小(除非您有非常多的特征)并且加载这样的数据集应该不是问题大小到内存中。

希望这会有所帮助!

【讨论】:

当然,我没有考虑那么多功能。那又怎样?,scikit 能处理多少功能? This 可以帮助您解决这个问题。 那么scikit中的SVM不是最好的选择吗?【参考方案3】:

问题不在于scikit-learn,而在于你想使用什么算法。 scikit-learn 的大部分内部都是在CFortran 中实现的,所以效率很高。例如,scikit-learn 随机森林是最快的 (see page 116 in this link)。为了将文本转换为向量,我已经成功地在几秒钟内在我的桌面上运行了一个包含 50k 文档的数据集和几 GB 的内存。如果您愿意使用散列矢量化器(以换取无法解释特征词汇表),您甚至可以做得更好。在分类器方面,朴素贝叶斯花费O(NVC) 时间,其中N 是文档数,V 是特征数,C 是类数。非线性 SVM 可能会给您更好的结果,但会花费 更多 更长的时间。如果您开始将内容存储在密集的 numpy 矩阵(而不是稀疏的 scipy 矩阵)中,则更有可能耗尽内存。

【讨论】:

我真的明白 scikit 的大部分代码都是用 C 语言编写的,但是我的顾问坚持使用 weka,它的大部分代码都是用 java 编写的。他让我争论为什么 scikit 是一个更好的工具,显然它比 weka 更好。我怎样才能更正式地争论他?

以上是关于scikit-learn 可以处理多少文本?的主要内容,如果未能解决你的问题,请参考以下文章

使用scikit-learn 估计器分类

如何使用 TRAINS python 自动魔法实验管理器手动注册 sci-kit 模型?

Sci-kit 分类阈值

如何使用 scikit-learn 为机器学习准备文本数据

如何将个人 PNG 数据集放入 Sci-Kit Learn 进行图像识别?

在 scikit-learn 中,DBSCAN 可以使用稀疏矩阵吗?