如何缩小 bag-of-words 模型?

How to shrink a bag-of-words model?

问题标题说明了一切:我怎样才能使 bag-of-words 模型变小?我使用随机森林和 bag-of-words 特征集。我的模型大小达到 30 GB,我确信功能集中的大多数单词对整体性能没有贡献。

如何在不损失(太多)性能的情况下缩小大型 bag-of-words 模型?

如果您不想更改神经网络的架构,而只想减少内存占用,可以进行的调整是减少 CountVectorizer 注释的项。 从 scikit-learn 文档中,我们有(至少)三个参数来减少词汇量。

max_df : 在 [0.0, 1.0] 或 int 范围内浮动,默认值=1.0

构建词汇表时忽略文档频率严格高于给定阈值的术语(特定于语料库的停用词)。如果是float,参数代表文档的比例,整数绝对计数。如果词汇表不是 None.

,则忽略此参数

min_df : 在 [0.0, 1.0] 或 int 范围内浮动,默认值=1

构建词汇表时忽略文档频率严格低于给定阈值的术语。该值在文献中也称为截止值。如果是float,参数代表文档的比例,整数绝对计数。如果词汇表不是 None.

,则忽略此参数

max_features : 整数或 None, 默认=None

如果不是 None,构建一个词汇表,只考虑语料库中按词频排序的前 max_features。 如果词汇表不是 None.

,则忽略此参数

首先,尝试玩 max_dfmin_df。如果尺寸仍然不符合您的要求,您可以使用 max_features 降低尺寸。

注意:
max_features 调整可以比其他参数

更大幅度地降低分类准确率

使用特征选择。特征选择使用一些评分函数,根据特征在标签方面的分布从数据集中删除特征。

例如,很少出现或随所有标签随机出现的特征不太可能有助于准确分类,因此得分较低。

这是一个使用 sklearn 的例子:

from sklearn.feature_selection import SelectPercentile

# Assume some matrix X and labels y
# 10 means only include the 10% best features
selector = SelectPercentile(percentile=10)

# A feature space with only 10% of the features
X_new = selector.fit_transform(X, y)

# See the scores for all features
selector.scores

一如既往,请确保只对您的训练数据调用 fit_transform。使用开发或测试数据时,仅使用 transform。有关其他文档,请参阅 here

请注意,还有一个 SelectKBest,其功能相同,但允许您指定要保留的要素的绝对数量,而不是百分比。