【问题标题】:How to stratify sample a data set, conduct statistical analysis with Caret and repeat in r?如何对数据集进行分层,使用 Caret 进行统计分析并在 r 中重复?
【发布时间】:2018-07-30 15:31:08
【问题描述】:

我有一个数据集,我想对样本进行分层,使用 caret 包创建统计模型,然后生成预测。

我发现的问题是,在分层数据集的不同迭代中,我得到了显着不同的结果(这可能部分是由于数据样本相对较小 M=1000)。

我想做的是:

  1. 生成分层数据样本
  2. 创建机器学习模型
  3. 重复1000 次并取平均模型输出

我希望通过对分层数据集的变化重复这些步骤,我能够避免由于数据样本较小而产生的预测的细微变化。

例如,它在 r 中可能看起来像这样;

Original.Dataset = data.frame(A)

Stratified.Dataset = stratified(Original.Dataset, group = x)

Model = train(Stratified.Dataset.....other model inputs)

Repeat process with new stratified data set based on the original data and average out.

提前感谢您提供的任何帮助或可能有用的打包建议。是否可以在插入符号中对样本进行分层或在插入符号中进行模拟?

【问题讨论】:

  • The problem I am finding is that in different iterations of the stratified data set I get significantly different results 是什么意思?
  • 例如,如果我执行 set.seed(1) 并创建数据集并运行分析。然后我重复执行 set.seed(2),创建数据集并运行完全相同的分析。我的预测明显不同。我想做的是通过多次对分层样本进行分析来汇总结果,以“平滑”这些差异。
  • @JackFahey-Gilmour 您所描述的是集成学习,尤其是随机森林。其核心是您的结果在每次采样迭代中都会显着不同。这就是集成模型与生俱来的力量的来源。请特别阅读集成学习或随机森林,事情对你来说会更清楚。你的问题现在太宽泛了。

标签: r machine-learning simulation r-caret sampling


【解决方案1】:

首先,欢迎来到 SO。

很难理解你到底想知道什么,你的问题非常广泛。

如果您需要有关统计数据的信息,我建议您在 Cross Validated. 中提出更明确的问题 对统计、机器学习、数据分析、数据挖掘和数据可视化感兴趣的人的问答。

我发现的问题是,在不同的迭代中 分层数据集我得到明显不同的结果(这可能是 部分原因是数据样本相对较小 M=1000)。

我假设您指的是模型的不同迭代。这取决于您的不同组有多大。例如。如果您尝试将包含 1000 个样本的数据集划分为 10 个样本组,则您的模型很可能不稳定,因此在每次迭代中给出不同的结果。这也可能是因为您的模型依赖于一些随机性,并且您的数据较小(以及更多组)您将有较大变化。 See herehere 了解有关交叉验证、稳定性和引导聚合的更多信息。

  1. 生成分层数据样本

如何生成它:dplyr 包非常适合根据不同的变量对数据进行分组。您可能还想使用base 包中的split 函数。 See here for more information。您还可以使用 caret 包中的内置方法 found here

如何知道如何拆分它:这在很大程度上取决于您想回答的问题,很可能您想平衡一些变量,例如用于创建预测疾病模型的性别和年龄。 See here for more info.

如果有例如重复的观察结果,并且您想要创建具有不同重复组合的独特子集,并且您必须使用其他方法的独特测量。如果复制品有一个共同的标识符,这里是sample_names。您可以执行以下操作来选择所有样本,但具有不同的重复组合:

tg <- data.frame(sample_names = rep(1:5,each=2))
set.seed(10)
tg$values<-rnorm(10)

partition <- lapply(1:100, function(z) {
  set.seed(z)
  sapply(unique(tg$sample_names), function(x) {
    which(x == tg$sample_names)[sample(1:2, 1)]
  })
})

#the first partition of your data to train a model.
tg[partition[[1]],]
  1. 创建机器学习模型

如果你想使用caret,你可以去caret webpage。并查看所有可用的模型。根据您的研究问题和/或数据,您希望使用不同类型的模型。因此,我建议您参加一些在线机器学习课程,例如Stanford University course given by Andrew Ng(我自己学习过),以更加熟悉不同的主要算法。如果您熟悉算法,只需搜索可用的模型。

  1. 重复 1000 次并取平均模型输出

您可以使用不同的种子(请参阅set.seed)和不同的训练方法(例如交叉验证或引导聚合。 caret 包中有很多不同的训练参数:

函数trainControl 生成进一步控制的参数 如何创建模型,以及可能的值:

method: 重采样方法: "boot", "cv", "LOOCV", "LGOCV", “repeatedcv”、“timeslice”、“none”和“oob”

有关方法的更多信息,see here

【讨论】:

  • 嗨@nadizan,感谢您的回复。我认为我之前不够清楚。我使用 r 和 caret 已经有一段时间了,但偶然发现了这个数据集。我将在这里进一步解释。我的数据集有示例,如果包含一个训练示例,则另一个不能。因此,一些训练示例是对的,其中训练数据集中只能存在 1 个。我发现当我使用数据集的不同组合(只有一对存在)时,我得到了不同的结果。
  • 因此,我想做的是对数据集进行分层(因此训练中只包含一对),然后在此基础上运行模型。但是对于模型的每次重复,都使用不同的数据集分层。这可以在插入符号内部进行吗?这是我的主要问题,插入符号可以在其处理过程中进行分层(在某些条件下)吗?再次感谢您的帮助。 #firsttimeuser
  • 查看更新的答案,我是否正确理解了您的问题?
  • 嗨@nadizan,是的!这是创建各种训练数据集的一种非常好的方法。然后,我将如何在所有这些不同版本的训练数据集上训练模型?是否可以将此公式嵌入到插入符号中,以便可以在所有不同版本上对模型进行训练并汇总以提供最终模型输出?感谢您的宝贵时间。
  • @JackFahey-Gilmour 你可以在caret 中使用trainControl 函数并添加index=partition,所以你有类似:trainControl(method = "cv", index=partition, returnResamp="all")。然后model_iris&lt;-train(Sepal.Length~Petal.Length+Petal.Width, data=iris,method = "lm", trControl = tmp)。在生成的train 对象中,您将找到一个名为model_iris$resample 的列表,其中包含错误和指标,但您不会获得系数。在这里查看caret作者的答案:stackoverflow.com/questions/28303509/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2015-06-05
相关资源
最近更新 更多