【问题标题】:R: All Samples Appearing As the SameR:所有样本看起来都一样
【发布时间】:2021-12-04 02:55:20
【问题描述】:

我正在使用 R 编程语言。我有一个数据集,其中包含一个人的身高以及他们是否打篮球。

我想看看平均而言,80% 以上(身高)的人是否会打篮球。

为此,我:

  • 我将数据随机分成 70% 组(训练)和 30% 组(测试)
  • 我计算了训练组的第 80 个百分位:使用这个第 80 个百分位,我看到测试组中有多少人打篮球
  • 我计算出我的平均准确度(在测试组中)
  • 我多次重复此过程(例如 100 次)并计算总平均值。

这里是为这个例子生成数据的 R 代码:

set.seed(123)

height <- rnorm(1000,210,5)
status <- c("basketball", "not_basketball")
basketball_status <- as.character(sample(status, 1000, replace=TRUE, prob=c(0.80, 0.20)))
data_1 <- data.frame(height, basketball_status)

height <- rnorm(1000,190,1)
status <- c("basketball", "not_basketball")
basketball_status <- as.character(sample(status, 1000, replace=TRUE, prob=c(0.8, 0.2)))
data_2 <- data.frame(height, basketball_status)


height <- rnorm(1000,170,5)
status <- c("basketball", "not_basketball")
basketball_status <- as.character(sample(status, 1000, replace=TRUE, prob=c(0.20, 0.80)))
data_3 <- data.frame(height, basketball_status)


my_data <- rbind(data_1, data_2, data_3)

这是迭代过程:

library(dplyr)

results <- list()
for (i in 1:100) {

  train_i<-sample_frac(my_data, 0.7)

  sid<-as.numeric(rownames(train_i))

  test_i<-my_data[-sid,]
 
  quantiles = data.frame( train_i %>% summarise (quant_1 = quantile(height, 0.80)))
 
 
  test_i$basketball_pred = as.character(ifelse(test_i$height > quantiles$quant_1 , "basketball",   "not_basketball" ))
 
  test_i$accuracy = ifelse(test_i$basketball_pred == test_i$basketball_status, 1, 0)
 
  
 
  results_tmp = data.frame(test_i %>%
                          
                           dplyr::summarize(Mean = mean(accuracy, na.rm=TRUE)))
 
  results_tmp$iteration = i
 
  results_tmp$total_mean = mean(test_i$accuracy)
  results[[i]] <- results_tmp
}

results

results_df <- do.call(rbind.data.frame, results)

但是当我运行迭代过程时,所有平均值看起来都一样:

head(results_df)
       Mean iteration total_mean
1 0.8344444         1  0.8344444
2 0.8344444         2  0.8344444
3 0.8344444         3  0.8344444
4 0.8344444         4  0.8344444
5 0.8344444         5  0.8344444
6 0.8344444         6  0.8344444

问题:有人知道为什么会这样吗?

谢谢

【问题讨论】:

    标签: r function loops dplyr data-manipulation


    【解决方案1】:

    sid&lt;-as.numeric(rownames(train_i)) 没有按照你的预期做,我想。您可能希望确定前一行 train_i&lt;-sample_frac(my_data, 0.7) 中包含哪些原始数据框行,但它实际上只是输出 1:2100,以便以后的所有步骤每次都提供相同的结果。

    我认为如果您将这些行替换为:

    my_data$row = 1:nrow(my_data)
    train_i <- sample_frac(my_data, 0.7)
    sid <- train_i$row
    

    您会得到预期的结果。

             Mean iteration total_mean
    1   0.5111111         1  0.5111111
    2   0.5244444         2  0.5244444
    3   0.5177778         3  0.5177778
    4   0.5488889         4  0.5488889
    5   0.5322222         5  0.5322222
    

    适合我的完整代码:

    results <- list()
    for (i in 1:100) {
      
      my_data$row = 1:nrow(my_data)
      train_i<-sample_frac(my_data, 0.7)
      sid<-train_i$row
      
      test_i<-my_data[-sid,]
      
      quantiles = data.frame( train_i %>% summarise (quant_1 = quantile(height, 0.80)))
      
      
      test_i$basketball_pred = ifelse(test_i$height > quantiles$quant_1 , "basketball",   "not_basketball" )
      
      test_i$accuracy = ifelse(test_i$basketball_pred == test_i$basketball_status, 1, 0)
      
      results_tmp = data.frame(test_i %>%
                                 
                                 dplyr::summarize(Mean = mean(accuracy, na.rm=TRUE)))
      
      results_tmp$iteration = i
      
      results_tmp$total_mean = mean(test_i$accuracy)
      results[[i]] <- results_tmp
    }
    

    【讨论】:

    • @Jon Spring:非常感谢您的回答!我试图实施您的答案,但数字仍然保持不变?我在下面的答案中发布了我正在使用的代码 - 你能看一下吗?谢谢!
    猜你喜欢
    • 1970-01-01
    • 2018-01-14
    • 1970-01-01
    • 2012-01-11
    • 2012-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多