R 分层拆分为训练和测试,并处理每个地层的少量观测值

R 分层拆分为训练和测试,并处理每个地层的少量观测值,r,cross-validation,R,Cross Validation,假设我有一个足球运动员工资、国籍和身高的数据集。我很想知道这两个变量与足球运动员的工资之间是否存在关联。我提出了一些不同的模型,并想比较这些模型的预测效果。但要做到这一点,我需要列车和测试数据,这些数据包含列车和测试数据中相同级别的国籍 假设我有这样的数据: > soccer_player_df salary nationality height 1 504731.1 USA 6.466627 2 485333.2 USA 5.468320

假设我有一个足球运动员工资、国籍和身高的数据集。我很想知道这两个变量与足球运动员的工资之间是否存在关联。我提出了一些不同的模型,并想比较这些模型的预测效果。但要做到这一点,我需要列车和测试数据,这些数据包含列车和测试数据中相同级别的国籍

假设我有这样的数据:

> soccer_player_df
     salary nationality   height
1  504731.1         USA 6.466627
2  485333.2         USA 5.468320
3  483259.4         USA 4.694929
4  493594.2         USA 5.685126
5  530805.8     England 5.856093
6  520851.5     England 6.031963
7  484309.9       Spain 6.127087
8  462986.6    Portugal 6.023823
9  492580.1      Brazil 5.949609
10 470410.0      Brazil 5.978207
我将如何分割数据,以保证列车和测试数据中每个国家至少有一次观察


如果一名足球运动员是其国籍的唯一代表(因此,对于那个国家,我无法拥有一对训练和测试),我将如何删除他呢?

正如我在评论中提到的,我建议签出——但有一点需要注意:您至少需要使用“data.table”的版本V1.9.3,可从以下网址获得

我还使用了“dplyr”来方便过滤

加载函数后,加载相关软件包并执行以下操作:

library(dplyr)
library(data.table)

set.seed(1)
soccer_player_df %>%
  group_by(nationality) %>%
  filter(length(nationality) > 1) %>%
  stratifiedDT("nationality", .5, bothSets = TRUE)
# $SAMP1
# Source: local data frame [4 x 3]
# Groups: 
# 
#     salary nationality   height
# 1 492580.1      Brazil 5.949609
# 2 530805.8     England 5.856093
# 3 483259.4         USA 4.694929
# 4 493594.2         USA 5.685126
# 
# $SAMP2
# Source: local data frame [4 x 3]
# Groups: 
# 
#     salary nationality   height
# 1 470410.0      Brazil 5.978207
# 2 520851.5     England 6.031963
# 3 504731.1         USA 6.466627
# 4 485333.2         USA 5.468320
bothSets
是一个新参数,可用于返回包含两个子集的
列表


如果你不喜欢生活在最前沿,你可以使用,这是非常快的(但没有“data.table”版本快)

用法基本相同:

soccer_player_df %>%
  group_by(nationality) %>%
  filter(length(nationality) > 1) %>%
  stratified("nationality", .5, bothSets = TRUE)

更新: 如果您只想使用该函数,而不想将“dplyr”仅用于过滤和管道,也可以直接在
分层
分层DDT
函数中进行子集设置。我添加了参数的名称,以便您可以更清楚地看到发生了什么:

set.seed(1)
stratified(
  soccer_player_df, 
  group = "nationality", 
  size = .5, 
  select = list(
    nationality = names(which(table(soccer_player_df$nationality) > 1))), 
  bothSets = TRUE)

请注意,有一个
select
参数可用于指定您感兴趣的子集。

请参阅my
分层
函数(其中有and)。使用
行名
(或“data.table”中的
rn
),并将样本
大小设置为
.5