Ik ben net begonnen met het gebruik van R en ik weet niet zeker hoe ik mijn gegevensset kan opnemen met de volgende voorbeeldcode:
sample(x, size, replace = FALSE, prob = NULL)
Ik heb een dataset die ik nodig heb om in een training (75%) en test (25%) in te stellen.
Ik weet niet zeker welke informatie ik zou moeten doen in de X en de grootte?
Is x het datasetbestand en grootte hoeveel monsters ik heb?
Antwoord 1, Autoriteit 100%
Er zijn talloze benaderingen om data-partitionering te bereiken. Neem voor een completere aanpak een kijkje op de createDataPartition
Functie in de caTools
Package.
Hier is een eenvoudig voorbeeld:
data(mtcars)
## 75% of the sample size
smp_size <- floor(0.75 * nrow(mtcars))
## set the seed to make your partition reproducible
set.seed(123)
train_ind <- sample(seq_len(nrow(mtcars)), size = smp_size)
train <- mtcars[train_ind, ]
test <- mtcars[-train_ind, ]
Antwoord 2, Autoriteit 37%
het kan eenvoudig worden gedaan door:
set.seed(101) # Set Seed so that same sample can be reproduced in future also
# Now Selecting 75% of data as sample from total 'n' rows of the data
sample <- sample.int(n = nrow(data), size = floor(.75*nrow(data)), replace = F)
train <- data[sample, ]
test <- data[-sample, ]
Door Catools pakket:
require(caTools)
set.seed(101)
sample = sample.split(data$anycolumn, SplitRatio = .75)
train = subset(data, sample == TRUE)
test = subset(data, sample == FALSE)
Antwoord 3, Autoriteit 13%
Ik zou dplyr
hiervoor gebruiken, maakt het super eenvoudig. Het vereist een ID-variabele in uw dataset, wat toch een goed idee is, niet alleen voor het maken van sets, maar ook voor traceerbaarheid tijdens uw project. Voeg het toe als dit niet al bevat.
mtcars$id <- 1:nrow(mtcars)
train <- mtcars %>% dplyr::sample_frac(.75)
test <- dplyr::anti_join(mtcars, train, by = 'id')
Antwoord 4, Autoriteit 11%
Dit is bijna dezelfde code, maar in meer mooie uitstraling
bound <- floor((nrow(df)/4)*3) #define % of training and test set
df <- df[sample(nrow(df)), ] #sample rows
df.train <- df[1:bound, ] #get training set
df.test <- df[(bound+1):nrow(df), ] #get test set
Antwoord 5, Autoriteit 9%
library(caret)
intrain<-createDataPartition(y=sub_train$classe,p=0.7,list=FALSE)
training<-m_train[intrain,]
testing<-m_train[-intrain,]
Antwoord 6, Autoriteit 8%
Ik zal ‘A’ in de trein (70%) en test (30%)
a # original data frame
library(dplyr)
train<-sample_frac(a, 0.7)
sid<-as.numeric(rownames(train)) # because rownames() returns character
test<-a[-sid,]
Gereed
Antwoord 7, Autoriteit 6%
Mijn oplossing is eigenlijk hetzelfde als Dickoa’s, maar een beetje gemakkelijker te interpreteren:
data(mtcars)
n = nrow(mtcars)
trainIndex = sample(1:n, size = round(0.7*n), replace=FALSE)
train = mtcars[trainIndex ,]
test = mtcars[-trainIndex ,]
Antwoord 8, Autoriteit 4%
Ik kan u adviseren over het gebruik van de rsample pakket:
# choosing 75% of the data to be the training data
data_split <- initial_split(data, prop = .75)
# extracting training data and test data as two seperate dataframes
data_train <- training(data_split)
data_test <- testing(data_split)
Antwoord 9, Autoriteit 3%
Just een meer korte en eenvoudige manier gebruik geweldig dplyr bibliotheek:
library(dplyr)
set.seed(275) #to get repeatable data
data.train <- sample_frac(Default, 0.7)
train_index <- as.numeric(rownames(data.train))
data.test <- Default[-train_index, ]
Antwoord 10, Autoriteit 2%
Als u typt:
?sample
Als u een help-menu op te roepen om uit te leggen wat de parameters van het voorbeeld van de functie gemiddelde.
Ik ben geen expert, maar hier is wat code die ik heb:
data <- data.frame(matrix(rnorm(400), nrow=100))
splitdata <- split(data[1:nrow(data),],sample(rep(1:4,as.integer(nrow(data)/4))))
test <- splitdata[[1]]
train <- rbind(splitdata[[1]],splitdata[[2]],splitdata[[3]])
Dit zal u 75% trein en 25% test te geven.
Antwoord 11, Autoriteit 2%
Na het kijken door alle verschillende methoden die hier worden geplaatst, heb ik niet zien aan iemand gebruik maken van TRUE/FALSE
te selecteren en deselecteren data. Dus ik dacht dat ik zou een methode met behulp van die techniek te delen.
n = nrow(dataset)
split = sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.75, 0.25))
training = dataset[split, ]
testing = dataset[!split, ]
Uitleg
Er zijn meerdere manieren om gegevens uit R te selecteren, meestal gebruiken mensen positieve/negatieve indices om respectievelijk te selecteren/deselecteren. Dezelfde functionaliteiten kunnen echter worden bereikt door TRUE/FALSE
te gebruiken om te selecteren/deselecteren.
Beschouw het volgende voorbeeld.
# let's explore ways to select every other element
data = c(1, 2, 3, 4, 5)
# using positive indices to select wanted elements
data[c(1, 3, 5)]
[1] 1 3 5
# using negative indices to remove unwanted elements
data[c(-2, -4)]
[1] 1 3 5
# using booleans to select wanted elements
data[c(TRUE, FALSE, TRUE, FALSE, TRUE)]
[1] 1 3 5
# R recycles the TRUE/FALSE vector if it is not the correct dimension
data[c(TRUE, FALSE)]
[1] 1 3 5
Antwoord 12
Mijn oplossing schudt de rijen, neemt dan de eerste 75% van de rijen als trein en de laatste 25% als test. Supersimpel!
row_count <- nrow(orders_pivotted)
shuffled_rows <- sample(row_count)
train <- orders_pivotted[head(shuffled_rows,floor(row_count*0.75)),]
test <- orders_pivotted[tail(shuffled_rows,floor(row_count*0.25)),]
Antwoord 13
Het
scorecard
-pakket heeft daar een handige functie voor, waar je de verhouding en het zaad kunt specificeren
library(scorecard)
dt_list <- split_df(mtcars, ratio = 0.75, seed = 66)
De test- en treingegevens worden opgeslagen in een lijst en zijn toegankelijk door dt_list$train
en dt_list$test
te bellen.
Antwoord 14
Hieronder een functie die een list
van sub-samples van dezelfde groottemaakt, wat niet precies is wat je wilde, maar misschien handig is voor anderen. In mijn geval om meerdere classificatiebomen te maken op kleinere steekproeven om overfitting te testen:
df_split <- function (df, number){
sizedf <- length(df[,1])
bound <- sizedf/number
list <- list()
for (i in 1:number){
list[i] <- list(df[((i*bound+1)-bound):(i*bound),])
}
return(list)
}
Voorbeeld:
x <- matrix(c(1:10), ncol=1)
x
# [,1]
# [1,] 1
# [2,] 2
# [3,] 3
# [4,] 4
# [5,] 5
# [6,] 6
# [7,] 7
# [8,] 8
# [9,] 9
#[10,] 10
x.split <- df_split(x,5)
x.split
# [[1]]
# [1] 1 2
# [[2]]
# [1] 3 4
# [[3]]
# [1] 5 6
# [[4]]
# [1] 7 8
# [[5]]
# [1] 9 10
Antwoord 15
Gebruik caTools-pakket in R
voorbeeldcode is als volgt:-
data
split = sample.split(data$DependentcoloumnName, SplitRatio = 0.6)
training_set = subset(data, split == TRUE)
test_set = subset(data, split == FALSE)
Antwoord 16
Gebruik basis R. Functie runif
genereert uniform verdeelde waarden van 0 tot 1. Door de cutoff-waarde te variëren (train.size in het onderstaande voorbeeld), heeft u altijd ongeveer hetzelfde percentage willekeurige records hieronder de afkapwaarde.
data(mtcars)
set.seed(123)
#desired proportion of records in training set
train.size<-.7
#true/false vector of values above/below the cutoff above
train.ind<-runif(nrow(mtcars))<train.size
#train
train.df<-mtcars[train.ind,]
#test
test.df<-mtcars[!train.ind,]
Antwoord 17
require(caTools)
set.seed(101) #This is used to create same samples everytime
split1=sample.split(data$anycol,SplitRatio=2/3)
train=subset(data,split1==TRUE)
test=subset(data,split1==FALSE)
De functie sample.split()
voegt een extra kolom ‘split1’ toe aan het dataframe en 2/3 van de rijen heeft deze waarde als TRUE en andere als FALSE. Nu zijn de rijen waar split1 is TRUE wordt naar de trein gekopieerd en andere rijen worden naar het testdataframe gekopieerd.
Antwoord 18
Ervan uitgaande dat dfuw dataframe is en dat u 75% treinen 25% test
wilt maken
all <- 1:nrow(df)
train_i <- sort(sample(all, round(nrow(df)*0.75,digits = 0),replace=FALSE))
test_i <- all[-train_i]
Vervolgens een trein maken en dataframes testen
df_train <- df[train_i,]
df_test <- df[test_i,]
Antwoord 19
We kunnen gegevens in een bepaalde verhouding verdelen, het is 80% trein en 20% in een testgegevensset.
ind <- sample(2, nrow(dataName), replace = T, prob = c(0.8,0.2))
train <- dataName[ind==1, ]
test <- dataName[ind==2, ]
Antwoord 20
Pas op voor sample
voor het splitsen als u op zoek bent naar reproduceerbare resultaten. Als je gegevens ook maar een klein beetje veranderen, zal de splitsing variëren, zelfs als je set.seed
gebruikt. Stel je bijvoorbeeld voor dat de gesorteerde lijst met ID’s in je gegevens alle getallen tussen 1 en 10 zijn. Als je slechts één observatie zou laten vallen, zeg 4, zou steekproeven op locatie een ander resultaat opleveren, omdat nu 5 tot 10 alle verplaatste plaatsen zijn.
Een alternatieve methode is om een hash-functie te gebruiken om ID’s toe te wijzen aan pseudo-willekeurige getallen en vervolgens te samplen op de modificatie van deze getallen. Deze steekproef is stabieler omdat de toewijzing nu wordt bepaald door de hash van elke waarneming, en niet door de relatieve positie.
Bijvoorbeeld:
require(openssl) # for md5
require(data.table) # for the demo data
set.seed(1) # this won't help `sample`
population <- as.character(1e5:(1e6-1)) # some made up ID names
N <- 1e4 # sample size
sample1 <- data.table(id = sort(sample(population, N))) # randomly sample N ids
sample2 <- sample1[-sample(N, 1)] # randomly drop one observation from sample1
# samples are all but identical
sample1
sample2
nrow(merge(sample1, sample2))
[1] 9999
# row splitting yields very different test sets, even though we've set the seed
test <- sample(N-1, N/2, replace = F)
test1 <- sample1[test, .(id)]
test2 <- sample2[test, .(id)]
nrow(test1)
[1] 5000
nrow(merge(test1, test2))
[1] 2653
# to fix that, we can use some hash function to sample on the last digit
md5_bit_mod <- function(x, m = 2L) {
# Inputs:
# x: a character vector of ids
# m: the modulo divisor (modify for split proportions other than 50:50)
# Output: remainders from dividing the first digit of the md5 hash of x by m
as.integer(as.hexmode(substr(openssl::md5(x), 1, 1)) %% m)
}
# hash splitting preserves the similarity, because the assignment of test/train
# is determined by the hash of each obs., and not by its relative location in the data
# which may change
test1a <- sample1[md5_bit_mod(id) == 0L, .(id)]
test2a <- sample2[md5_bit_mod(id) == 0L, .(id)]
nrow(merge(test1a, test2a))
[1] 5057
nrow(test1a)
[1] 5057
de steekproefomvang is niet precies 5000 omdat toewijzing waarschijnlijk is, maar het zou geen probleem moeten zijn in grote steekproeven dankzij de wet van de grote getallen.
Zie ook: http://blog.richardweiss.org/ 2016/12/25/hash-splits.html
en https://crypto.stackexchange.com/questions/20742 /statistische-eigenschappen-van-hash-functies-wanneer-berekenen-modulo
Antwoord 21
Ik kwam deze tegen, het kan ook helpen.
set.seed(12)
data = Sonar[sample(nrow(Sonar)),]#reshufles the data
bound = floor(0.7 * nrow(data))
df_train = data[1:bound,]
df_test = data[(bound+1):nrow(data),]
Antwoord 22
Maak een indexrij “rowid” en gebruik anti-join om uit te filteren met by = “rowid”. U kunt de rowid-kolom verwijderen door %>% select(-rowid) te gebruiken na de splitsing.
data <- tibble::rowid_to_column(data)
set.seed(11081995)
testdata <- data %>% slice_sample(prop = 0.2)
traindata <- anti_join(data, testdata, by = “rowid”)
Antwoord 23
set.seed(123)
llwork<-sample(1:length(mydata),round(0.75*length(mydata),digits=0))
wmydata<-mydata[llwork, ]
tmydata<-mydata[-llwork, ]
Antwoord 24
Ik denk dat dit het probleem zou oplossen:
df = data.frame(read.csv("data.csv"))
# Split the dataset into 80-20
numberOfRows = nrow(df)
bound = as.integer(numberOfRows *0.8)
train=df[1:bound ,2]
test1= df[(bound+1):numberOfRows ,2]
Antwoord 25
Ik gebruik liever dplyr
om de waarden te mutate
set.seed(1)
mutate(x, train = runif(1) < 0.75)
Ik kan dplyr::filter
blijven gebruiken met hulpfuncties zoals
data.split <- function(is_train = TRUE) {
set.seed(1)
mutate(x, train = runif(1) < 0.75) %>%
filter(train == is_train)
}
Antwoord 26
Er is een heel eenvoudige manier om een aantal rijen te selecteren met behulp van de R-index voor rijen en kolommen. Hierdoor kunt u de dataset SCHOON splitsen op basis van een aantal rijen – zeg maar de eerste 80% van uw gegevens.
In R worden alle rijen en kolommen geïndexeerd, dus DataSetName[1,1] is de waarde die is toegewezen aan de eerste kolom en eerste rij van “DataSetName”. Ik kan rijen selecteren met [x,] en kolommen met [,x]
Bijvoorbeeld: als ik een dataset heb met de handige naam “data” met 100 rijen, kan ik de eerste 80 rijen bekijken met
Bekijken(gegevens[1:80,])
Op dezelfde manier kan ik deze rijen selecteren en ze subsetten met:
trein = data[1:80,]
test = gegevens[81:100,]
Nu heb ik mijn gegevens in twee delen gesplitst zonder de mogelijkheid om opnieuw te samplen. Snel en gemakkelijk.