2 votes

ajouter une colonne de pliage au cadre de données de formation en utilisant splitTools

J'utilise ce code et le paquet splitTools :

library(splitTools)

set.seed(3451)
inds <- partition(iris$Sepal.Length, p = c(train = 0.8, test = 0.2))

train <- iris[inds$train,]
test <- iris[inds$test,]

folds <- create_folds(train$Sepal.Length, k = 5)

L'objet retourné folds est une liste d'entiers. Est-il possible d'ajouter une colonne folds au train de données contenant le numéro de pli (dans ce cas 1,2,3,4 ou 5) ? Merci.

PS :

Mauvaise tentative :

results <- NULL
index <- 1
for (fold in folds) {
    t <- train[-fold,]
    t$fold <- index
    index <- index + 1
    results <- rbind(results, t)
}

table(results$fold)
train <- results
head(train)

0voto

Duck Points 1012

Vous devrez transformer les plis en dataframe, puis créer un index pour les lignes et ajouter les valeurs comme VRAI/FAUX en fonction du pli. Voici le code :

library(dplyr)
#Bind
L <- lapply(folds, function(x) data.frame(val=x))
dffolds <- do.call(rbind,L)
dffolds$Fold <- gsub('\\..*','',rownames(dffolds))
rownames(dffolds)<-NULL
#Reshape
Folds <- dffolds %>% group_by(Fold) %>%
  mutate(V=T) %>%
  pivot_wider(names_from = Fold,values_from=V,values_fill=F)
#Merge
train2 <- train %>%
  mutate(val=row_number()) %>%
  left_join(Folds) %>%
  select(-val)

Sortie (quelques lignes et colonnes) :

    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species Fold1 Fold2 Fold3
1            4.9         3.0          1.4         0.2     setosa  TRUE FALSE  TRUE
2            4.7         3.2          1.3         0.2     setosa FALSE  TRUE  TRUE
3            5.0         3.6          1.4         0.2     setosa  TRUE  TRUE FALSE
4            5.4         3.9          1.7         0.4     setosa FALSE  TRUE  TRUE
5            4.6         3.4          1.4         0.3     setosa  TRUE FALSE  TRUE
6            5.0         3.4          1.5         0.2     setosa  TRUE FALSE  TRUE
7            4.9         3.1          1.5         0.1     setosa FALSE  TRUE  TRUE
8            5.4         3.7          1.5         0.2     setosa  TRUE FALSE  TRUE
9            4.8         3.0          1.4         0.1     setosa  TRUE  TRUE FALSE
10           4.3         3.0          1.1         0.1     setosa  TRUE FALSE  TRUE

1 votes

Merci - j'ai ajouté un PS à ma question initiale, qui semble fonctionner mais qui est probablement très maladroit

0 votes

@cs0815 Je l'ai vu, il est aussi bon, bon travail :)

0 votes

Je ne comprends pas très bien pourquoi vous n'avez que trois plis alors qu'il devrait également s'agir d'un format long.

0voto

Michael M Points 452

Si vous êtes intéressé par l'obtention des indices de la partition "out-of-fold" par ligne, c'est plus facile via partition . create_folds appelle lui-même partition Vous ne perdez donc rien de la logique en faisant cela :

iris$fold <- partition(iris$Sepal.Length, p = rep(0.2, 5), split_into_list = FALSE)

# Gives
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species fold
1          5.1         3.5          1.4         0.2  setosa    4
2          4.9         3.0          1.4         0.2  setosa    2
3          4.7         3.2          1.3         0.2  setosa    4
4          4.6         3.1          1.5         0.2  setosa    5
5          5.0         3.6          1.4         0.2  setosa    4
6          5.4         3.9          1.7         0.4  setosa    3
> 

Clause de non-responsabilité : Je suis l'auteur de splitTools et je suis très reconnaissant pour les conseils sur la façon d'améliorer le paquet :-).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X