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

Zac*_*ach 3 nlp regression machine-learning tf-idf scikit-learn

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

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

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

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

Fre*_*Foo 12

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

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

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

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

  • @Zach:不; 当没有单独的验证或测试集时,交叉验证只是进行任何类型评估的最低要求.53个样本是*非常小的训练集.此外,我刚刚在scikit-learn邮件列表上看到了您的消息,我读到您正在进行情绪分析.在这种情况下,删除tf-idf并使用原始频率,次线性tf或布尔项出现.idf低估了情感词的重要性,因为它旨在找到主题相似性,这是由文本中较少的单词表示的. (5认同)
  • @Zach注释至少100*n_classes(例如200用于二进制分类).然后计算50%,60%,70%,80%,90%和100%数据的交叉验证分数并考虑测试误差曲线:您应该通过考虑每个分段的斜率来观察一些递减收益.精度提高和注释成本之间的权衡是特定于问题的,但是这条曲线应该为您提供做出明智决定的工具(即不完全在黑暗中:). (3认同)

ogr*_*sel 8

正如larsmans所说,添加更多变量/特征会使模型更容易过度拟合,从而导致测试精度下降.在scikit-learn的主分支中,现在有一个min_df参数来切断任何少于该次数的特征.因此min_df==2,min_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实用程序.