web-dev-qa-db-ja.com

Scikit learnのランダム状態(擬似乱数)

Scikit learnで機械学習アルゴリズムを実装したいのですが、このパラメーターrandom_stateが何をするのか理解できませんか?なぜ私はそれを使うべきですか?

私はまた、疑似乱数とは何かを理解できませんでした。

105

train_test_splitは、配列または行列をランダムなトレインとテストのサブセットに分割します。つまり、random_stateを指定せずに実行するたびに異なる結果になります。これは予想される動作です。例えば:

Run 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]]

実行2

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

それは変わる。一方、random_state=some_numberを使用する場合、Run 1の出力はRun 2の出力と等しくなります。つまり、分割は常に同じ。実際のrandom_stateの数が42、0、21、...であっても構いません。重要なことは、42を使用するたびに、最初に分割したときに常に同じ出力が表示されるということです。これは、たとえばドキュメント内で再現性のある結果が必要な場合に役立ちます。これにより、すべての人が例を実行したときに常に同じ番号が表示されるようになります。実際には、テストするときはrandom_stateを固定値に設定する必要がありますが、実際にはランダムな(固定ではない)分割が必要な場合は削除します。

あなたの2番目の質問に関して、疑似乱数生成器はほとんど真に乱数を生成する数生成器です。それらが本当にランダムではないのはなぜこの質問の範囲外であり、おそらくあなたの場合は問題にならないでしょう。あなたはもっと詳しく見ることができます ここ フォーム.

149
elyase

コードにrandom_stateを指定しないと、コードを実行(実行)するたびに新しい乱数値が生成され、trainデータセットとtestデータセットは毎回異なる値になります。

ただし、random_state = 42のように固定値が割り当てられている場合、コードを何回実行しても、結果は同じになります。trainデータセットとテストデータセットで同じ値になります。

9
umar salman

コードでrandom_stateに言及していない場合は、コードを実行するたびに新しい乱数値が生成され、trainデータセットとtestデータセットは毎回異なる値になります。

ただし、結果が同じになるたびにrandom_stateに特定の値(random_state = 1またはその他の値)を使用すると、つまりtrainデータセットとtestデータセットで同じ値が使用されます。以下のコードを参照してください。

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

何回コードを実行しても、出力は70になります。

70

Random_stateを削除してコードを実行してください。

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

これで、コードを実行するたびに出力が変わります。

2
Rishi Bansal

random_state番号は、テストデータセットとトレーニングデータセットをランダムに分割します。ここで説明されていることに加えて、random_state値があなたのモデルの品質に大きな影響を与えることを覚えておくことは重要です(品質によって私は本質的に予測する正確さを意味します)。たとえば、random_state値を指定せずに、特定のデータセットを取得してそれを使用して回帰モデルを学習させると、テストデータの学習モデルに対して毎回異なる精度の結果が得られる可能性があります。そのため、最も正確なモデルを提供するために最適なrandom_state値を見つけることが重要です。そして、その数は、別の研究実験などの別の機会にあなたのモデルを再現するために使用されます。そうするために、random_stateパラメータに乱数を割り当てることでforループでモデルを分割して訓練することが可能です。

`jの範囲(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
Arad Haselirad