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

时间:2012-09-03 12:19:46

标签: machine-learning scikit-learn nlp regression tf-idf

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

使用unigrams时,我有53个病例和超过6000个功能。预测基于使用LeaveOneOut的交叉验证。

当我创建只有unigram分数的tf-idf稀疏矩阵时,我得到的预测略好于我创建unigram + bigram分数的tf-idf稀疏矩阵时的预测。我添加到矩阵的列越多(三元组,四元组,五元组等的列),回归预测的准确性就越低。

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

2 个答案:

答案 0 :(得分:11)

对于双胞胎来说,表现比单身人士更糟糕是不常见的,但有些情况可能会发生。特别是,添加额外功能可能会导致过度拟合。 Tf-idf不太可能缓解这个问题,因为更长的n-gram会更少,导致更高的idf值。

我不确定你想要预测的是什么样的变量,而且我从来没有对文本做过回归,但这里有一些类似的文献结果可以让你思考:

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

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

答案 1 :(得分:8)

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

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

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

这样可以忽略虚假特征,并导致稀疏模型具有许多零权重,用于噪声特征。网格搜索正则化参数非常重要。

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