我的数据集与我在下面发布的代码类似的逻辑中收到错误。我曾尝试增加训练数据的数量,但没有解决。我已经排除了所有NA
值。
model.frame.default中的错误(条款,newdata,na.action = na.action,xlev = object $ xlevels): 因子y具有新的水平L,X
set.seed(234)
d <- data.frame(w=abs(rnorm(50)*1000),
x=rnorm(50),
y=sample(LETTERS[1:26], 50, replace=TRUE))
train_idx <- sample(1:nrow(d), floor(0.8*nrow(d)))
train <- d[train_idx,]
test <- d[-train_idx,]
fit <- lm(w ~x + y, data=train)
predict(fit, test)
答案 0 :(得分:3)
由于@jdobres已经解释了为什么会出现这个错误的原因,我会直接跳到解决方案的方法:
让我们在predict
语句
#add all levels of 'y' in 'test' dataset to fit$xlevels[["y"]] in the fit object
fit$xlevels[["y"]] <- union(fit$xlevels[["y"]], levels(test[["y"]]))
希望这可以解决您的问题!
答案 1 :(得分:2)
因子和字符数据被视为分类变量。因此,模型无法形成他们以前从未见过的类别标签的预测。如果你建立了一个模型来预测关于&#34; poodle&#34;如果你给它&#34;金毛猎犬&#34;那么模型就会失败。&#34; pit bull&#34;
更具体到您的示例,错误告诉您标签&#34; L&#34;和测试集中的&#34; X&#34;不会出现在您的训练集中。由于他们不在训练集中,因此模型在测试中遇到这些时不知道该怎么做。
答案 2 :(得分:0)
感谢Prem,如果您有很多变量,您可以像这样循环代码行:
for(k in vars){
if(is.factor(shop_data[,k])){
ols_fit$xlevels[[k]] <- union(ols_fit$xlevels[[k]],levels(shop_data[[k]]))
}
}
vars是模型中使用的变量,shop_data是主要数据集,分为训练和测试