You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言SVM训练模型测试新CSV数据集时出现匹配错误求助

解决SVM分类时"test data does not match model"错误

问题分析

你碰到的这个错误Error in predict.svm(model, container@classification_matrix, prob = TRUE, : test data does not match model !,核心原因是训练数据和测试数据的特征矩阵(TF-IDF矩阵)维度不匹配。

当你分别用create_matrix处理训练集和新测试集时,两者生成的词汇特征表大概率不一样——新数据里可能有训练集没见过的词,或者训练集有的词新数据里没有,这就导致特征矩阵的列数不一致,SVM模型自然没法正常预测。


解决方案

要搞定这个问题,关键是复用训练阶段的词汇表来构建测试集的特征矩阵,而不是单独给新数据重新生成矩阵。具体步骤如下:

  1. 保存训练时的词汇表
    在训练阶段生成完特征矩阵后,把它的词汇表提取并保存下来:
# 训练阶段完成后,提取并保存词汇表
train_vocab <- colnames(matrix)
saveRDS(train_vocab, "train_vocab.rds")
  1. 用训练词汇表构建测试集特征矩阵
    处理新数据时,先加载保存的词汇表,强制新数据的特征矩阵和训练集保持完全一致:
# 加载训练阶段的词汇表
train_vocab <- readRDS("train_vocab.rds")

# 构建新数据的TF-IDF矩阵,指定vocabulary参数复用训练词汇
matrix <- create_matrix(new["Title"], 
                       language="english", 
                       weighting=tm::weightTfIdf,
                       vocabulary=train_vocab)
  1. 修正容器创建参数
    测试新数据时,create_container的参数可以调整得更合理:
# 纯测试场景下,trainSize设为NULL,testSize覆盖全部新数据,virgin设为TRUE(表示这是全新测试数据)
container <- create_container(matrix, 
                             new$TagId, 
                             trainSize=NULL, 
                             testSize=1:nrow(new),
                             virgin=TRUE)
  1. 统一结果变量名
    你最后保存结果时用了maxent_results2,但前面生成的结果变量是maxent_results,这里要保持一致:
write.csv(maxent_results, "MAXENT_res.csv", row.names = FALSE)

额外优化建议

  • 预处理逻辑要统一:把训练和测试的文本预处理步骤封装成函数,避免手动写两遍导致的不一致问题:
    preprocess_text <- function(text) {
      text <- toupper(text)
      text <- gsub("[<].*[>]", "", as.character(text))
      text <- gsub("&amp;amp", "", text)
      text <- gsub("(RT|via)((?:\\b\\W*@\\w+)+)", "", text)
      text <- gsub("@\\w+", "", text)
      text <- gsub("[[:punct:]]", "", text)
      text <- gsub("[[:digit:]]", "", text)
      text <- gsub("http\\w+", "", text)
      text <- gsub("[ \t]{2,}", "", text)
      text <- gsub("^\\s+|\\s+$", "", text)
      return(text)
    }
    
    # 训练集预处理
    train$Title <- preprocess_text(train$Title)
    # 新数据预处理
    new$Title <- preprocess_text(new$Title)
    

内容的提问来源于stack exchange,提问作者suman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:59:51