Keadaan acak (nomor semu-acak) di Scikit belajar

148

Saya ingin menerapkan algoritma pembelajaran mesin di scikit belajar, tapi saya tidak mengerti apa yang random_statedilakukan parameter ini? Mengapa saya harus menggunakannya?

Saya juga tidak bisa mengerti apa itu nomor Pseudo-acak.

Elizabeth Susan Joseph
sumber

Jawaban:

220

train_test_splitMembagi array atau matriks ke dalam kereta acak dan himpunan bagian tes. Itu berarti bahwa setiap kali Anda menjalankannya tanpa menentukan random_state, Anda akan mendapatkan hasil yang berbeda, ini adalah perilaku yang diharapkan. Sebagai contoh:

Jalankan 1:

>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
        [8, 9],
        [4, 5]]),
 array([[2, 3],
        [0, 1]]), [3, 4, 2], [1, 0]]

Jalankan 2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

Itu berubah. Di sisi lain jika Anda menggunakan random_state=some_number, maka Anda dapat menjamin bahwa output dari Run 1 akan sama dengan output dari Run 2 , yaitu split Anda akan selalu sama. Tidak masalah berapa angka sebenarnya random_stateadalah 42, 0, 21, ... Yang penting adalah bahwa setiap kali Anda menggunakan 42, Anda akan selalu mendapatkan output yang sama saat pertama kali Anda membuat pemisahan. Ini berguna jika Anda ingin hasil yang direproduksi, misalnya dalam dokumentasi, sehingga setiap orang dapat secara konsisten melihat angka yang sama ketika mereka menjalankan contoh. Dalam praktiknya saya akan mengatakan, Anda harus mengatur random_stateke beberapa nomor tetap saat Anda menguji hal-hal, tetapi kemudian menghapusnya dalam produksi jika Anda benar-benar membutuhkan split acak (dan bukan perbaikan).

Mengenai pertanyaan kedua Anda, generator nomor pseudo-acak adalah generator nomor yang menghasilkan angka yang benar-benar acak. Mengapa mereka tidak benar-benar acak berada di luar cakupan pertanyaan ini dan mungkin tidak akan menjadi masalah dalam kasus Anda, Anda dapat melihat di sini dari formulir lebih detail.

elyase
sumber
7
jadi keadaan acak apa yang harus saya tetapkan, saya biasanya melihat nomor 42.
Elizabeth Susan Joseph
1
@ ElizabethSusanJoseph, tidak masalah, saya selalu menggunakan 0 jika saya ingin reproduktifitas atau Tidak ada sebaliknya. Mungkin orang-orang scikit seperti 42.
elyase
53
Ini mungkin menjelaskan angka 42 yang sering digunakan: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson
3
Bagus, ini lebih banyak kemungkinan .
elyase
1
@ Herbert Itu pertanyaan yang sulit. Inti-PRNG-hal didasarkan pada numpy yang konsisten (mereka memperkenalkan banyak pemeriksaan untuk ini setelah beberapa masalah di masa lalu). Jika tidak ada kesalahan dalam penggunaan dalam sklearn itu akan berperilaku konsisten juga. Saya akan menganggap ini (terutama untuk fungsi-fungsi yang kurang kompleks seperti train-test-split dan co) Edit : oops, agak terlambat :-)
sascha
13

Jika Anda tidak menentukan random_statedalam kode Anda, maka setiap kali Anda menjalankan (mengeksekusi) kode Anda nilai acak baru dihasilkan dan set data kereta dan tes akan memiliki nilai yang berbeda setiap kali.

Namun, jika nilai tetap ditetapkan seperti random_state = 42itu, tidak peduli berapa kali Anda mengeksekusi kode Anda, hasilnya akan sama. Yaitu, nilai yang sama dalam kereta dan set data uji.

umar salman
sumber
4

Jika Anda tidak menyebutkan random_state dalam kode, maka setiap kali Anda mengeksekusi kode Anda nilai acak baru dihasilkan dan set data train dan test akan memiliki nilai yang berbeda setiap kali.

Namun, jika Anda menggunakan nilai tertentu untuk random_state (random_state = 1 atau nilai lainnya) setiap kali hasilnya akan sama, yaitu nilai yang sama dalam set data kereta dan uji. Lihat kode di bawah ini:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Tidak masalah berapa kali Anda menjalankan kode, output akan menjadi 70.

70

Cobalah untuk menghapus random_state dan jalankan kodenya.

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Sekarang di sini output akan berbeda setiap kali Anda mengeksekusi kode.

Rishi Bansal
sumber
3

