当我的测试集包含我的火车数据没有的数据时出现错误?

Posted

技术标签:

【中文标题】当我的测试集包含我的火车数据没有的数据时出现错误?【英文标题】:Error comes up, when my test set has data which my train data doesn't have? 【发布时间】:2019-03-07 14:35:49 【问题描述】:

我有一个数据集并将其分为 train (80%) 和 test (20%) 集。 第一步是建立决策树,然后我使用我的测试集进行预测。

tree <- rpart(train$number ~ ., train, method = "class")
pred <- predict(tree,test, type ="class")

运行后,我得到一个错误

model.frame.default 中的错误(条款,新数据,na.action = na.action, xlev = attr(object, : Faktor 'orderland' hat neue Stufen Zypern

这基本上意味着,我的测试集中有土地“Zypern”,但在我的火车集中没有。为了解决这个问题,我用谷歌搜索并通过将因子水平设置为相等来尝试这一点。

train$orderland <- factor(train$orderland, levels=levels(test$orderland))

测试和训练数据总结:

> summary(train)
 number             orderland      lenkung          transmission IntervalRange
 Length:54616       NA's:54616   Length:54616       Length:54616       1: 7893      
 Class :character                Class :character   Class :character   2:39528      
 Mode  :character                Mode  :character   Mode  :character   3: 7195 

> summary(test)
 number              orderland           lenkung          transmission IntervalRange
 Length:13655       Length:13655       Length:13655       Length:13655       1:1959       
 Class :character   Class :character   Class :character   Class :character   2:9904       
 Mode  :character   Mode  :character   Mode  :character   Mode  :character   3:1792

但我得到了同样的错误......任何想法为什么?

【问题讨论】:

你能发布来自summary() 的输出,同时调用traintest 吗? 请查看我的编辑 看起来 'orderland' 是 ALL NA 【参考方案1】:

我认为您需要强制训练集和测试集包含来自分类变量的所有可能值。我不确定您的数据集是如何构成的,但假设 lenkung 是您的土地变量。

一种方法是:

train_test = function(x,train_per=0.7)
  smp_size = floor(train_per*nrow(x))

  train_ind = sample(seq_len(nrow(x)),size = smp_size)

  re = list()
  re$train = x[train_ind,]
  re$test = x[-train_ind,]
  return(re)

splitted_data = split(data,data$lekung)
new_list = lapply(splitted_data,train_test) 

在这里,我们定义了一个函数,它将数据帧 (x) 拆分为训练集和测试集。我们还使用split() 函数将您的原始数据拆分为多个数据帧,其中每个数据帧仅包含 lekung 的可能值之一。假设这些值可以是“A”、“B”或“C”。在这种情况下,splitted_data 将是一个包含 3 个数据框的列表,第一个包含 lekung = "A" 的所有观察结果,第二个包含 lekung = "B" 等的所有观察结果......

然后,我们将上面定义的函数应用到splitted_data。现在new_list 为每个可能的 lekung 值包含 2 个数据帧,一个火车和一个测试。

所以最后我们只需要将每个训练数据帧的行绑定在一起,并为测试数据帧做同样的事情。

train = new_list[[1]][[1]]
test = new_list[[1]][[2]]
for(i in 2:length(a))  # Then we use this loop to bind the data together
  train = rbind(train,new_list[[i]][[1]])
  test = rbind(test,new_list[[i]][[2]])

new_list 是 2 个数据框的列表。所以我们使用new_list[[1]]来访问lekung的第一个值对应的2个数据帧和 new_list[[1]][[1]] 访问那里的第一个数据框。

可能有更好的方法来做到这一点。

【讨论】:

我使用了你的代码,它似乎可以工作。我的理解是你首先在训练和测试中分裂,但在那之后我很迷茫......你能更详细地解释一下吗?谢谢! 当然@pineapple。我编辑了答案并尝试使其更清楚,但如果您仍有疑问,我建议您查看每个变量的含义。 @Fino,谢谢,现在对我来说更有意义了! :)

以上是关于当我的测试集包含我的火车数据没有的数据时出现错误?的主要内容,如果未能解决你的问题,请参考以下文章

SQL-Server:备份集包含一个数据库的备份,而不是现有的

使用 Symmetricds 时出现 Firebird 错误

当我尝试与我的数据库建立连接时出现错误

在我的索引数据集上遇到 OneHotEncoding 错误

尝试在 COBOL 中打开输出数据集时出现错误 IGZ0035S

导入数据集时出现问题:`扫描错误(...):第 1 行没有 145 个元素`