নমুনা ফাংশন ব্যবহার করে কীভাবে ডেটা প্রশিক্ষণ / পরীক্ষার সেটে ভাগ করা যায়


160

আমি সবেমাত্র আর ব্যবহার শুরু করেছি এবং আমার ডেটাसेटটি কীভাবে নীচের নমুনা কোডের সাথে অন্তর্ভুক্ত করব তা নিশ্চিত নই:

sample(x, size, replace = FALSE, prob = NULL)

আমার একটি ডেটাসেট রয়েছে যা আমার একটি প্রশিক্ষণ (75%) এবং টেস্টিং (25%) সেট করতে হবে। আমি নিশ্চিত নই যে আমি x এবং আকারের মধ্যে কী তথ্য রাখব? এক্স কি ডেটাসেট ফাইল, এবং আমার কত নমুনা আকার আছে?


1
xআপনার সূচক (সারি / কর্ণ নম্বর বলতে পারেন) হতে পারে datasizeহতে পারে 0.75*nrow(data)sample(1:10, 4, replace = FALSE, prob = NULL)এটি কী করে তা দেখার চেষ্টা করুন ।
harkmug

উত্তর:


255

ডেটা বিভাজন অর্জনের জন্য অসংখ্য পন্থা রয়েছে। আরও সম্পূর্ণ পদ্ধতির createDataPartitionজন্য caToolsপ্যাকেজের কার্যকারিতাটি একবার দেখুন ।

এখানে একটি সহজ উদাহরণ:

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, ]

আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি যা এই কোডটি একটি অনন্য পরীক্ষা এবং ট্রেন ডিএফ ফেরত দেয়? মনে হচ্ছে এটি কাজ করছে, আমাকে ভুল করবেন না। সূচকগুলি বিয়োগ করে কীভাবে অনন্য পর্যবেক্ষণের দিকে পরিচালিত করে তা বুঝতে সমস্যা হয়েছে। উদাহরণস্বরূপ, যদি আপনার 10 টি সারি এবং একটি কলাম সহ একটি ডিএফ থাকে এবং একটি কলামে 1,2,3,4,5,6,7,8,9,10 থাকে এবং আপনি এই কোডটি অনুসরণ করেন তবে কী কোনও ট্রেনকে আটকাচ্ছে? সূচক 4 এবং পরীক্ষা -6 -> 10 - 6 = 4 পাশাপাশি রয়েছে?
গোল্ডফাইনে

1
ধন্যবাদ। আমি চেষ্টা করেছিলাম mtcars[!train_ind]এবং এটি ব্যর্থ না হয়েও এটি প্রত্যাশার মতো কার্যকর হয়নি। আমি কিভাবে ব্যবহার করে সাবসেট করতে পারি !?
ব্যবহারকারী 989762

@ ব্যবহারকারী989762 সূচকগুলি নয় !লজিকাল ( TRUE/FALSE) এর জন্য ব্যবহৃত হয় । আপনি যদি ব্যবহার করে সাবসেট !করতে চান তবে এমটিকার্স [ !seq_len(nrow(mtcars)) %in% train_ind,] (পরীক্ষিত নয়) এর মতো কিছু চেষ্টা করুন ।
ডিকোয়া

1
@ বেদশাকিব আপনি যখন "-" ব্যবহার করবেন তখন এটি আপনার ডেটা থেকে ট্রেন_ইন্ডের সমস্ত সূচক বাদ দেয়। Adv-r.had.co.nz/Subsetting.htmlএকবার দেখুন । আশা করি এটি সহায়তা করে
ডিকোয়া

1
নন createDataPartitionমধ্যে caretএবং caTools?
জে মিনি

93

এটি সহজেই দ্বারা করা যেতে পারে:

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, ]

ক্যাটুলস প্যাকেজ ব্যবহার করে :

require(caTools)
set.seed(101) 
sample = sample.split(data$anycolumn, SplitRatio = .75)
train = subset(data, sample == TRUE)
test  = subset(data, sample == FALSE)

4
আমি সম্প্রতি এমআইটি নিয়ে একটি কোর্স করেছি এবং তারা পুরোপুরি CATools ব্যবহার করে পদ্ধতির ব্যবহার করেছে। ধন্যবাদ
চেতন শর্মা

1
sample = sample.split(data[,1], SplitRatio = .75)একটি কলামের নাম রাখার প্রয়োজনটি সরিয়ে ফেলা উচিত।
বেনিয়ামিন জিপার্ট

33

