首页 > 解决方案 > 恢复最小值以在 R 中应用转换

问题描述

我在训练集和测试集之间划分了一个数据集。在训练集上,我使用该数据集的最小值和最大值应用归一化。我们以 iris 数据集为例:

iris_vars <- iris[,1:4] %>%
  mutate(id = row_number())
iris_train <- iris_vars %>%
  sample_n(100)

iris_test <- iris_vars %>%
  filter(!id %in% iris_train$id)

iris_train_norm <- iris_train %>% 
  select(-id) %>%
  mutate(across(where(is.numeric),
                .fns = function(x) (x - min(x))/(max(x)-min(x))))

head(iris_train_norm)
  Sepal.Length Sepal.Width Petal.Length Petal.Width
1    0.9444444   0.3333333   0.96610169  0.79166667
2    0.1666667   0.4583333   0.08474576  0.00000000
3    0.9444444   0.2500000   1.00000000  0.91666667
4    0.2777778   0.7083333   0.08474576  0.04166667
5    0.2222222   0.2083333   0.33898305  0.41666667
6    0.2222222   0.7500000   0.08474576  0.08333333

现在要将这种转换应用于测试集,我必须记住训练集的最小值。这是一种将训练集上的最小值和最大值作为向量的方法:

iris_train_mins <- c(min(iris_train$Sepal.Length),
                     min(iris_train$Sepal.Width),
                     min(iris_train$Petal.Length),
                     min(iris_train$Petal.Width))
> iris_train_mins
[1] 4.3 2.0 1.0 0.1

iris_train_maxs <- c(max(iris_train$Sepal.Length),
                     max(iris_train$Sepal.Width),
                     max(iris_train$Petal.Length),
                     max(iris_train$Petal.Width))

> iris_train_maxs
[1] 7.9 4.4 6.9 2.5

现在我必须使用这些向量的最大值和最小值。由于分母是固定的,我的问题是减去每行的最小值。我用扫描试过这个:

这些是测试集的前两个观察结果:

  Sepal.Length Sepal.Width Petal.Length Petal.Width
1          4.6         3.4          1.4         0.3
2          4.4         2.9          1.4         0.2

减去最小值

[1] 4.3 2.0 1.0 0.1

应该:

Sepal.Length Sepal.Width Petal.Length Petal.Width
0.3          1.4         0.4          0.2
0.1          0.9         0.4          0.1

但是我申请了扫描,我得到了一个错误的答案:

first_step <- sweep(iris_test[,1:4], 1, iris_train_mins, FUN = "-")
   Sepal.Length Sepal.Width Petal.Length Petal.Width
1           0.3         2.4         -2.9        -0.7
2           2.4         2.8         -0.6         0.1

请问,你知道我做错了什么吗?任何帮助将不胜感激。

标签: rdplyr

解决方案


要将数据列减去您需要使用sweep边距 2 的最小值。尝试 -

cols <- 1:4
first_step <- sweep(iris_test[cols], 2, sapply(iris_train[cols], min), `-`)
first_step

推荐阅读