首页 > 解决方案 > 下采样 R 时训练/测试样本不是随机的

问题描述

我的数据集包含从住院患者那里收集的关于他们对在医院接受的服务的满意度的信息。数据如下(这里只提到一组变量);

 $ Advised                                : Factor w/ 2 levels "0","1": 2 2 2 2 2 2 2 1 2 2 ...
 $ Overall_Rate_Discharge_Process         : Factor w/ 5 levels "1","2","3","4",..: 3 4 5 5 4 4 4 4 4 5 ...
 $ Rights_Responsibilities                : Factor w/ 2 levels "0","1": 1 2 2 2 2 2 2 2 1 2 ...
 $ Overall_Care                           : Factor w/ 5 levels "1","2","3","4",..: 4 4 5 5 4 4 4 3 5 5 ...
 $ Recommend_Employees                    : Factor w/ 2 levels "0","1": 1 1 2 2 2 1 2 1 1 2 ...
 $ NPSVal3.1                              : Factor w/ 3 levels "Detractor","Passive",..: 3 2 3 3 3 2 2 1 3 3 ...

我的目标是找出影响患者 NPSVal3.1 的因素(使用序数逻辑回归)。NPSVal3.1 列的每个级别的行数不相等;

Detractor   Passive  Promoter 
  981     12932      8560 

因此,我正在尝试“下采样”方法来选择数据的训练集。下面是我使用的代码(来自库“caret”);

train3.1 <- downSample(mydata3.1, mydata3.1$NPSVal3.1)

当检查训练集的 head() 和 tail() 时,它看起来不是随机的(行 ID 是按顺序排列的)

> head(train3.1)

  Discharge_Instructions_Treatment_Plans Advised Overall_Rate_Discharge_Process Rights_Responsibilities Overall_Care
1                                      1       1                              2                       1            3
2                                      1       1                              4                       0            4
3                                      1       0                              4                       0            5
4                                      1       1                              3                       1            4
5                                      1       1                              4                       0            4
6                                      1       0                              4                       1            4
  Recommend_Employees NPSVal3.1     Class
1                   0 Detractor Detractor
2                   0 Detractor Detractor
3                   0 Detractor Detractor
4                   0 Detractor Detractor
5                   0 Detractor Detractor
6                   1 Detractor Detractor

此外,当我提取测试集时,它看起来也不是随机的。下面是我使用的代码。

test3.1 <- dplyr::anti_join(mydata3.1, train3.1)

这些数据集是随机的吗?如果是,我怎么知道?如果不是,我怎样才能使训练集和测试集都是随机的?谢谢您的支持!

标签: rrandomregressionordinaldownsampling

解决方案


如果一个新员工有相同的机会成为“批评者”、“被动”或“推动者”,那么下采样是有道理的,但我认为你不应该使用下采样来选择你的训练/测试集。我的建议是进行下采样,然后使用caret::createDataPartition以确保将数据准随机拆分为训练/测试。

下采样有许多需要注意的陷阱/警告。插入符号文档在这一点上有一些很好的讨论:https ://topepo.github.io/caret/subsampling-for-class-imbalances.html

对您的问题的直接回答(测试采样方法的“随机性”)是在下采样之前设置种子,然后查看更改种子是否会更改每个数据帧中包含/排除的员工,例如

set.seed(123)
train3.1_v1 <- caret::downSample(mydata3.1, mydata3.1$NPSVal3.1)

set.seed(300)
train3.1_v2 <- caret::downSample(mydata3.1, mydata3.1$NPSVal3.1)

dplyr::anti_join(train3.1_v1, train3.1_v2)

推荐阅读