我有一个大型数据集,用于在 R 中训练机器学习算法。在所有数据预处理之后,我有一个包含因子和数值的数据框。我将这样的数据集分成训练集和测试集,并使用 write.csv() 将它们保存到文件中。
当我读回 test.csv 和 train.csv 文件时,某些因素可能会失去水平。这使得某些算法在创 build 计矩阵时失败。
这是一个详细的例子。假设最初我有一个包含 12 行的数据集,我将其分为 8 行的训练集和 4 行的测试集。我将 8 行训练数据保存到 train.csv,将 4 行数据保存到 test.csv。请注意,factor2 在 train.csv 中具有级别(a、b、c、d):
factor1 factor2 value
1 1 a 1
2 2 b 0
3 3 c 1
4 4 d 1
5 2 a 0
6 4 c 1
7 3 b 0
8 1 a 1
但 test.csv 中只有 (a,b,c):
factor1 factor2
1 4 a
2 2 b
3 4 c
4 1 a
对于因子1也是如此,测试集中缺少级别3。 当我读回文件 test.csv 时,R 假设因子 1 具有级别 (1,2,4),因子 2 具有级别 (a,b,c)。我想找到一种方法来告诉 R 实际级别。
我认为的解决方案是在开始时保存12个点的原始数据集的级别,然后在读取train.csv和test.csv后重新分配它们。
我想避免使用 R 中的 save() 方法,因为我创建的数据集可能会转到其他语言/包。
谢谢!
最佳答案
在 R 中,子集化应将所有因子级别保留在向量中。在这里,我们假设 a 是我们的数据,a 列是我们的分类变量,b 是我们的响应:
a <- data.frame(a = c("a", "b", "c"), b = c(1, 2, 3))
z <- a[1:2, ]
z$a
[1] a b
Levels: a b c
如果您在训练和测试集的子设置中丢失了因素,则需要更好的子设置方法。
如果您的问题是编写 .csv,您可能希望将它们作为 NA 重新包含在响应列中。您可以通过很多方法来做到这一点 - 这是一个合并:
merge(data.frame(a = levels(z$a)), z, all=TRUE)
a b
1 a 1
2 b 2
3 c NA
编辑:在您的示例中,使用第一个数据作为 dat
,第二个数据作为 dat2
:
levels(dat2$factor1) <- levels(dat$factor1)
levels(dat2$factor2) <- levels(dat$factor2)
这是最简单的方法。
关于r - 如何在 R 中保留/重新评估 data.frame 的因子水平?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33859469/