R 因子MSZoning具有新的NA水平(数据中有新因子,但线性回归模型中没有)

R 因子MSZoning具有新的NA水平(数据中有新因子,但线性回归模型中没有),r,machine-learning,linear-regression,R,Machine Learning,Linear Regression,我正在尝试使用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 #col

我正在尝试使用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)
库(ggplot2)
数据集=read.csv('train(1.csv'))
dataset_test=read.csv('test(1.csv'))
数据集\u测试$SalePrice 0]
sub_int_cols=过滤器(is.integer,comb)
sub_因子_cols=滤波器(is.factor,梳状)
names\u na\u fac\u col=colnames(sub\u factor\u cols)[colSums(is.na(sub\u factor\u cols))>0]
names_na_int_col=colnames(sub_int_cols)[colSums(is.na(sub_int_cols))>0]
#数据集[]=lappy(数据集,函数(x){if(is.factor(x))as.character(x)else x})
用于(i/1:长度(名称){
comb[[names\u na\u fac\u col[i]]=as.character(comb[[names\u na\u fac\u col[i]]))
}
sub_chr_cols=过滤器(是字符,梳)
names\u chr\u col=colnames(sub\u chr\u cols)
用于(i/1:长度(名称/颜色)){
comb[[names\u chr\u col[i]]]=ifelse(is.na(comb[[names\u chr\u col[i]]),
“不适用”,
梳子[[名称\颜色\颜色[i]])
}
用于(i/1:长度(名称/颜色)){
comb[[names\u chr\u col[i]]=as.factor(comb[[names\u chr\u col[i]]]
}
#正确的
用于(i/1:长度(名称){
comb[[names\u na\u int\u col[i]]=ifelse(is.na(comb[[names\u na\u int\u col[i]]),
0,
梳子[[姓名/名称/国际列[i]])
}
#用于(i/1:长度(名称){
#打印(摘要(目录[[姓名]]])
# }
图书馆('binst')
#数据集$yearBuild=创建容器(数据集$yearBuild,
#序号(最小值(数据集$yearbuild),最大值(数据集$yearbuild),10))
comb$YearRemodAdd=创建容器(comb$YearRemodAdd,
序号(最小值(梳$yearremodd),最大值(梳$yearremodd),10))
#摘要(comb$YearRemodAdd)
comb$yrsell=创建垃圾箱(comb$GarageYrBlt,
c(19101920193019401950196019701980199020020010))
数据_pp=子集(梳,Id%在%seq(11460,1))中)
数据_测试_pp=子集(梳,Id%在%seq中(14612919,1))
data_pp=data_pp[,-1]
#----------------------------------
回归系数=lm(SalePrice~,data=data_pp)
摘要(回归器)
数据检验pp1=数据检验pp[,-1]
res=预测(回归器,新数据=数据\u测试\u pp1)
数据集中有81列用于训练线性回归模型。kaggle数据集上的东西分为两部分(即训练和测试)。它们都是在预处理中处理的NA(如上面的代码所示)。训练集和测试集最初是结合在一起的。然后将所有因子列转换为字符列。然后用“NA”值填充这些列中缺少的值。最后,这些列将再次转换为因子列。之后,列车和测试集被划分(正如在给定文件中一样,不使用分割函数)。当我尝试运行预测函数时,我得到错误“因子xyz有新的级别NA”。这里的问题是,例如,列“MSZoning”在训练数据集中没有NA因子,但测试集中的某些行将“MSZoning”作为因子NA。因此,未对模型进行训练,以预测“MSZoning”为NA的结果值(未对模型进行训练,以将MSZoning视为NA)。 我无法从测试集中删除这些行,因为竞争需要测试集中的所有行。有没有一种方法可以解决这个问题并在不删除任何行或列的情况下获得测试集中所有行的预测


提前谢谢

您没有NA,您有一些单元格中有文本“NA”

正是这一块引入了“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]]])
}