我是数据科学的新手,正在尝试完成这个项目。我有一个数据框(从这里 https://www.kaggle.com/c/house-prices-advanced-regression-techniques(与分配的训练集和测试集(1:1460,1461:2919(,由于我在尝试预测时遇到的错误,我被建议使用createDataPartition((
> predSale <- as.data.frame(predict(model, newdata = test))
Error in model.frame.default(Terms, newdata, na.action = na.action, xlev =
object$xlevels) : factor MSSubClass has new levels 150
但是现在使用 createDataPartition 时,它会混合我的原始训练集和测试集,我需要按照特定的顺序提交 Kaggle 提交。我已经在小插曲中阅读过,看起来有一个关于 returnTrain 的论据。我不确定这是否可以使用(我不完全理解它(,但最终我想知道是否有办法撤消排序,以便我可以使用原始排序集提交我的项目。
test$SalePrice <- NA
combined <- rbind(train, test)
train <- combined[1:1460, ]
test <- combined[1461:2919, ]
#____________Models____________
set.seed(666)
index <- createDataPartition(paste(combined$MSSubClass,combined$Neighborhood,
combined$Condition2,combined$LotConfig,
combined$Exterior1st,combined$Exterior2nd,
combined$RoofMatl,combined$MiscFeature,combined$SaleType))$Resample
train <- combined[index,]
test <- combined[-index,]
model <- lm(SalePrice ~., train)
predSale <- as.data.frame(predict(model, newdata = test))
SampleSubmission <- round(predSale, digits = 1)
write.csv(SampleSubmission, "SampleSubmission.csv")
谢谢!!如果您有任何需要回答的问题,请告诉我,我想我已经提供了所有内容(我不确定您是否需要完整的代码还是什么,我很乐意编辑更多需要的东西(?
您不会在组合的 kaggle 数据集上使用createDataPartition
。您需要将这些数据集分开。这就是 kaggle 提供它们的原因。如果要合并它们,则必须在完成数据清理后再次拆分它们。
但您遇到的问题是,模型看不到检验数据集中的因子水平。kaggle上有多篇关于这个问题的帖子。但我必须说kaggle的搜索引擎很糟糕。
在 kaggle 比赛中,有些人在字符列上使用以下代码将它们转换为数字(例如,将数据与 xgboost 一起使用(。此代码假定您使用 stringAsFactors = False 加载了数据集。
for (f in feature.names) {
if (class(train[[f]])=="character") {
levels <- unique(c(train[[f]], test[[f]]))
test[[f]] <- as.integer(factor(test[[f]], levels=levels))
train[[f]] <- as.integer(factor(train[[f]], levels=levels))
}
}
其他人使用以下版本来创建训练数据集中的所有级别名称。
levels(xtrain[,x]) <- union(levels(xtest[,x]),levels(xtrain[,x]))
还有更多方法可以解决这个问题。
当然,这些解决方案对Kaggle来说很好,因为这可能会给你更好的分数。但从严格意义上讲,这是一种数据泄漏。在生产环境中使用它,是自找麻烦。在许多情况下,您可能事先不知道所有可能的值,当遇到返回缺失值而不是预测的新值时,这是一个更明智的选择。但这种讨论充满了完整的研究文章。