R语言使用SVM分类器预测新文本时特征不匹配问题如何解决?
R语言文本Kernel SVM预测特征不匹配问题解决方案
核心原因
你遇到的报错本质是训练阶段筛选得到的2000个词特征是固定集合,但预测阶段默认基于新文本单独生成文档-词矩阵(DTM),会自动缺失新文本未出现的训练集特征、额外新增训练集没有的词,和SVM要求的输入特征维度完全不匹配。
具体解决步骤(零性能损失)
不需要删减训练用的词特征,只需要强制让预测阶段的DTM和训练集特征严格对齐即可:
- 第一步:训练阶段单独留存固定词表
完成特征选择得到2000个训练用特征后,单独保存特征名向量,不要随训练流程丢弃,示例代码:# 假设selected_train_dtm是你筛选完2000个特征后的训练集DTM train_feature_terms <- colnames(selected_train_dtm) - 第二步:预测阶段生成DTM时强制绑定训练词表
生成新文本DTM时,直接指定训练词表作为字典,不需要基于新文本生成词表,新文本未出现的训练特征会自动填充为0,新文本独有而训练集没有的词会自动忽略,完全符合SVM输入要求,以常用的tm包为例:library(tm) # 构建新文本语料 new_corpus <- VCorpus(VectorSource(new_text_data)) # 生成对齐后的DTM,核心参数为dictionary new_aligned_dtm <- DocumentTermMatrix( new_corpus, control = list( weighting = weightTfIdf, # 要和训练阶段的加权方式完全一致 dictionary = train_feature_terms ) ) - 第三步:校验特征维度后即可正常预测
预测前可加一行校验代码避免疏漏:stopifnot(ncol(new_aligned_dtm) == length(train_feature_terms))
不同文本处理框架的对齐方法
- 用
quanteda包:生成dfm时指定dictionary = as.dictionary(train_feature_terms),再调用dfm_match()直接对齐特征 - 用
tidytext做词频统计:计算新文本的词频后,用tidyr::complete(term = train_feature_terms, fill = list(n = 0))补全所有训练特征,再转成宽格式DTM即可
内容的提问来源于stack exchange,提问作者DrCrimeScience
相关产品推荐
相关产品推荐