nomor random_state membagi set data tes dan pelatihan dengan cara acak. Selain apa yang dijelaskan di sini, penting untuk diingat bahwa nilai random_state dapat memiliki efek signifikan pada kualitas model Anda (berdasarkan kualitas saya pada dasarnya berarti akurasi untuk diprediksi). Misalnya, Jika Anda mengambil dataset tertentu dan melatih model regresi dengan itu, tanpa menentukan nilai random_state, ada potensi bahwa setiap kali, Anda akan mendapatkan hasil akurasi yang berbeda untuk model terlatih Anda pada data uji. Jadi, penting untuk menemukan nilai random_state terbaik untuk memberi Anda model yang paling akurat. Dan kemudian, angka itu akan digunakan untuk mereproduksi model Anda di kesempatan lain seperti percobaan penelitian lain. Untuk melakukannya,

for j in range(1000):

            X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j,     test_size=0.35)
            lr = LarsCV().fit(X_train, y_train)

            tr_score.append(lr.score(X_train, y_train))
            ts_score.append(lr.score(X_test, y_test))

        J = ts_score.index(np.max(ts_score))

        X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
        M = LarsCV().fit(X_train, y_train)
        y_pred = M.predict(X_test)`
Arad Haselirad
sumber
1

Jika tidak ada keadaan acak asalkan sistem akan menggunakan keadaan acak yang dihasilkan secara internal. Jadi, ketika Anda menjalankan program beberapa kali, Anda mungkin melihat poin data kereta / tes yang berbeda dan perilaku tersebut tidak dapat diprediksi. Jika Anda memiliki masalah dengan model, Anda tidak akan dapat membuatnya lagi karena Anda tidak tahu nomor acak yang dihasilkan saat menjalankan program.

Jika Anda melihat Tree Classifier - baik DT atau RF, mereka mencoba membangun percobaan menggunakan rencana optimal. Meskipun sebagian besar waktu rencana ini mungkin sama, tetapi ada beberapa contoh di mana pohon itu mungkin berbeda dan juga prediksi. Saat Anda mencoba men-debug model Anda, Anda mungkin tidak dapat membuat ulang contoh yang sama dengan yang dibangun Tree. Jadi, untuk menghindari semua kerumitan ini kami menggunakan random_state saat membangun DecisionTreeClassifier atau RandomForestClassifier.

PS: Anda bisa sedikit lebih dalam tentang bagaimana Tree dibangun di DecisionTree untuk memahami ini lebih baik.

randomstate pada dasarnya digunakan untuk mereproduksi masalah Anda sama setiap kali dijalankan. Jika Anda tidak menggunakan keadaan acak di traintestsplit, setiap kali Anda membuat pemisahan, Anda mungkin mendapatkan serangkaian kereta yang berbeda dan menguji data poin dan tidak akan membantu Anda dalam debugging jika Anda mendapatkan masalah.

Dari Doc:

Jika int, randomstate adalah seed yang digunakan oleh generator angka acak; Jika instance RandomState, randomstate adalah generator angka acak; Jika tidak ada, generator angka acak adalah turunan RandomState yang digunakan oleh np.random.

MdNazmulHossain
sumber
Penjelasan yang bagus. Saya hanya akan menambahkan, bahwa alasan mengapa kami akan melewati keadaan acak adalah, bahwa jika kita misalnya mencoba mengoptimalkan hyperparameters, kami tidak ingin memiliki flucutations dalam skor karena inisialisasi yang berbeda berdasarkan angka acak, yang dapat mencakup atau menyembunyikan efek optimasi yang sebenarnya dan dengan demikian kami tidak dapat mengidentifikasi bagian mana dari perubahan skor yang disebabkan oleh perubahan parameter dan apa yang disebabkan oleh keadaan awal yang berbeda dari RNG.
jottbe
-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

Pisahkan susunan atau matriks menjadi rangkaian acak kereta dan uji

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

Jika int, random_state adalah seed yang digunakan oleh generator angka acak; Jika instance RandomState, random_state adalah pembuat angka acak; Jika tidak ada, generator angka acak adalah turunan RandomState yang digunakan oleh np.random. sumber: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'Mengenai keadaan acak, ini digunakan dalam banyak algoritma acak di sklearn untuk menentukan seed acak yang diteruskan ke generator angka pseudo-acak. Oleh karena itu, itu tidak mengatur aspek perilaku algoritma. Sebagai akibatnya, nilai keadaan acak yang berkinerja baik di set validasi tidak sesuai dengan yang akan berkinerja baik di set tes baru yang tidak terlihat. Memang, tergantung pada algoritme, Anda mungkin melihat hasil yang sangat berbeda dengan hanya mengubah urutan sampel pelatihan. '' Sumber: /stats/263999/is-random-state-a-parameter -untuk menyetel

Bogdan Korecki
sumber