【发布时间】:2014-05-28 17:45:07
【问题描述】:
我已经建立了一个使用大量(30 个左右)自变量变量的预测模型。由于我使用的数据集比我机器的 RAM 大得多,因此我已经为我的训练集和测试集对其进行了采样。
我现在希望使用该模型对整个数据集进行预测。我一次提取 100 万行数据集,每次我都会为我的一些因子变量找到新的水平,这些变量不在我的训练和测试集中,因此阻止了模型进行预测。
由于有如此多的独立因素变量(以及如此多的整体观察结果),手动纠正每个案例变得非常痛苦。
另外一个需要注意的问题是:不能保证整个数据帧和训练/测试集中的变量顺序是相同的,因为我对改变它们顺序的数据进行了预处理。
因此,我想编写一个函数:
- 根据新数据的列选择和排序 我的采样数据框的配置
- 遍历采样数据帧和新数据帧,并指定新数据帧中的所有因子水平
在相应列中不存在的数据框
示例数据框为
Other。 - 如果我的样本中存在因子水平但新数据框中不存在因子水平,则在新数据框中的相应列中创建水平(未分配观察值)。
我有 #1 在一起,但不知道做 #2 和 #3 的最佳方法。如果是其他语言,我会使用 for 循环,但我知道这在 R 中是不受欢迎的。
这是一个可重现的例子:
sampleData <- data.frame(abacus=factor(c("a","b","a","a","a")), montreal=factor(c("f","f","f","f","a")), boston=factor(c("z","y","z","z","q")))
dataset <- data.frame(florida=factor(c("e","q","z","d","b", "a")), montreal=factor(c("f","f","f","f","a", "a")), boston=factor(c("m","y","z","z","r", "f")), abacus=factor(c("a","b","z","a","a", "g")))
sampleData
abacus montreal boston
1 a f z
2 b f y
3 a f z
4 a f z
5 a a q
dataset
florida montreal boston abacus
1 e f m a
2 q f y b
3 z f z z
4 d f z a
5 b a r a
6 a a f g
sampleData <- sample[,order(names(sampleData))]
dataset <- dataset[,order(names(dataset))]
dataset <- dataset[,(colnames(sampleData)]
下面是我希望dataset 在此功能完成后的样子(我并不真正关心dataset 中列的最终顺序;我只是认为它对于循环是必要的(或任何你们认为最好的)来工作。请注意,dataset$florida 列被省略:
dataset
montreal boston abacus
1 f Other a
2 f y b
3 f z Other
4 f z a
5 a Other a
6 a Other Other
另请注意,在dataset 中,boston 的“q”级别不会出现,尽管它确实出现在 sampleData 中。因此,如果我们在dataset 的因子中省略“q”,则水平会有所不同,这意味着在“数据集”中,我们需要boston 来包含水平q,但没有分配给它的实际观察值。
最后,请注意,由于我一次对 30 个变量执行此操作,因此我需要一种编程解决方案,而不是使用显式列名重新分配因子的解决方案。
【问题讨论】:
-
务实地说,如果你随机抽样 1e6 行并且一个因素只是偶尔出现,那么它对训练 methinks 是没有用的。除非您进行异常值检测,否则您最好将它们过滤掉??
-
我已经在训练/测试集上完成了这项工作。但是,现在我在整个数据集上进行预测,其中包括这些不常出现的因子变量。