আমি dplyrএটির জন্য ব্যবহার করব , এটি অত্যন্ত সহজ করে তোলে। এটির জন্য আপনার ডেটা সেটে কোনও আইডি ভেরিয়েবলের প্রয়োজন হয়, এটি কেবল সেট তৈরি করার জন্য নয়, আপনার প্রকল্পের সময় সনাক্তকরণের জন্যও ভাল ধারণা। ইতিমধ্যে না থাকলে এটি যুক্ত করুন।

mtcars$id <- 1:nrow(mtcars)
train <- mtcars %>% dplyr::sample_frac(.75)
test  <- dplyr::anti_join(mtcars, train, by = 'id')

28

এটি প্রায় একই কোড, তবে আরও সুন্দর চেহারাতে

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

হা! দেখতে ভালো!
মীনা

23
library(caret)
intrain<-createDataPartition(y=sub_train$classe,p=0.7,list=FALSE)
training<-m_train[intrain,]
testing<-m_train[-intrain,]

3
যদিও কেবলমাত্র একটি কোডের উত্তর একটি উত্তর, তবে কিছু ব্যাখ্যা দেওয়া ভাল।
C8H10N4O2

এম_ট্রেন কী? আমি মনে করি আপনি বোঝাতে চেয়েছিলেন, আসল ডেটা.ফ্রেমে সাব_ ট্রেন করুন। সুতরাং, সংশোধিত কোডটি <-sus_train [intrain,] এবং <-Sub_train [-সিনট্রেন,] পরীক্ষা করা উচিত। আমি অবাক হয়েছি কেন গত পাঁচ বছরে কেউ আপনার সাথে এই বড় সমস্যাটির উত্তর দিতে সক্ষম হয় নি!
এমএনএম

21

আমি 'এ' ট্রেনে বিভক্ত করব (70%) এবং পরীক্ষা (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,]

সম্পন্ন


4
আপনাকে ডিপিআইআর প্যাকেজ আমদানি করতে হবে, প্রয়োজন (ডিপিপ্লায়ার)
TheMI

এই উত্তরটি আমাকে সহায়তা করেছে তবে প্রত্যাশিত ফলাফল পেতে আমার এটি টুইট করতে হবে। যেমনটি হ'ল, ডেটাসেট 'ট্রেন'-এ রউনামস = সিক্যুডিয়াল পূর্ণসংখ্যার সাইড রয়েছে: 1,2,3,4, ... যেখানে আপনি মূল ডেটাসেট' এ 'থেকে রড নাম্বার হতে চান, যেহেতু তারা এলোমেলোভাবে নির্বাচিত হয়েছে অনুক্রমিক পূর্ণসংখ্যা হবে না। সুতরাং, প্রথমে 'এ' তে আইডি ভেরিয়েবল তৈরি করা দরকার।
স্কট মারফ

সারি.নাম (mtcars) <- NULL; ট্রেন <-dplyr :: নমুনা_ফ্র্যাক (এমটিকার্স, 0.5); পরীক্ষার <-mtcars [-as.numeric (রো.নাম (ট্রেন)),] # এটি আমি আমার ডেটাতে করেছি, যদি আপনার সারির নামগুলি ইতিমধ্যে সংখ্যায় সেট করা হয় তবে মূল কোডটি কাজ করে না
ক্রিস্টোফার জন

16

আমার সমাধানটি মূলত ডিকোয়ার মতো তবে ব্যাখ্যা করা একটু সহজ:

data(mtcars)
n = nrow(mtcars)
trainIndex = sample(1:n, size = round(0.7*n), replace=FALSE)
train = mtcars[trainIndex ,]
test = mtcars[-trainIndex ,]

পরিবর্তনশীল সুইস কি?
বিলম্যাকর্ড

7

অসাধারণ dplyr লাইব্রেরি ব্যবহার করে কেবল একটি আরও সংক্ষিপ্ত এবং সহজ উপায় :

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, ]

1
আপনি কি Default[-train_index,]শেষ লাইনের জন্য ব্যবহার করতে চেয়েছেন ?
ম্যাট এল।

5

আপনি যদি টাইপ করেন:

?sample

নমুনা ফাংশনের পরামিতিগুলির অর্থ কী তা বোঝাতে যদি একটি সহায়তা মেনু চালু করে।

আমি বিশেষজ্ঞ নই, তবে এখানে আমার কাছে কিছু কোড রয়েছে:

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]])

এটি আপনাকে 75% ট্রেন এবং 25% পরীক্ষা দেবে।


5

এখানে পোস্ট করা সমস্ত বিভিন্ন পদ্ধতি দেখার পরে, আমি কেউ TRUE/FALSEডেটা নির্বাচন এবং আন-সিলেক্ট করার জন্য কাউকে ব্যবহার করতে দেখিনি । সুতরাং আমি ভেবেছিলাম আমি সেই কৌশলটি ব্যবহার করে একটি পদ্ধতি ভাগ করব।

