在不使用 row.name 的情况下组合数据集

数据挖掘 机器学习 r 预测建模
2022-02-21 16:37:57

我从一个 data.frame(或 data_frame)开始,其中包含用于分析的因 Y 变量、我的独立 X 变量和一些“Z”变量——我的建模练习不需要的额外列。

我想做的是:

  1. 创建一个没有 Z 变量的分析数据集;
  2. 将这个数据集分解成随机的训练和测试集;
  3. 找到我最好的模特;
  4. 使用该模型预测训练集和测试集;
  5. 按行重新组合训练集和测试集;最后
  6. 按列将这些数据与 Z 变量重新组合。

当然,这是提出问题的最后一步——我如何确保重新组合的训练和测试集中的行与原始数据集中的行匹配?我们可能会尝试使用原始集合中的 row.names 变量,但我同意 Hadley 的观点,即这是一个容易出错的组合(我的话,不是他的)——为什么有一个特殊列的处理方式与所有其他数据列不同?

一种替代方法是创建一个唯一标识每一行的 ID 列,然后在划分为训练集和测试集时保留该列(当然,将其从所有建模公式中排除)。这似乎也很笨拙,并且会使我的所有公式更难阅读。

这一定是一个已解决的问题——人们能告诉我他们如何处理这个问题吗?特别是使用 plyr/dplyr/tidyr 包框架?

1个回答

您既不需要使用行名,也不需要创建额外的 ID 列。这是一种基于训练集索引的方法。

一个示例数据集:

set.seed(1)
dat <- data.frame(Y = rnorm(10),
                  X1 = rnorm(10),
                  X2 = rnorm(10),
                  Z1 = rnorm(10),
                  Z2 = rnorm(10))

现在,您的步骤:

  1. 创建没有Z变量的分析数据集

    dat2 <- dat[grep("Z", names(dat), invert = TRUE)]
    dat2
    #             Y          X1          X2
    # 1  -0.6264538  1.51178117  0.91897737
    # 2   0.1836433  0.38984324  0.78213630
    # 3  -0.8356286 -0.62124058  0.07456498
    # 4   1.5952808 -2.21469989 -1.98935170
    # 5   0.3295078  1.12493092  0.61982575
    # 6  -0.8204684 -0.04493361 -0.05612874
    # 7   0.4874291 -0.01619026 -0.15579551
    # 8   0.7383247  0.94383621 -1.47075238
    # 9   0.5757814  0.82122120 -0.47815006
    # 10 -0.3053884  0.59390132  0.41794156
    
  2. 将此数据集分解为随机训练集和测试集

    train_idx <- sample(nrow(dat2), 0.8 * nrow(dat2))
    train_idx
    # [1]  7  4  3 10  9  2  1  5
    
    train <- dat2[train_idx, ]
    train
    #             Y          X1          X2
    # 7   0.4874291 -0.01619026 -0.15579551
    # 4   1.5952808 -2.21469989 -1.98935170
    # 3  -0.8356286 -0.62124058  0.07456498
    # 10 -0.3053884  0.59390132  0.41794156
    # 9   0.5757814  0.82122120 -0.47815006
    # 2   0.1836433  0.38984324  0.78213630
    # 1  -0.6264538  1.51178117  0.91897737
    # 5   0.3295078  1.12493092  0.61982575
    
    test_idx <- setdiff(seq(nrow(dat2)), train_idx)
    test_idx
    # [1] 6 8
    
    test <- dat2[test_idx, ]
    test
    #            Y          X1          X2
    # 6 -0.8204684 -0.04493361 -0.05612874
    # 8  0.7383247  0.94383621 -1.47075238
    
  3. 找到我最好的模特

    ...

  4. 使用此模型预测训练集和测试集

    ...

  5. 按行重新组合训练集和测试集

    idx <- order(c(train_idx, test_idx))
    dat3 <- rbind(train, test)[idx, ]
    identical(dat3, dat2)
    # [1] TRUE
    
  6. Z按列将这些数据与变量重新组合

    dat4 <- cbind(dat3, dat[grep("Z", names(dat))])
    identical(dat, dat4)
    # [1] TRUE
    

综上所述,我们可以使用训练数据和测试数据的索引来将行中的数据按原始顺序组合起来。