r - 因子 MSZoning 具有新的水平 NA(数据中的新因子,但不是线性回归模型中的新因子)



我正在尝试使用kaggle的一些数据集进行房价预测。

这是我的代码

library(ggplot2)
dataset=read.csv('train(1).csv')
dataset_test=read.csv('test(1).csv')
dataset_test$SalePrice<-0
#test
summary(comb$MSZoning)

#testend

comb=rbind(dataset,dataset_test)
#str(dataset)
#test
#colSums(is.na(comb))
#testend
#colnames(comb)[colSums(is.na(comb)) > 0]
sub_int_cols=Filter(is.integer, comb)
sub_factor_cols=Filter(is.factor, comb)
names_na_fac_col=colnames(sub_factor_cols)[colSums(is.na(sub_factor_cols)) > 0]
names_na_int_col=colnames(sub_int_cols)[colSums(is.na(sub_int_cols)) > 0]
#dataset[]=lapply(dataset, function(x){if(is.factor(x)) as.character(x) else x})
for(i in 1:length(names_na_fac_col)){
comb[[names_na_fac_col[i]]]=as.character(comb[[names_na_fac_col[i]]])
}
sub_chr_cols=Filter(is.character,comb)
names_chr_col=colnames(sub_chr_cols)
for(i in 1:length(names_chr_col)){
comb[[names_chr_col[i]]]=ifelse(is.na(comb[[names_chr_col[i]]]),
"NA",
comb[[names_chr_col[i]]])
}
for(i in 1:length(names_chr_col)){
comb[[names_chr_col[i]]]=as.factor(comb[[names_chr_col[i]]])
}
#correct
for(i in 1:length(names_na_int_col)){
comb[[names_na_int_col[i]]]=ifelse(is.na(comb[[names_na_int_col[i]]]),
0,
comb[[names_na_int_col[i]]])
}
# for(i in 1:length(names_na_fac_col)){
#   print(summary(comb[[names_na_fac_col[i]]]))
# }
library('binst')
#dataset$YearBuilt=create_bins(dataset$YearBuilt,
#                             seq(min(dataset$YearBuilt),max(dataset$YearBuilt),10))
comb$YearRemodAdd=create_bins(comb$YearRemodAdd,
seq(min(comb$YearRemodAdd),max(comb$YearRemodAdd),10))
#summary(comb$YearRemodAdd)
comb$YrSold=create_bins(comb$GarageYrBlt,
c(1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010))

data_pp=subset(comb, Id %in% seq(1,1460,1))
data_test_pp=subset(comb, Id %in% seq(1461,2919,1))
data_pp=data_pp[,-1]
#----------------------------------
regressor=lm(SalePrice~.,data = data_pp)
summary(regressor)
data_test_pp1=data_test_pp[,-1]
res=predict(regressor,newdata = data_test_pp1)

数据集中有 81 列用于训练线性回归模型。事情是在 kaggle 数据集上分为 2 部分(即训练和测试)。它们都是一些在预处理中处理的 NA(如上面的代码所示)。训练集和测试集最初是组合在一起的。然后,所有因子列都将转换为字符列。然后,这些列中的缺失值将填充"NA"值。最后,这些列再次转换为因子列。之后,训练集和测试集被分割(因为它们在给定的文件中,不使用分割函数)。当我尝试运行预测函数时,出现错误"因子 xyz 具有新的水平 NA"这里的问题是例如列"MSZoning"在训练数据集中没有 NA 因子,但测试集中的某些行将"MSZoning"作为因子 NA。因此,模型没有经过训练来预测"MSZoning"为NA的结果值(模型没有经过训练以将MSZoning视为NA)。 我根本无法从测试集中删除这些行,因为竞争对手需要测试集中的所有行。有没有办法解决这个问题并在不删除任何行或列的情况下获取测试集中所有行的预测?

提前谢谢。

您没有 NA,您有一些单元格中包含文本"NA"。

正是这个块引入了"NA"(不是NA

):
for(i in 1:length(names_chr_col)){
comb[[names_chr_col[i]]]=ifelse(is.na(comb[[names_chr_col[i]]]),
"NA",
comb[[names_chr_col[i]]])
}

问题是您要向每个具有缺失值的因子添加一个名为"NA"的新水平。但是,由于训练数据中没有称为"NA"的因子,因此当它显示在测试数据中时,模型不知道该怎么做。(为了帮助你直观地了解为什么看不见的类别是一个问题:想象一下,你是一名只知道猫和狗的兽医。如果有人给你带来一只动物,就像"这是一头猪!"你不会知道该怎么处理它。

作为第一遍,我建议将 NA 替换为该因子的最常见值,而不是创建因子的新级别。

我写了一个笔记本,介绍了出了什么问题,并展示了如何替换值。

最新更新