sample
यदि आप प्रजनन योग्य परिणामों की तलाश करते हैं तो विभाजन के लिए सावधान रहें । यदि आपका डेटा थोड़ा सा भी बदलता है, तो आपके द्वारा उपयोग किए जाने पर भी विभाजन अलग-अलग होगा set.seed
। उदाहरण के लिए, आपके द्वारा डेटा में आईडी की क्रमबद्ध सूची की कल्पना करें 1 और 10 के बीच की सभी संख्याएं हैं। यदि आप सिर्फ एक अवलोकन छोड़ देते हैं, तो 4 का कहना है कि स्थान के अनुसार नमूना लेने से अलग परिणाम प्राप्त होंगे क्योंकि अब 5 से 10 सभी स्थानांतरित स्थान हैं।
एक वैकल्पिक विधि आईडी को कुछ छद्म यादृच्छिक संख्याओं में मैप करने के लिए एक हैश फ़ंक्शन का उपयोग करना और फिर इन संख्याओं के माध्यम पर नमूना करना है। यह नमूना अधिक स्थिर है क्योंकि असाइनमेंट अब प्रत्येक अवलोकन के हैश द्वारा निर्धारित किया गया है, न कि इसकी सापेक्ष स्थिति द्वारा।
उदाहरण के लिए:
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))
[१] ९९९९
# 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)
[१] ५०००
nrow(merge(test1, test2))
[१] २६५३
# 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))
[१] ५०५57
nrow(test1a)
[१] ५०५57
नमूना आकार बिल्कुल 5000 नहीं है क्योंकि असाइनमेंट संभावित है, लेकिन बड़ी संख्या के कानून के लिए धन्यवाद बड़े नमूनों में यह समस्या नहीं होनी चाहिए।
इसे भी देखें: http://blog.richardweiss.org/2016/12/25/hash-splits.html
और /crypto/20742/statutic-properties-of-hash-fitions-when -calculating-सापेक्ष
x
आपके सूचकांक (पंक्ति / कॉल नं। कहते हैं) हो सकता हैdata
।size
हो सकता है0.75*nrow(data)
।sample(1:10, 4, replace = FALSE, prob = NULL)
यह देखने की कोशिश करो कि यह क्या करता है।