2
votes

comment diviser un jeu de données pour tester et s'entraîner par rapport à un groupe

Je souhaite diviser mon ensemble de données en données de train et de test. mais j'ai une colonne en tant que groupe. Tous les membres d'un groupe doivent être en train ou en test. par exemple si la colonne de groupe est comme ceci:

         group
           1
           1
           1
           1
           1
           2
           2
           2
           3
           3

si l'une des lignes du premier groupe est dans le train, les 5 premières lignes doivent être là et ...


9 commentaires

Au lieu d'échantillonner sur des lignes, échantillonnez plutôt sur des ID de groupe uniques.


Quel est votre algorithme pour le partage train / test? Comment vous divisez-vous actuellement?


Commencez par by (x, x $ group, ...) , puis consultez stackoverflow.com/a/ 56278115/3358272 (deuxième recommandation) pour savoir quoi faire dans ce ... -placeholder.


@ r2evans pourriez-vous s'il vous plaît répondre? je ne suis pas sûr


Comment décidez-vous quels groupes participeront au test et lesquels participeront au train?


au hasard, je connais le nombre de groupes qui devraient être en train


Combien devraient être en train?


environ 11000 groupes en train et 5000 en test


Utilisez la réponse de Phil, faites train.groups <- sample (unique (dat $ group), 11000) puis obtenez dat.train et dat.test .


3 Réponses :


-1
votes

Vous pouvez utiliser le dplyr et le tidyverse (package) pour résoudre ce problème.

En supposant que le nom de votre ensemble de données est df1 . p>

Voici un exemple:

library(dplyr)
library(tidyverse)

training_data <- df1 %>% filter(group=1)

testing_data <- df1 %>% filter(group=2)


2 commentaires

qu'est-ce que le groupe 1 et 2?


filter (group = 1) échouera, peut-être voulez-vous dire filter (group == 1) ? (Veuillez tester votre code avec certaines données avant de publier.)



0
votes

Supposons que vous ayez un total de 20 groupes et que vous vouliez 8 groupes dans l'ensemble d'entraînement et les 12 autres dans votre ensemble de test.

D'abord, générons des données avec lesquelles jouer:

train.groups <- sample(levels(dat$group), 8)
dat.train <- dat[dat$group %in% train.groups, ]
dat.test <- dat[!(dat$group %in% train.groups), ]

Comme vous voulez échantillonner par groupe plutôt que par observation, tirez maintenant un échantillon aléatoire de taille 8 dans des groupes pour votre ensemble d'entraînement et mettez le reste dans l'ensemble de test.

dat <- data.frame(group=factor(rep(1:20, each=5)), value=rnorm(100))


6 commentaires

qu'est-ce que chacun = 5?


De? Rep: "chaque" entier non négatif. Chaque élément de «x» est répété «chaque» fois. Les autres entrées seront forcées à un vecteur entier ou double et le premier élément sera pris. Traitée comme «1» si «NA» ou invalide.


Je veux dire pourquoi 5? rep répète 20 groupes 5 fois? Pourquoi?


Eh bien, pour reproduire votre exemple, où vous aviez également 5 instances d'au moins le premier groupe. Mais peu importe la solution.


Erreur dans sample.int (length (x), size, replace, prob): premier argument non valide


sample sample.int . Ils prennent des paramètres différents.



1
votes

Une solution utilisant dplyr . dat_train et dat_test est le résultat final. Je suppose un cas avec un groupe de 10 000 ensembles de données d'entraînement et un groupe de 5 000 ensembles de données de test.

library(dplyr)

# Set seed for reproducibility
set.seed(12345)

# Create an example data frame with group and data
dat <- tibble(group = rep(1:15000, each = 5),
              data = rnorm(75000))

# Step 1: Create a look up table showing group number
g <- dat %>% distinct(group)

# Step 2: Use sample_n to sampel for train
g_train <- g %>% sample_n(size = 10000)

# Step 3: Use semi_join and anti_join to split dat into train and test
dat_train <- dat %>% semi_join(g_train, by = "group")
dat_test <- dat %>% anti_join(g_train, by = "group")


0 commentaires