低频观察全部进入训练集并在 predict () 中产生错误

Observations with low frequency go all in train set and produce error in predict ()

我有一个数据集(~14410 行),其中包含国家/地区的观察结果。我将这个集合分为 traintest 集合,并使用带有 rpart()[=26= 的决策树训练我的数据] 功能。在进行预测时,有时我会收到错误消息,即测试集中的国家/地区不在训练集中。

起初我excluded/deleted只出现过一次的国家:

# Get orderland with frequency one
var.names <- names(table(mydata1$country))[table(mydata1$country) == 1]
loss <- match(var.names, mydata1$country)
names(which(table(mydata1$country) == 1))
mydata1 <- mydata1[-loss, ]

当重新运行我的代码时,我在同一代码行遇到了同样的错误,说我有新的国家正在测试中,但这些国家不在训练中。 现在我统计了一下一个国家出现的频率

  count <- as.data.frame(count(mydata1, vars=mydata1$country))
  count[rev(order(count$n)),]

                     vars    n
3  Bundesrep. Deutschland 7616
9         Grossbritannien 1436
12                Italien  930
2                 Belgien  731
22               Schweden  611
23                Schweiz  590
13                  Japan  587
19            Oesterreich  449
17            Niederlande  354
8              Frankreich  276
18               Norwegen  238
7                Finnland  130
21               Portugal  105
5               Daenemark   65
26                Spanien   57
4                   China   55
20                  Polen   51
27                 Taiwan   31
14              Korea Süd   30
11                 Irland   26
29             Tschechien   13
16                Litauen    9
10              Hong Kong    7
30                   <NA>    3
6                 Estland    3
24                Serbien    2
1              Australien    2
28               Thailand    1
25               Singapur    1
15               Kroatien    1

由此我可以看出,我的数据中也有 NA。

我现在的问题是,我该如何处理这个问题? 我应该 exclude/delete 所有国家吗? observations < 7 或者我应该将 observations < 7 和 reproduce/repeat 的数据取两次,这样我的 predict () 函数将始终有效,也适用于其他数据集? 不知何故 "fancy" 只是删除行...还有其他可能性吗?

您需要转换 factor 中的每个 chr 变量:

mydata1$country <- as.factor(mydata1$country)

然后你可以简单地进行train/test拆分。您不需要删除任何内容(NA 除外)

通过使用类型 factor,您的模型将知道观察值 country,将有一些可能 levels:

示例:

country <- factor("Italy", levels = c("Italy", "USA", "UK")) # just 3 levels for example
country

[1] Italy
Levels: Italy USA UK
# note that as.factor() takes care of defining the levels for you

查看与以下内容的区别:

country <- "Italy"
country

[1] "Italy"

通过使用 factor,模型将知道所有可能的 levels。因此,即使在 train 数据中您没有观察值 "Italy",模型也会知道在 test 数据中可能有它。

factor 始终是模型中字符的正确类型。