n = nrow(dataset)
split = sample(c(TRUE, FALSE), n, replace=TRUE, prob=c(0.75, 0.25))

training = dataset[split, ]
testing = dataset[!split, ]

ব্যাখ্যা

আর থেকে ডেটা নির্বাচন করার একাধিক উপায় রয়েছে, বেশিরভাগ লোকেরা যথাক্রমে নির্বাচন / নির্বাচন না করার জন্য ধনাত্মক / নেতিবাচক সূচকগুলি ব্যবহার করেন। তবে, TRUE/FALSEনির্বাচন / নির্বাচন নির্বাচন না করে একই কার্যকারিতা অর্জন করা যেতে পারে ।

নিম্নলিখিত উদাহরণ বিবেচনা করুন।

# 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

4

আমার দ্রবণটি সারিগুলিকে বদলে দেয়, তারপরে প্রথম 75% সারি ট্রেন হিসাবে এবং শেষ 25% পরীক্ষায় নেয়। সুপার সরল!

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)),]

4

আমি আরএসএমপেল প্যাকেজটি ব্যবহার করার পরামর্শ দিতে পারি:

# 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)

3

scorecard প্যাকেজটির জন্য একটি কার্যকর ফাংশন রয়েছে, যেখানে আপনি অনুপাত এবং বীজ নির্দিষ্ট করতে পারেন

library(scorecard)

dt_list <- split_df(mtcars, ratio = 0.75, seed = 66)

পরীক্ষা এবং ট্রেনের ডেটা একটি তালিকায় সংরক্ষিত থাকে এবং কল করে dt_list$trainএবং এর মাধ্যমে অ্যাক্সেস করা যায়dt_list$test


2

একটি ফাংশনের নীচে যা listএকই আকারের একটি উপ-নমুনা তৈরি করে যা আপনি যা চেয়েছিলেন ঠিক তা নয় তবে অন্যের জন্য দরকারী প্রমাণিত হতে পারে। আমার ক্ষেত্রে অতিমাত্রায় পরীক্ষার জন্য আরও ছোট নমুনায় একাধিক শ্রেণিবিন্যাস গাছ তৈরি করতে:

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)
}

উদাহরণ:

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

2

আর নমুনা কোডে ক্যাটুলস প্যাকেজটি নিম্নরূপ হবে: -

data
split = sample.split(data$DependentcoloumnName, SplitRatio = 0.6)
training_set = subset(data, split == TRUE)
test_set = subset(data, split == FALSE)

2

বেস আর ব্যবহার করুন। ফাংশন runif0 থেকে 1. পর্যন্ত সমানভাবে বিতরণকৃত মান উত্পন্ন করে।

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,]

এটি যদি প্রশিক্ষণ এবং পরীক্ষার সেটগুলি তৈরি করতে অতিরিক্ত দম্পতি লাইনগুলি প্রদর্শন করে (যা নতুনদের প্রায়শই লড়াই করে) এটি আরও অনেক ভাল উত্তর হবে।
গ্রেগর থমাস

2

ধরে নিই ডিএফ আপনার ডেটা ফ্রেম এবং আপনি 75% ট্রেন এবং 25% পরীক্ষা তৈরি করতে চান

all <- 1:nrow(df)
train_i <- sort(sample(all, round(nrow(df)*0.75,digits = 0),replace=FALSE))
test_i <- all[-train_i]

তারপরে একটি ট্রেন তৈরি করতে এবং ডেটা ফ্রেমগুলি পরীক্ষা করতে

df_train <- df[train_i,]
df_test <- df[test_i,]

1
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)

sample.split()ফাংশন dataframe এক অতিরিক্ত কলাম 'split1' যোগ করবে এবং সারি 2/3 FALSE.Now যেমন 'সত্য' হিসাবে এই মান এবং অন্যদের সারি যেখানে split1 'সত্য' ট্রেন মধ্যে কপি করা হবে এবং অন্যান্য সারি পরীক্ষা অনুলিপি করা হবে হবে dataframe।


1

আমি এটিতে লাফিয়ে পড়েছিলাম, এটিও সাহায্য করতে পারে।

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),]

1

আমরা এখানে একটি নির্দিষ্ট অনুপাতের মধ্যে ডেটা বিভক্ত করতে পারি এটি একটি পরীক্ষার ডেটাশেটে 80% ট্রেন এবং 20%।

ind <- sample(2, nrow(dataName), replace = T, prob = c(0.8,0.2))
train <- dataName[ind==1, ]
test <- dataName[ind==2, ]

0

