我有一个数据集,我希望对其进行分层抽样,使用caret
包创建统计模型,然后生成预测结果。
我发现的问题是,在不同的分层数据集迭代中,我得到了显著不同的结果(这可能部分是因为数据样本相对较小,M=1000
)。
我希望能够做到以下几点:
- 生成分层数据样本
- 创建机器学习模型
- 重复
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.
非常感谢提前提供的任何帮助,或可能有用的包建议。是否可以在caret中进行分层抽样或模拟?
回答:
首先,欢迎来到SO。
很难理解您到底在想什么,您的问题非常宽泛。
如果您需要关于统计学的输入,我建议您在Cross Validated上提出更明确的问题。适用于对统计学、机器学习、数据分析、数据挖掘和数据可视化感兴趣的人的问答平台。
我发现的问题是,在不同的分层数据集迭代中,我得到了显著不同的结果(这可能部分是因为数据样本相对较小,M=1000)。
我假设您指的是模型的不同迭代。这取决于您不同组的大小。例如,如果您试图将由1000个样本组成的一组数据分成10个样本的组,您的模型很可能不稳定,因此每次迭代都会产生不同的结果。这也可能是由于您的模型依赖于某种随机性,而数据越小(以及组越多),您将会有越大的变化。有关交叉验证、稳定性和自助法聚合的更多信息,请参见这里或这里。
- 生成分层数据样本
如何生成:dplyr
包在根据不同变量分组数据方面非常出色。您还可以使用base
包中的split
函数。有关更多信息,请参见这里。您还可以使用caret
包中的内置方法,见这里。
如何知道如何分割:这在很大程度上取决于您希望回答的问题,很可能您希望平衡一些变量,例如性别和年龄,以便为预测疾病创建模型。有关更多信息,请参见这里。
在有例如重复观察的情况下,如果您想创建具有不同复制组合的唯一子集,并包含其独特的测量值,您将不得不使用其他方法。如果复制品有一个共同的标识符,这里是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)] })})#您数据的第一个分区,用于训练模型。tg[partition[[1]],]
- 创建机器学习模型
如果您想使用caret
,您可以访问caret
网页。查看所有可用的模型。根据您研究的问题和/或数据,您将希望使用不同类型的模型。因此,我建议您参加一些在线机器学习课程,例如由Andrew Ng提供的斯坦福大学课程(我自己也上过),以便更熟悉不同的主要算法。如果您熟悉这些算法,只需搜索可用的模型即可。
- 重复1000次并取模型输出的平均值
您可以使用不同的种子(见set.seed
)和不同的训练方法(例如交叉验证或自助法聚合)重复您的模型1000次。caret
包中有很多不同的训练参数:
trainControl
函数生成进一步控制模型创建方式的参数,可能的值有:method:重采样方法:“boot”, “cv”, “LOOCV”, “LGOCV”, “repeatedcv”, “timeslice”, “none”和“oob”
有关这些方法的更多信息,请参见这里。