Saya ingin menerapkan algoritma pembelajaran mesin di scikit belajar, tapi saya tidak mengerti apa yang random_state
dilakukan parameter ini? Mengapa saya harus menggunakannya?
Saya juga tidak bisa mengerti apa itu nomor Pseudo-acak.
Saya ingin menerapkan algoritma pembelajaran mesin di scikit belajar, tapi saya tidak mengerti apa yang random_state
dilakukan parameter ini? Mengapa saya harus menggunakannya?
Saya juga tidak bisa mengerti apa itu nomor Pseudo-acak.
Jawaban:
train_test_split
Membagi 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_state
adalah 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_state
ke 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.
Jika Anda tidak menentukan random_state
dalam 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 = 42
itu, tidak peduli berapa kali Anda mengeksekusi kode Anda, hasilnya akan sama. Yaitu, nilai yang sama dalam kereta dan set data uji.
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.
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)`
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.
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