4

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

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

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

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

4

2 回答 2

15

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

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

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

究竟发生了什么取决于你的训练集;它可能太小了。

于 2012-09-03T12:27:29.977 回答
9

正如 larsmans 所说,添加更多变量/特征会使模型更容易过度拟合,从而降低测试准确性。在 scikit-learn 的主分支中,现在有一个min_df参数可以切断出现次数少于该次数的任何特征。因此min_df==2tomin_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 的文本分类示例(检查SelectKBestchi2实用程序。

于 2012-09-03T12:41:34.107 回答