Machine learning Unigram&;比格图(tf-idf)不如单格图(ff-idf)准确?

Machine learning Unigram&;比格图(tf-idf)不如单格图(ff-idf)准确?,machine-learning,scikit-learn,nlp,regression,tf-idf,Machine Learning,Scikit Learn,Nlp,Regression,Tf Idf,这是一个关于使用Tf IDF(术语频率-逆文档频率)的ngrams线性回归的问题。为此,我使用numpy稀疏矩阵和sklearn进行线性回归 使用Unigram时,我有53个案例和6000多个功能。这些预测基于使用LeaveOneOut的交叉验证 当我创建一个只包含unigram分数的tf idf稀疏矩阵时,我得到的预测比创建一个包含unigram+bigram分数的tf idf稀疏矩阵时稍微好一些。我向矩阵中添加的列越多(三元图、四元图、五元图等列),回归预测的准确度就越低 这是常见的吗?这怎

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

使用Unigram时,我有53个案例和6000多个功能。这些预测基于使用LeaveOneOut的交叉验证

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


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

bigram的性能不如unigram并不常见,但在某些情况下可能会出现这种情况。特别是,添加额外功能可能会导致过度安装。Tf idf不太可能缓解这种情况,因为n克越长,idf值越高

我不确定你想预测什么样的变量,我也从来没有对文本进行过回归,但这里有一些来自文献的可比结果让你思考:

  • 在使用小型(但非琐碎的)训练集的随机文本生成中,7-gram倾向于几乎一字不差地重建输入文本,即导致完全过度拟合,而trigram更可能生成“新”文本,但仍有一些语法/可识别文本(请参阅;记不起哪一章,我手头也没有副本)
  • 在使用核机器执行的分类风格NLP任务中,二次核往往比三次核表现得更好,因为后者往往在训练集上过度拟合。注意,可以将单图+双图特征视为二次核特征空间的子集,并将{1,2,3}-图视为三次核特征空间的子集

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

正如拉斯曼所说,添加更多的变量/特征会使模型更容易过度拟合,从而降低测试精度。在scikit learn的主分支中,现在有一个
min_df
参数,用于切断出现次数小于该次数的任何特征。因此,
min_df==2
min_df==5
可能会帮助您消除虚假的bi图

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

  • sklearn.linear_model.Lasso(回归)
  • sklearn.linear_model.ElasticNet(回归)
  • sklearn.linear_model.SGDRegressor(回归),带惩罚=='elastic_net'或'l1'
  • sklearn.linear_model.sgdclassizer(分类),带惩罚=='elastic_net'或'l1'
这将使忽略虚假特征成为可能,并导致针对噪声特征的具有许多零权重的稀疏模型。网格搜索正则化参数将非常重要


您还可以尝试单变量功能选择,例如完成scikit学习(检查
SelectKBest
chi2
实用程序。

您的任务是什么(例如,文档分类)你有什么样的/多少数据?
chi2
功能选择实际上不适用于回归。它可能会被黑客攻击以处理组合回归结果。当你说min_df在主分支中时,你是指0.11之后的开发版本吗?是的,官方github repo的主分支:注意:
min_df
现在是scikit learn(0.14及更高版本)发布版本的一部分。我的结果是通过省略一个交叉验证获得的。我有53个样本,每个样本在训练前都从训练集中取出。这本身难道不能防止过度拟合吗?@Zach:不;交叉验证只是在没有单独验证或测试集的情况下进行任何类型评估的最低要求。53个样本是一个非常复杂的问题小训练集。另外,我刚刚在scikit learn邮件列表上看到你的消息,我看到你正在进行情绪分析。在这种情况下,删除tf idf并使用原始频率、次线性tf或布尔词出现次数。idf低估了情绪词的重要性,因为它旨在发现主题相似性,即y文本中较罕见的单词。53对于文本分类来说,样本很少。与其尝试调整特征提取和学习算法,不如投入时间标记更多数据(半自动,可能使用外部数据源)。@Zach注释至少100个*n_类(例如,对于二进制分类,200个)然后计算你的数据的50%、60%、70%、80%、90%和100%的交叉验证分数,并考虑测试误差曲线:考虑每个段的斜率,你应该观察到一些递减的回报。准确性改进和注释成本之间的折衷是特定的问题,但是这条曲线应该给你提供一个通知的工具。决策(即,并非完全处于黑暗中:)。另一方面,机器学习(无监督学习、半监督学习和主动学习)有助于降低标记新样本的成本。但是,我没有现成的scikit学习-主动学习循环。