sampleআপনি যদি পুনরুত্পাদনযোগ্য ফলাফলের সন্ধান করেন তবে বিভাজন সম্পর্কে সতর্ক থাকুন । যদি আপনার ডেটা আরও সামান্য পরিবর্তিত হয় তবে আপনি ব্যবহার করলেও বিভাজন পৃথক হবে set.seed। উদাহরণস্বরূপ, আপনার ডেটা অনুসারে বাছাই করা তালিকাটি ডেটা 1 এবং 10 এর মধ্যে থাকা সমস্ত সংখ্যা imagine

বিকল্প পদ্ধতি হ'ল কয়েকটি সিডো এলোমেলো সংখ্যায় আইডি ম্যাপ করতে একটি হ্যাশ ফাংশন ব্যবহার করা এবং তারপরে এই সংখ্যাগুলির মোডে নমুনা। এই নমুনাটি আরও স্থিতিশীল কারণ অ্যাসাইনমেন্টটি এখন প্রতিটি পর্যবেক্ষণের হ্যাশ দ্বারা নির্ধারিত হয়, তার সম্পর্কিত অবস্থানের দ্বারা নয়।

উদাহরণ স্বরূপ:

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

নমুনার আকার হুবহু 5000 নয় কারণ অ্যাসাইনমেন্টটি সম্ভাব্যতাযুক্ত, তবে বড় সংখ্যার আইনের কারণে এটি বড় নমুনাগুলিতে ধন্যবাদ হওয়া উচিত নয়।

আরও দেখুন: http://blog.richardweiss.org/2016/12/25/hash-splits.html এবং /crypto/20742/statistical-properties-of-hash-funtions- যখন -calculating-মডিউল


একটি পৃথক প্রশ্ন যেমন যোগ করা হয়েছে: stackoverflow.com/questions/52769681/...
dzeltzer

আমি একাধিক সময় সিরিজের ডেটা থেকে অটোআরিমা মডেল বিকাশ করতে চাই এবং মডেলটি তৈরি করতে এবং এটি পরীক্ষার জন্য প্রতিটি সিরিজ থেকে দুই বছরের ব্যবধানে আমি 1 বছরের ডেটা, 3 বছরের ডেটা, 5, 7 ব্যবহার করতে চাই বাকি পরীক্ষার সেট। আমি কীভাবে সাবসেটিং করব যাতে লাগানো মডেলটি যা চায় তা আমার কাছে আসে? আমি আপনার সাহায্যের জন্য প্রশংসা করি
স্ট্যাকুজার


-2

সারি এবং কলামগুলির জন্য আর সূচক ব্যবহার করে বেশ কয়েকটি সারি নির্বাচন করার খুব সহজ উপায় রয়েছে। এটি আপনাকে বেশ কয়েকটি সারি প্রদত্ত ডেটা সেটটি পরিষ্কারভাবে বিভক্ত করতে দেয় - আপনার ডেটার 1 ম 80% বলুন।

আর-এ সমস্ত সারি এবং কলামগুলি ইনডেক্স করা হয় তাই ডেটাসেটনাম [1,1] হ'ল "ডাটাসেটনাম" এর প্রথম কলাম এবং প্রথম সারিতে নির্ধারিত মান। আমি [x,] এবং [, x] ব্যবহার করে কলামগুলি ব্যবহার করে সারি নির্বাচন করতে পারি

উদাহরণস্বরূপ: যদি আমার কাছে 100 টি সারি সহ সুবিধামত "ডেটা" নামক কোনও ডেটা সেট থাকে আমি ব্যবহার করে প্রথম 80 টি সারি দেখতে পারি

দেখুন (ডেটা [1:80,])

একইভাবে আমি এই সারিগুলি নির্বাচন করতে এবং সেগুলি ব্যবহার করে সাবসেট করতে পারি:

ট্রেন = ডেটা [1:80,]

পরীক্ষা = ডেটা [81: 100,]

এখন আমার ডেটা পুনরায় মডেলিংয়ের সম্ভাবনা ছাড়াই দুটি ভাগে বিভক্ত হয়ে গেছে। দ্রুত এবং সহজ।


1
এই ধারণাটি সত্য যে ডেটাটি সেভাবে ভাগ করা যায়, এটি পরামর্শ দেওয়া হয় না। কিছু ডেটাসেট একটি ভেরিয়েবল দ্বারা অর্ডার করা হয় যা আপনি অবগত নন। সুতরাং সর্বাধিক সুনির্দিষ্ট যে কোন সারিগুলি প্রথম এন সারিগুলি না নিয়ে প্রশিক্ষণ হিসাবে বিবেচিত হবে।
ব্যবহারকারী 5029763

1
আপনি যদি পরীক্ষা এবং প্রশিক্ষণ সেটে আলাদা করার আগে ডেটা পরিবর্তন করেন তবে আপনার পরামর্শটি কাজ করে।
হাদিজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.