gpt4 book ai didi

r - 因子 MSZoning 具有新级别 NA(数据中有新因子,但线性回归模型中没有)

转载 作者:行者123 更新时间:2023-11-30 09:48:04 26 4
gpt4 key购买 nike

我正在尝试使用 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 数据集分为两部分(即训练和测试)。它们都有一些在预处理中得到处理的 NA(如上面的代码所示)。训练集和测试集最初是组合在一起的。然后所有因子列都转换为字符列。然后,这些列中的缺失值将用“NA”值填充。最后,这些列再次转换为因子列。之后训练集和测试集被划分(因为它们在给定文件中,所以不使用拆分函数)。当我尝试运行预测函数时,出现错误“因子 xyz 具有新级别 NA”。这里的问题是,例如列“MSZoning”在训练数据集中没有 NA 因子,但测试集中的某些行将“MSZoning”作为因子 NA 。因此,模型未经过训练来预测“MSZoning”为 NA 的结果值(模型未经过训练将 MSZoning 视为 NA)。我根本无法从测试集中删除这些行,因为竞赛需要测试集中的所有行。有没有办法解决这个问题并在不删除任何行或列的情况下获得测试集中所有行的预测?

提前致谢。

最佳答案

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

正是这个 block 引入了“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”的因素,因此当它出现在测试数据中时,您的模型不知道该怎么办。 (为了帮助您直观地了解为什么看不见的类别是一个问题:想象一下您是一名只知道猫和狗的 vert 。如果有人给您带来一只动物并且就像“这是一头 pig !”您将不知道什么来处理它。)

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

我写了a notebook它会逐步说明问题所在并展示如何替换值。

关于r - 因子 MSZoning 具有新级别 NA(数据中有新因子,但线性回归模型中没有),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49706793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com