yuauauaua 2024-04-13 23:16 采纳率: 0%
浏览 15

R模型预测报错:variables in the training data missing in newdata

在R中用样本点光谱数据训练了一个随机森林模型,然后用整个研究区的光谱数据应用训练好的模型预测,会出现”variables in the training data missing in newdata“的报错,重新使用训练数据来预测,也会出现同样的问题。
已经检查过变量列名都是对应的,想知道究竟是为什么会产生这样的问题

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-13 23:16
    关注

    引自免费微信小程序:皆我百晓生

    这个问题通常发生在尝试将训练数据集中的特征应用于新数据集时,新数据集中缺少某些特征。为了解决这个问题,你需要确保新数据集(即整个研究区的光谱数据)包含了与训练数据集相同的变量(列)。即使列名相同,也有可能存在缺失值或数据类型不匹配的情况。这里有几个步骤可以帮助你排查问题并解决它:

    1. 检查变量数量: 确保两个数据集(训练数据和新数据)具有相同数量的列。

    2. 检查列名: 使用names()函数比较两组数据的列名是否完全一致。

    3. 检查缺失值: 使用complete.cases()函数检查是否有缺失值。如果有,可以考虑填充缺失值或删除含有缺失值的行。

    4. 检查数据类型: 使用str()函数检查每个变量的数据类型是否一致,因为不同的数据类型可能会导致错误。

    5. 重新构建数据框: 如果所有列都已确认无误,但仍然存在问题,可能是因为数据结构的问题。尝试重新构建一个与训练数据具有相同列名、顺序和类型的新的数据框。

    下面是针对上述步骤的R代码示例:

    # 假设你的训练数据集是train_data,新数据集是new_data
    # 步骤1: 检查变量数量
    if (ncol(train_data) != ncol(new_data)) {
      stop("训练数据和新数据的列数不同,请检查!")
    }
    
    # 步骤2: 检查列名
    if (!all(names(train_data) == names(new_data))) {
      diff_names <- setdiff(names(train_data), names(new_data))
      if (length(diff_names) > 0) {
        warning(paste("训练数据中有新数据中不存在的列:", paste(diff_names, collapse = ", ")))
      }
      diff_names <- setdiff(names(new_data), names(train_data))
      if (length(diff_names) > 0) {
        warning(paste("新数据中有训练数据中不存在的列:", paste(diff_names, collapse = ", ")))
      }
    }
    
    # 步骤3: 检查缺失值
    train_cases <- complete.cases(train_data)
    new_cases <- complete.cases(new_data)
    
    if (!identical(train_cases, rep(TRUE, nrow(train_data)))) {
      warning("训练数据包含缺失值,请处理!")
    }
    if (!identical(new_cases, rep(TRUE, nrow(new_data)))) {
      warning("新数据包含缺失值,请处理!")
    }
    
    # 步骤4: 检查数据类型
    if (!all(sapply(1:length(names(train_data)), function(i) identical(class(train_data[, i]), class(new_data[, i]))))) {
      warning("训练数据和新数据中有些列的数据类型不一致,请检查!")
    }
    
    # 步骤5: 重新构建数据框
    # 首先,确保两组数据有相同的列顺序
    new_data <- new_data[names(train_data)]
    
    # 如果仍存在问题,可以尝试填充缺失值或删除含有缺失值的行
    # 例如,使用mean()函数填充数值型变量的缺失值
    for (i in seq_along(train_data)) {
      col_name <- names(train_data)[i]
      if (is.numeric(train_data[[col_name]])) {
        new_data[[col_name]][is.na(new_data[[col_name]])] <- mean(train_data[[col_name]], na.rm = TRUE)
      }
    }
    
    # 或者,删除含有缺失值的行
    new_data <- new_data[complete.cases(new_data), ]
    

    完成这些步骤后,你应该能够解决“variables in the training data missing in newdata”的问题。如果你仍然遇到问题,请提供具体的错误信息和部分数据样本,以便更深入地分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月13日

悬赏问题

  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?