【问题标题】:Data split for train test for a model模型训练测试的数据拆分
【发布时间】:2014-06-27 23:48:32
【问题描述】:

我有两个向量和一个数据框。我运行一个随机生成器以获得模型的训练和测试分割。 (TRUE 训练而 FALSE 测试集),如果运行多次,TRUE 到 FALSE 的数量会发生变化(FALSE 范围从 4 到 8)以及位置。这是一个例子,实际的数据框要大得多。

x <- c(1,2,3,5,4,1,2,3,5,7,4,2,1,5,6,8,5,3,2,4,6,8,9,0,2)
y <- c(3,5,7,8,4,2,2,5,4,7,9,0,0,7,6,4,2,2,1,4,6,8,9,0,0)
X <- data.frame(x,y)

runif(nrow (X)) <= 0.75
[1]  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  
FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE

我想找到一个函数或能够指示生成拆分 TRUE 和 FALSE 的顺序,所有名为 FALSE 的元素仅在最后找到,而先前的元素应该为 TRUE。它应该产生与下面的示例一致的东西。

[1]  TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE TRUE TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  
TRUE  TRUE  TRUE  TRUE FALSE  FALSE FALSE  FALSE FALSE  FALSE

我已经寻找可以在没有运气的情况下执行此操作的函数,因为用于此目的的函数 createTimeSlices 在 caret 包中意味着模型中的重大更改难以实现。

另一方面,我有下面的表达式,其中我只在最后一次获得 FALSE,而其余部分是随机的,但是我无法得出一个表达式,该表达式会按拆分指示顺序产生 FALSE 的数量只能在最后的位置找到,而在此之前会产生 TRUE,如上例所示。

S<- runif(nrow (X)) <=  0.75
S[length(S)] <- FALSE 
while(S[length(S)] [!FALSE]) { S<-runif(nrow (X)) <=  0.75}
train<-print(S)

欢迎任何帮助

非常感谢

【问题讨论】:

  • 所以你想选择数据框底部的 25%,但你不想每次都正好是 25%?我对你的方法感到困惑
  • 没错。无论出于何种原因,随机拆分并不总是产生相同比例的 FALSE 到 TRUE。在示例中,FALSE 元素的数量从 4 到 8 不等
  • 你为什么需要它?
  • 不是我需要那样,而是这是由 runif(nrow (X))
  • @Barnaby 我刚刚编辑了我的回复以消除任何随机性——它总是接近 75% 或行(向下舍入)。这就是你所追求的吗?

标签: r


【解决方案1】:

也许我误会了,但你不能这样做

S <- runif(nrow(X)) <= 0.75

sort(S,decreasing = TRUE)
 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
[19]  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE

这给你(大约)75% TRUE 值,总是在向量的前面。

修正?

看起来您实际上想要前 75% 的行(根据您上面的评论)。在这种情况下,我会这样做:

crit <- floor(nrow(X) * 0.75)
train <- seq_len(nrow(X)) < crit
train

 [1]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE
[19] FALSE FALSE FALSE FALSE FALSE FALSE FALSE

【讨论】:

    【解决方案2】:

    为什么不使用sample?无论如何,您需要做的就是对布尔向量进行排序:

    基础R:

    X$sample <- runif(nrow(X)) <= 0.75
    X[order(X$sample, decreasing=TRUE), ]
    

    使用dplyr

    library(dplyr)
    X %>%
      mutate(sample = runif(nrow(X)) <= 0.75) %>%
      arrange(desc(sample))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2022-06-25
      • 2016-12-01
      • 1970-01-01
      • 2021-06-28
      • 2021-12-08
      相关资源
      最近更新 更多