Stratified Sampling Set Data dan Rata-rata Variabel dalam Train Dataset
Saat ini saya mencoba melakukan pemisahan bertingkat di R untuk membuat kumpulan data kereta dan pengujian. Masalah yang diajukan kepada saya adalah sebagai berikut
Bagi data menjadi sampel kereta dan uji sehingga 70% data ada di sampel kereta. Untuk memastikan distribusi harga yang serupa di seluruh train dan sampel pengujian, gunakan createDataPartition dari paket caret. Tetapkan kelompok menjadi 100 dan gunakan benih 1031. Berapa harga rumah rata-rata di sampel kereta?
Dataset adalah sekumpulan rumah dengan harga (bersama dengan titik data lainnya)
Untuk beberapa alasan, ketika saya menjalankan kode berikut, keluaran yang saya dapatkan diberi label sebagai salah di simulator masalah latihan. Adakah yang bisa melihat masalah dengan kode saya? Bantuan apa pun sangat kami hargai karena saya mencoba menghindari belajar bahasa ini secara tidak benar.
dput(head(houses))
library(ISLR); library(caret); library(caTools)
options(scipen=999)
set.seed(1031)
#STRATIFIED RANDOM SAMPLING with groups of 100, stratefied on price, 70% in train
split = createDataPartition(y = houses$price,p = 0.7,list = F, groups = 100) train = houses[split,] test = houses[-split,] nrow(train) nrow(test) nrow(houses) mean(train$price)
mean(test$price)
Keluaran
> dput(head(houses))
structure(list(id = c(7129300520, 6414100192, 5631500400, 2487200875,
1954400510, 7237550310), price = c(221900, 538000, 180000, 604000,
510000, 1225000), bedrooms = c(3, 3, 2, 4, 3, 4), bathrooms = c(1,
2.25, 1, 3, 2, 4.5), sqft_living = c(1180, 2570, 770, 1960, 1680,
5420), sqft_lot = c(5650, 7242, 10000, 5000, 8080, 101930), floors = c(1,
2, 1, 1, 1, 1), waterfront = c(0, 0, 0, 0, 0, 0), view = c(0,
0, 0, 0, 0, 0), condition = c(3, 3, 3, 5, 3, 3), grade = c(7,
7, 6, 7, 8, 11), sqft_above = c(1180, 2170, 770, 1050, 1680,
3890), sqft_basement = c(0, 400, 0, 910, 0, 1530), yr_built = c(1955,
1951, 1933, 1965, 1987, 2001), yr_renovated = c(0, 1991, 0, 0,
0, 0), age = c(59, 63, 82, 49, 28, 13)), row.names = c(NA, -6L
), class = c("tbl_df", "tbl", "data.frame"))
>
> library(ISLR); library(caret); library(caTools)
> options(scipen=999)
>
> set.seed(1031)
> #STRATIFIED RANDOM SAMPLING with groups of 100, stratefied on price, 70% in train
> split = createDataPartition(y = houses$price,p = 0.7,list = F, groups = 100)
>
> train = houses[split,]
> test = houses[-split,]
>
> nrow(train)
[1] 15172
> nrow(test)
[1] 6441
> nrow(houses)
[1] 21613
>
> mean(train$price) [1] 540674.2 > mean(test$price)
[1] 538707.6
Jawaban
Saya mencoba memperbanyaknya secara manual dengan menggunakan sample_fracform dplyrpackage dan cut2function dari Hmiscpackage. Hasilnya hampir sama - masih belum sama. Sepertinya ada masalah dengan pembuat bilangan semu atau dengan beberapa pembulatan. Menurut pendapat saya, kode Anda terlihat benar. Apakah mungkin bahwa pada langkah sebelumnya Anda harus menghapus beberapa pencilan atau kumpulan data pra-proses dengan cara apa pun.
library(caret)
options(scipen=999)
library(dplyr)
library(ggplot2) # to use diamonds dataset
library(Hmisc)
diamonds$index = 1:nrow(diamonds) set.seed(1031) # I use diamonds dataset from ggplot2 package # g parameter (in cut2) - number of quantile groups split = diamonds %>% group_by(cut2(diamonds$price, g= 100)) %>%
sample_frac(0.7) %>%
pull(index)
train = diamonds[split,]
test = diamonds[-split,]
> mean(train$price) [1] 3932.75 > mean(test$price)
[1] 3932.917
set.seed(1031)
#STRATIFIED RANDOM SAMPLING with groups of 100, stratefied on price, 70% in train
split = createDataPartition(y = diamonds$price,p = 0.7,list = T, groups = 100) train = diamonds[split$Resample1,]
test = diamonds[-split$Resample1,] > mean(train$price)
[1] 3932.897
> mean(test$price)
[1] 3932.572
Prosedur pengambilan sampel ini harus menghasilkan rata-rata yang mendekati satu populasi.