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

时间:2018-04-07 11:14:54

标签: 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
#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(如上面的代码所示)。最初组合训练和测试集。然后,所有因子列都将转换为字符列。然后,这些列中的缺失值用&#34; NA&#34;填充。值。最后,这些列再次转换为因子列。在划分列车和测试集之后(因为它们在给定文件中,不使用拆分功能)。当我尝试运行预测功能时,我得到错误因子xyz有新的水平NA&#39;这里的问题是例如专栏&#39; MSZoning&#39;训练数据集中没有NA因子,但测试集中的某些行具有“MSZoning”和“MSZoning”。因子NA。因此,该模型未经过训练以预测其结果值,其中MSZoning&#39;是NA(该模型未经过培训,将MSZoning视为NA)。 我只是无法从测试集中删除这些行,因为竞争需要测试集中的所有行。有没有办法解决这个问题并获得测试集中所有行的预测而不删除任何行或列?

提前致谢。

1 个答案:

答案 0 :(得分:1)

你没有NA,你有一些单元格中有文本&#34; NA&#34;在他们中。

这个大块引入&#34; NA&#34; ( NA&#39; s):

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]]])
}

问题是你要添加一个名为&#34; NA&#34;到具有缺失值的每个因素。但是,因为你没有一个名为&#34; NA&#34;在您的培训数据中,当它出现在您的测试数据中时,您的模型不知道如何处理它。 (为了帮助你直截了当地解释为什么看不见的类别是一个问题:想象一下你是一个只知道猫和狗的兽医。如果有人带给你一只动物,就像#34;这里是猪!&#34;你不知道如何处理它。)

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

我已经写了a notebook来解决出错的问题并展示了如何替换价值。