【问题标题】:R caret package: data partition into training / test sets before trainControl?R插入符号包:在trainControl之前将数据划分为训练/测试集?
【发布时间】:2019-11-22 00:44:58
【问题描述】:

我看到很多 R 代码首先将完整的数据集拆分为训练集和测试集:

library(caret)
library(klaR)

# load the iris dataset
data(iris)

# define a 80%/20% train/test split of the dataset
trainIndex <- createDataPartition(iris$Species, p=0.8, list=FALSE)
data_train <- iris[trainIndex,]
data_test <- iris[-trainIndex,]

第二次定义分区方法,如重复k-fold交叉验证:

train_control <- trainControl(method="repeatedcv", number=10, repeats=3)

然后使用训练集训练一个模型:

my_model <- train(Species~., data=data_train, trControl=train_control, method="nb")

最后在测试集上进行预测:

pred_results <- predict(my_model, newdata=data_test)

当专门使用(重复的)k 折交叉验证方法时,在我看来,训练(n=k-1 折)和测试(n=1 折)集已经固有地定义了。

在这种情况下,为什么要通过首先将整个数据集分成 80% 的训练集和 20% 的测试集来添加额外的分区层?有必要吗?

【问题讨论】:

    标签: r r-caret


    【解决方案1】:

    在第 2.2 章统计学习简介中,here

    一般来说,我们并不真正关心该方法的训练效果如何 关于训练数据。相反,我们对数据的准确性感兴趣 当我们将我们的方法应用于之前获得的预测 看不见的测试数据

    阅读整章,包括偏差/方差权衡。

    tldr;你需要在看不见的数据上测试你训练过的算法,看看它的表现如何。如果你在训练中包含你的测试数据(10 倍 cv 或没有),你的算法已经看到了这些情况。你会对自己的预测过于自信。

    【讨论】:

    • 感谢 phiver !这不是交叉验证方法的重点:留下一个分区用作测试集(即未见过的集)吗?
    • 10 折中没有 cv 平均值,应该使您的模型更稳定。 1 个分区被排除在第一个折叠中,但包含在其他 9 个折叠中。所有数据将在 10 次中被看到 9 次。因此需要在 cv 之外额外增加一个看不见的测试集。
    • 我明白了。谢谢!
    • 或者它可能是插入符号包特有的东西?我很困惑。 caret 包的train 函数拟合模型并返回准确度指标以评估模型的效率。它如何衡量这些指标?它应该使用trainControl函数内部生成的测试集?
    • train 从训练模型(看到的数据)中返回准确度指标,而不是从测试中返回。它给了你一个想法,但不是它在看不见的数据上的表现。
    【解决方案2】:

    交叉验证提供了您将在完全看不见的测试集上获得的样本外错误的代理。需要特别注意的是分数的平均值及其分布。如果所有测试分组中的行为都相似,则您可以对 CV 给出的分数充满信心。

    【讨论】:

    • 我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-09-30
    • 2016-07-28
    • 2015-12-21
    • 2018-10-13
    • 2021-03-13
    • 2015-03-23
    • 2021-08-24
    • 1970-01-01
    相关资源
    最近更新 更多