Scikit öğrenmede rastgele durum (Yalancı rastgele sayı)


148

Scikit öğrenmede bir makine öğrenme algoritması uygulamak istiyorum, ancak bu parametrenin ne olduğunu anlamıyorum random_state ? Neden kullanmalıyım?

Ayrıca, Yalancı rasgele bir sayı olduğunu anlayamadım.

Yanıtlar:


220

train_test_splitDizileri veya matrisleri rastgele tren ve test alt kümelerine böler. Bu, belirtmeden her çalıştırdığınızdarandom_state , farklı bir sonuç elde edeceğiniz , bu beklenen davranıştır. Örneğin:

Çalışma 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]]

Koşu 2

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

Değişir. Öte yandan, kullanırsanız random_state=some_number, Run 1'in çıkışının Run 2'nin çıkışına eşit olacağını garanti edebilirsiniz , yani bölmeniz her zaman aynı olacaktır. Asıl random_statesayının 42, 0, 21, ... olduğu önemli değil. Önemli olan 42'yi her kullandığınızda, bölünmeyi ilk yaptığınızda her zaman aynı çıktıyı alacaksınız. Bu, örneğin belgelerde de tekrarlanabilir sonuçlar istiyorsanız, herkesin örnekleri çalıştırırken aynı sayıları sürekli görebilmesi için kullanışlıdır. Uygulamada, bir random_stateşeyleri test ederken sabit bir sayıya ayarlamanız gerektiğini söyleyebilirim, ancak rastgele (ve sabit olmayan) bir bölünmeye gerçekten ihtiyacınız varsa üretimde kaldırın.

İkinci sorunuzla ilgili olarak, sözde rasgele bir sayı üreteci, neredeyse gerçekten rasgele sayılar üreten bir sayı üretecidir. Neden gerçekten rastgele olmadıkları bu sorunun kapsamı dışındadır ve muhtemelen sizin durumunuzda önemli değildir, daha fazla ayrıntıyı buradan inceleyebilirsiniz .


7
bu yüzden hangi rastgele durumu ayarlamalıyım, genellikle bu sayıyı 42 görüyorum.
Elizabeth Susan Joseph

1
@ElizabethSusanJoseph, çok önemli değil, tekrarlanabilirlik istiyorsanız her zaman 0 kullanıyorum, yoksa başka türlü yok. 42.
elyase

53
Bu muhtemelen 42 sayısının çok sık kullanıldığını açıklamaktadır: en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson

3
İyi olan, burada daha fazla olasılık var .
elyase

1
@Herbert Bu zor bir soru. Çekirdek PRNG maddeleri tutarlı olan numpy'ye dayanır (geçmişte bir sorundan sonra bunun için birçok kontrol başlattılar). Eğer sklearn içinde kullanımda herhangi bir hata yoksa, aynı şekilde tutarlı davranacaktır. Bu (özellikle tren-test-split ve co gibi daha az karmaşık fonksiyonlar için) varsayalım Düzenleme : ayy, biraz geç :-)
sascha

13

random_stateKodunuzda belirtmezseniz, kodunuzu her çalıştırdığınızda (yürüttüğünüzde) yeni bir rastgele değer oluşturulur ve tren ve test veri kümelerinin her seferinde farklı değerleri olur.

Bununla birlikte, random_state = 42kodunuzu kaç kez çalıştırdığınıza bakılmaksızın, sonuç gibi aynı sabit bir değer atanırsa , sonuç aynı .ie, tren ve test veri kümelerinde aynı değerler olur.


4

Koddaki random_state'ten bahsetmezseniz, kodunuzu her çalıştırdığınızda yeni bir rastgele değer oluşturulur ve tren ve test veri kümelerinin her seferinde farklı değerleri olur.

Ancak, random_state (random_state = 1 veya başka bir değer) için her seferinde belirli bir değer kullanırsanız, sonuç aynı olacaktır, yani tren ve test veri kümelerinde aynı değerler olacaktır. Aşağıdaki koda bakın:

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))

Kodu kaç kez çalıştırdığınız önemli değil, çıktı 70 olacaktır.

70

Random_state öğesini kaldırmayı ve kodu çalıştırmayı deneyin.

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))

Şimdi kodu her çalıştırdığınızda çıktı farklı olacaktır.


3

