ระวังsample
การแยกถ้าคุณมองหาผลลัพธ์ที่ทำซ้ำได้ ถ้าข้อมูลของคุณเปลี่ยนแปลงแม้เพียงเล็กน้อย, set.seed
แยกจะแตกต่างกันแม้ว่าคุณจะใช้ ตัวอย่างเช่นลองนึกภาพรายการรหัสที่เรียงลำดับในข้อมูลของคุณคือตัวเลขทั้งหมดระหว่าง 1 ถึง 10 หากคุณเพิ่งละการสังเกตหนึ่งบอกว่า 4 การสุ่มตัวอย่างตามสถานที่จะให้ผลลัพธ์ที่แตกต่างกันเพราะตอนนี้ 5 ถึง 10 สถานที่ที่ย้ายทั้งหมด
อีกทางเลือกหนึ่งคือการใช้ฟังก์ชันแฮชเพื่อจับคู่รหัสเข้ากับตัวเลขสุ่มหลอกและจากนั้นสุ่มตัวอย่าง mod ของตัวเลขเหล่านี้ ตัวอย่างนี้มีเสถียรภาพมากขึ้นเนื่องจากการกำหนดถูกกำหนดโดยแฮชของการสังเกตแต่ละครั้งและไม่ใช่โดยตำแหน่งสัมพัทธ์
ตัวอย่างเช่น:
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] 5,000
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-functions-when -calculating-โมดูโล
x
สามารถเป็นดัชนี (แถว / คอลัมน์ Nos. กล่าวว่า)data
ของคุณ สามารถsize
0.75*nrow(data)
ลองsample(1:10, 4, replace = FALSE, prob = NULL)
ดูว่ามันทำอะไร