低频观察全部进入训练集并在 predict () 中产生错误
Observations with low frequency go all in train set and produce error in predict ()
我有一个数据集(~14410 行),其中包含国家/地区的观察结果。我将这个集合分为 train 和 test 集合,并使用带有 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
始终是模型中字符的正确类型。
我有一个数据集(~14410 行),其中包含国家/地区的观察结果。我将这个集合分为 train 和 test 集合,并使用带有 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
始终是模型中字符的正确类型。