撤消createDataPartition排序

时间:2018-08-10 20:26:25

标签: r predict

我是数据科学的新手,正在尝试完成这个项目。我有一个数据帧(从这里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")

谢谢!!如果您有任何需要回答的问题,请告诉我,我想已经提供了所有信息(我不确定您是否需要完整的代码或什么,我很乐意用更多需要的内容进行编辑)?

1 个答案:

答案 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来说很好,因为这可能会给您带来更好的分数。但是从严格意义上讲,这是一种数据泄漏。并在生产环境中使用它会带来麻烦。在许多情况下,您可能无法事先知道所有可能的值,并且在遇到新值时,返回缺少的值而不是预测是更明智的选择。但是这些讨论充满了完整的研究文章。