unigrams & bigrams (tf-idf) 不如 unigrams (ff-idf) 准确?

Posted

技术标签:

【中文标题】unigrams & bigrams (tf-idf) 不如 unigrams (ff-idf) 准确?【英文标题】:unigrams & bigrams (tf-idf) less accurate than just unigrams (ff-idf)? 【发布时间】:2012-08-28 04:27:05 【问题描述】:

这是一个关于 ngram 线性回归的问题,使用 Tf-IDF(词频 - 逆文档频率)。为此,我使用 numpy 稀疏矩阵和 sklearn 进行线性回归。

在使用 unigram 时,我有 53 个案例和 6000 多个特征。预测基于使用 LeaveOneOut 的交叉验证。

当我创建一个仅包含 unigram 分数的 tf-idf 稀疏矩阵时,我得到的预测比创建一个包含 unigram+bigram 分数的 tf-idf 稀疏矩阵时要好一些。我添加到矩阵中的列越多(三元组、四元组、五元组等的列),回归预测的准确度就越低。

这很常见吗?这怎么可能?我会认为功能越多越好。

【问题讨论】:

您的任务是什么(例如,文档分类)以及您拥有什么样的/多少数据? 【参考方案1】:

二元组的性能比一元组差的情况并不常见,但在某些情况下可能会发生这种情况。特别是,添加额外的特征可能会导致过度拟合。 Tf-idf 不太可能缓解这种情况,因为更长的 n-gram 将更少,从而导致更高的 idf 值。

我不确定您要预测哪种变量,而且我从未对文本进行过回归,但这里有一些来自文献的可比较结果让您思考:

在具有小(但非平凡)训练集的随机文本生成中,7-gram 倾向于几乎逐字重建输入文本,即导致完全过拟合,而 trigram 更有可能生成“新”但仍然有点语法/可识别的文本(请参阅Jurafsky & Martin;不记得是哪一章,而且我手边没有副本)。 在使用内核机器执行的分类式 NLP 任务中,二次内核往往比三次内核表现更好,因为后者通常在训练集上过拟合。请注意,unigram+bigram 特征可以被认为是二次核特征空间的子集,以及三次核特征空间的 1,2,3-gram。

具体发生的情况取决于您的训练集;它可能太小了。

【讨论】:

我的结果是通过 Leave One Out 交叉验证获得的。我有 53 个样本,每个样本在训练之前都从训练集中取出。这本身不会防止过度拟合吗? @Zach:不;当没有单独的验证或测试集时,交叉验证只是进行任何类型评估的最低要求。 53 个样本是一个非常小的训练集。另外,我刚刚在 scikit-learn 邮件列表上看到了你的消息,我读到你正在做情绪分析。在这种情况下,删除 tf-idf 并使用原始频率、次线性 tf 或布尔项出现。 idf 低估了情感词的重要性,因为它旨在找到由文本中稀有词指示的主题相似性。 53 个样本对于文本分类来说是非常少的。与其尝试调整特征提取和学习算法,不如花时间标记更多数据(半自动,可能使用外部数据源)。 @Zach 注释至少 100 * n_classes(例如,200 用于二进制分类)。然后计算 50%、60%、70%、80%、90% 和 100% 数据的交叉验证分数,并考虑测试误差曲线:通过考虑每个段的斜率,您应该观察到一些收益递减。准确性提高和注释成本之间的权衡是特定于问题的,但这条曲线应该为您提供做出明智决定的工具(即不完全在黑暗中:)。 另一方面,机器学习(无监督学习、半监督学习和主动学习)可以帮助降低标记新样本的成本。但是我还没有准备好使用 scikit-learn 主动学习循环。【参考方案2】:

正如 larsmans 所说,添加更多变量/特征会使模型更容易过度拟合,从而降低测试准确性。在 scikit-learn 的 master 分支中,现在有一个 min_df 参数来切断出现次数少于该次数的任何特征。因此,min_df==2min_df==5 可能会帮助您摆脱虚假的二元语法。

或者,您可以使用以下任一类来使用 L1 或 L1 + L2 惩罚线性回归(或分类):

sklearn.linear_model.Lasso(回归) sklearn.linear_model.ElasticNet(回归) sklearn.linear_model.SGDRegressor(回归),惩罚 == 'elastic_net' 或 'l1' sklearn.linear_model.SGDClassifier(分类),惩罚 == 'elastic_net' 或 'l1'

这将使忽略虚假特征成为可能,并导致稀疏模型具有许多零权重的噪声特征。不过,网格搜索正则化参数将非常重要。

您还可以尝试单变量特征选择,例如完成 scikit-learn 的 text classification example(检查 SelectKBestchi2 实用程序。

【讨论】:

chi2 特征选择实际上不适用于回归。它可能会被黑客入侵以处理合并的回归结果。 当你说min_df在Master Branch时,你是指0.11以后的开发版本吗? 是官方github repo的master分支:github.com/scikit-learn/scikit-learn 注意:min_df 现在是 scikit-learn 已发布版本(0.14 及更高版本)的一部分。

以上是关于unigrams & bigrams (tf-idf) 不如 unigrams (ff-idf) 准确?的主要内容,如果未能解决你的问题,请参考以下文章

统计语言模型Python实现

Bigram 在 weka 中包含停用词?

LeetCode -- 1078. Occurrences After Bigram

N-Gram

机器学习新手项目之N-gram分词

使用Python计算N Grams