我是数据科学的新手,正在尝试完成这个项目。我有一个数据帧(从这里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的参数。我不确定是否可以使用它(我不太了解),但是最终我想知道是否有一种方法可以撤消订购,因此我可以使用原始订购的项目提交项目。 / p>
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")
谢谢!!如果您有任何需要回答的问题,请告诉我,我想已经提供了所有信息(我不确定您是否需要完整的代码或什么,我很乐意用更多需要的内容进行编辑)?
答案 0 :(得分:0)
您不要在组合的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来说很好,因为这可能会给您带来更好的分数。但是从严格意义上讲,这是一种数据泄漏。并在生产环境中使用它会带来麻烦。在许多情况下,您可能无法事先知道所有可能的值,并且在遇到新值时,返回缺少的值而不是预测是更明智的选择。但是这些讨论充满了完整的研究文章。