r - 如何在 R 中保留/重新评估 data.frame 的因子水平?

标签 r csv machine-learning dataframe

我有一个大型数据集,用于在 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/

相关文章:

sql - 加载数据内文件 (*.csv) - 忽略空单元格

pandas - UnicodeDecodeError : 'utf-8' codec can't decode byte 0xcc in position 3: invalid continuation byte

python - 使用Scrapy时如何导出为csv?

r - 如何选择行组并存储到变量?

r - ggplot在分面时删除特定的x轴标签

python - scikit-learn 随机森林的不平衡数据集有问题吗?

validation - 当训练和验证损失与 epoch 1 不同时意味着什么?

algorithm - 为什么runtime要构造一个决策树mnlog(n)?

R:如何从 lmer() 模型的回归结果中提取协变量 p 值列表?

r - 调用序列化 R 函数时出错