random_state sayı testi ve egzersiz veri kümelerini rastgele bir şekilde böler. Burada açıklananlara ek olarak, random_state değerinin modelinizin kalitesi üzerinde önemli bir etkiye sahip olabileceğini hatırlamak önemlidir (kalite olarak aslında tahmin etmek için doğruluk demek istiyorum). Örneğin, belirli bir veri kümesini alıp onunla bir regresyon modeli çalıştırırsanız, random_state değerini belirtmeden, her seferinde test verisinde eğitimli modeliniz için farklı bir doğruluk sonucu elde etme potansiyeli vardır. Bu nedenle, size en doğru modeli sunmak için en iyi random_state değerini bulmak önemlidir. Ve sonra, bu sayı modelinizi başka bir araştırma deneyi gibi başka bir durumda yeniden oluşturmak için kullanılacaktır. Böyle yaparak,

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)`

1

Herhangi bir rasgele durum yoksa, sistem dahili olarak üretilen bir rasgele kullanır. Bu nedenle, programı birkaç kez çalıştırdığınızda farklı tren / test veri noktaları görebilirsiniz ve davranış öngörülemez olacaktır. Modelinizle ilgili bir sorun yaşarsanız, programı çalıştırdığınızda oluşturulan rasgele sayıyı bilmediğiniz için yeniden oluşturamazsınız.

Ağaç Sınıflandırıcıları'nı görürsünüz - DT veya RF, en uygun planı kullanarak bir deneme oluşturmaya çalışırlar. Çoğu zaman bu plan aynı olsa da, ağacın farklı olabileceği durumlar ve bu nedenle tahminler olabilir. Modelinizde hata ayıklamaya çalıştığınızda, bir Ağacın oluşturulduğu aynı örneği yeniden oluşturamayabilirsiniz. Bu nedenle, tüm bu zorluklardan kaçınmak için bir DecisionTreeClassifier veya RandomForestClassifier oluştururken random_state kullanıyoruz.

Not: Bunu daha iyi anlamak için Tree'nin DecisionTree'de nasıl oluşturulduğu konusunda biraz derinlemesine bilgi edinebilirsiniz.

randomstate temel olarak probleminizi her çalıştırıldığında aynı şekilde yeniden üretmek için kullanılır. Eğer traintestsplit'te rastgele bir durum kullanmazsanız, bölünmeyi her yaptığınızda farklı bir dizi tren ve test veri noktası elde edebilirsiniz ve bir sorunla karşılaşırsanız hata ayıklamada size yardımcı olmaz.

Dokümandan:

İnt ise rasgele sayı, rasgele sayı üreteci tarafından kullanılan tohumdur; RandomState örneği ise, randomstate rastgele sayı üretecidir; None ise, rastgele sayı üreteci np.random tarafından kullanılan RandomState örneğidir.


İyi açıklama. Sadece rastgele durumu geçmemizin bir nedeni, örneğin hiperparametreleri optimize etmeye çalışırsak, rasgele sayılara dayanan farklı başlangıçlar nedeniyle skorda dalgalanmalar olmasını istemediğimizi eklerim. veya gerçek optimizasyonun etkisini gizleyebilir ve böylece parametre değişikliğinden ve RNG'nin farklı başlangıç ​​durumundan kaynaklanan puan değişikliğinin bir kısmının ne olduğunu belirleyemedik.
jottbe

-1
sklearn.model_selection.train_test_split(*arrays, **options)[source]

Dizileri veya matrisleri rastgele tren ve test alt kümelerine ayırın

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

İnt ise random_state, rasgele sayı üreteci tarafından kullanılan tohumdur; RandomState örneği ise random_state rastgele sayı üretecidir; None ise, rastgele sayı üreteci np.random tarafından kullanılan RandomState örneğidir. kaynak: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' Rasgele durum ile ilgili olarak, yalancı rasgele sayı üretecine geçirilen rasgele tohumu belirlemek için sklearn'deki birçok rasgele algoritmada kullanılır. Bu nedenle, algoritmanın davranışının herhangi bir yönünü yönetmez. Sonuç olarak, doğrulama kümesinde iyi performans gösteren rastgele durum değerleri, görünmeyen yeni bir test kümesinde iyi performans gösterecek değerlere karşılık gelmez. Gerçekten de, algoritmaya bağlı olarak, sadece eğitim örneklerinin sırasını değiştirerek tamamen farklı sonuçlar görebilirsiniz. '' 'Kaynak: /stats/263999/is-random-state-a-parameter -to ayar

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.