Apa cara yang baik untuk membagi array NumPy secara acak menjadi set data pelatihan dan pengujian / validasi? Sesuatu yang mirip dengan cvpartition
atau crossvalind
fungsi di Matlab.
sumber
Apa cara yang baik untuk membagi array NumPy secara acak menjadi set data pelatihan dan pengujian / validasi? Sesuatu yang mirip dengan cvpartition
atau crossvalind
fungsi di Matlab.
Jika Anda ingin membagi kumpulan data satu kali menjadi dua bagian, Anda dapat menggunakan numpy.random.shuffle
, atau numpy.random.permutation
jika Anda perlu melacak indeks:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
numpy.random.shuffle(x)
training, test = x[:80,:], x[80:,:]
atau
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
indices = numpy.random.permutation(x.shape[0])
training_idx, test_idx = indices[:80], indices[80:]
training, test = x[training_idx,:], x[test_idx,:]
Ada banyak cara untuk mempartisi berulang kali kumpulan data yang sama untuk validasi silang . Salah satu strateginya adalah mengambil sampel kembali dari kumpulan data, dengan pengulangan:
import numpy
# x is your dataset
x = numpy.random.rand(100, 5)
training_idx = numpy.random.randint(x.shape[0], size=80)
test_idx = numpy.random.randint(x.shape[0], size=20)
training, test = x[training_idx,:], x[test_idx,:]
Terakhir, sklearn berisi beberapa metode validasi silang (k-fold, leave-n-out, ...). Ini juga mencakup metode "pengambilan sampel bertingkat" yang lebih canggih yang membuat partisi data yang seimbang sehubungan dengan beberapa fitur, misalnya untuk memastikan bahwa ada proporsi yang sama dari contoh positif dan negatif dalam set pelatihan dan pengujian.
Ada opsi lain yang hanya memerlukan penggunaan scikit-learn. Seperti yang dijelaskan oleh scikit's wiki , Anda cukup menggunakan instruksi berikut:
Dengan cara ini Anda dapat tetap menyinkronkan label untuk data yang Anda coba bagi menjadi pelatihan dan pengujian.
sumber
Hanya sebuah catatan. Jika Anda ingin melatih, menguji, DAN set validasi, Anda dapat melakukan ini:
Parameter ini akan memberikan 70% untuk pelatihan, dan 15% masing-masing untuk pengujian dan set val. Semoga ini membantu.
sumber
from sklearn.cross_validation import train_test_split
untuk memperjelas modul apa yang Anda gunakana=0.7
,b=0.15
,c=0.15
, dand = dataset
,N=len(dataset)
, kemudianx_train = dataset[0:int(a*N)]
,x_test = dataset[int(a*N):int((a+b)*N)]
, danx_val = dataset[int((a+b)*N):]
.from sklearn.model_selection import train_test_split
Karena
sklearn.cross_validation
modul sudah tidak digunakan lagi, Anda dapat menggunakan:sumber
Anda juga dapat mempertimbangkan pembagian bertingkat menjadi set pelatihan dan pengujian. Pembagian yang dimulai juga menghasilkan pelatihan dan pengujian yang ditetapkan secara acak tetapi sedemikian rupa sehingga proporsi kelas asli dipertahankan. Ini membuat set pelatihan dan pengujian lebih mencerminkan properti dari set data asli.
Kode ini menghasilkan:
sumber
value_inds
sebenarnya adalah indeks, tetapi hasilnya bukan indeks, hanya topeng.Saya menulis fungsi untuk proyek saya sendiri untuk melakukan ini (meskipun tidak menggunakan numpy):
Jika Anda ingin potongannya diacak, cukup kocok daftarnya sebelum meneruskannya.
sumber
Berikut adalah kode untuk membagi data menjadi n = 5 kali lipat secara bertingkat
sumber
Terima kasih pberkes atas jawaban Anda. Saya baru saja memodifikasinya untuk menghindari (1) penggantian saat pengambilan sampel (2) contoh duplikat terjadi di pelatihan dan pengujian:
sumber
Setelah melakukan beberapa pembacaan dan mempertimbangkan (banyak ..) cara yang berbeda dalam membagi data untuk dilatih dan diuji, saya memutuskan untuk melakukannya!
Saya menggunakan 4 metode berbeda (tidak ada yang menggunakan library sklearn, yang saya yakin akan memberikan hasil terbaik, memberikan kode yang dirancang dan diuji dengan baik):
Metode 3 menang sejauh ini dengan waktu tersingkat, setelah itu metode 1, dan metode 2 dan 4 ditemukan sangat tidak efisien.
Kode untuk 4 metode berbeda yang saya hitung:
Dan untuk waktu, waktu minimum untuk mengeksekusi dari 3 pengulangan 1000 loop adalah:
Saya harap itu membantu!
sumber
Kemungkinan Anda tidak hanya perlu membagi menjadi train and test, tetapi juga validasi silang untuk memastikan model Anda digeneralisasi. Di sini saya mengasumsikan 70% data pelatihan, 20% validasi, dan 10% data pisahan / uji.
Lihat np.split :
sumber
Bagi menjadi tes kereta dan valid
sumber