在 R 中的测试集上使用训练集的离散化

数据挖掘 机器学习 r 分类数据
2022-03-06 09:05:51

我目前正在使用 bnlearn 包中的 discretize 对 R 中的训练集进行离散化。

library(bnlearn) 
discretize(train, method = "quantile", breaks = 2)

一个区间的下限和另一个区间的上限是相应列的最小值和最大值。

在测试集上执行相同的命令

discretize(test, method = "quantile", breaks = 2)

将导致不同的离散化,因为测试集上的最小值和最大值可能不同。在 R 中(使用另一个库或命令)是否可以将离散化从训练集转移到测试集?

显然,这在 Weka 和 Orange 中很容易做到,但是,我更愿意在 R 中做到这一点(不使用 RWeka)。

2个回答

当您对训练集执行分桶/离散化作为(命名)向量时,您需要保存中断/端点。然后可以在测试集上重新使用相同的中断/端点。

我在下面使用基本 R 中的 cut 函数给出示例代码,以使答案更普遍适用(而不是给出特定于 bnlearn 包的答案)。注意 quantile 函数的输出保存在下面第 3 行的向量 breaks_to_use 中的方式,并在对测试数据应用 cut 时重新使用。您可以(希望)使用 discretize 函数中的 breaks 参数做同样的事情。

training_data <- runif(100)
test_data <- runif(100)
breaks_to_use <- quantile(training_data, seq(0, 1, 0.25))
discretized_training_data <- cut(training_data, breaks = breaks_to_use)
discretized_test_data <- cut(test_data, breaks = breaks_to_use)

您可以使用arules::discretize(x, ..., onlycuts = T). 然后,按照@hssay 在他/她的回答中所做的那样做。

library(arules)

train <- data.frame(dat = runif(100))
test <- data.frame(dat = runif(100))

mastercuts <- arules::discretize(train, method = "interval", categories = 4, onlycuts = T)

train$bin <- as.numeric(cut(train, breaks = mastercuts))