Scikit学習のランダム状態(疑似乱数)


148

scikit learnに機械学習アルゴリズムを実装したいのですが、このパラメーターのrandom_state機能がわかりません。なぜそれを使用する必要があるのですか?

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

回答:


220

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

実行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実行1の出力が実行2の出力と同じになることを保証できます。つまり、分割は常に同じになります。実際のrandom_state数が42、0、21であるかどうかは関係ありません...重要なことは、42を使用するたびに、最初に分割したときに常に同じ出力が得られることです。これは、ドキュメントなどで再現性のある結果が必要な場合に役立ちます。これにより、例を実行するときに誰もが常に同じ番号を見ることができます。実際には、random_state何かをテストする間はをいくつかの固定数に設定する必要がありますが、実際にランダムな(固定ではない)分割が必要な場合は、本番環境で削除する必要があります。

2番目の質問に関しては、疑似乱数ジェネレータは、ほぼ真の乱数を生成する数値ジェネレータです。それらが本当にランダムではない理由はこの質問の範囲外であり、おそらくあなたのケースでは問題にならないでしょう。詳細については、こちらをご覧ください。


7
そのランダムな状態は私が設定すべきか、私は一般的に、この数42を参照
エリザベススーザン・ジョセフ・

1
@ElizabethSusanJoseph、あまり問題ではありません。再現性が必要な場合は常に0を使用します。それ以外の場合はNoneを使用します。42のようなscikitの連中であってもよい
elyase

53
これはおそらく42が頻繁に使用されていることを説明しています:en.wikipedia.org/wiki/The_Hitchhiker%27s_Guide_to_the_Galaxy
denson

3
いいですね、ここにもっと可能性があります。
2015年

1
@ハーバートそれは難しい質問です。中核となるPRNG要素は、一貫性のあるnumpyに基づいています(過去に何らかの問題が発生した後、これに対する多くのチェックが導入されました)。sklearn内の使用法にエラーがない場合、一貫して動作します。私はこれを想定します(特にtrain-test-splitやcoのような複雑でない関数の場合)Edit:oops、a bit late :-)
sascha

13

random_stateコードでを指定しない場合、コードを実行(実行)するたびに新しいランダムな値が生成され、トレーニングデータセットとテストデータセットは毎回異なる値になります。

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


4

コードでrandom_stateを指定しない場合、コードを実行するたびに新しいランダムな値が生成され、トレーニングデータセットとテストデータセットは毎回異なる値になります。

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

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

ここでの出力は、コードを実行するたびに異なります。


3

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

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

ランダムステートがない場合、システムは内部で生成されたランダムステートを使用します。そのため、プログラムを複数回実行すると、異なる学習/テストデータポイントが表示され、動作が予測できなくなります。プログラムに問題が発生した場合、プログラムを実行したときに生成された乱数がわからないため、モデルを再作成できません。

ツリー分類子(DTまたはRF)が表示された場合、最適な計画を使用して試行を構築しようとします。ほとんどの場合、この計画は同じかもしれませんが、ツリーが異なる場合があるため、予測が異なる場合があります。モデルをデバッグしようとすると、ツリーが構築されたのと同じインスタンスを再作成できない場合があります。したがって、この面倒な作業をすべて回避するために、DecisionTreeClassifierまたはRandomForestClassifierを構築するときに、random_stateを使用します。

PS:ツリーをDecisionTreeでどのように構築するかを少し深く理解して、これをよりよく理解することができます。

randomstateは基本的に、実行されるたびに同じ問題を再現するために使用されます。traintestsplitでランダムな状態を使用しない場合、分割を行うたびに、異なる一連の学習データポイントとテストデータポイントが取得される可能性があり、問題が発生した場合のデバッグに役立ちません。

Docから:

intの場合、randomstateは乱数ジェネレータによって使用されるシードです。RandomStateインスタンスの場合、randomstateは乱数ジェネレーターです。Noneの場合、乱数ジェネレータはnp.randomによって使用されるRandomStateインスタンスです。


良い説明。ランダムな状態を渡す理由は、たとえばハイパーパラメータを最適化しようとする場合、乱数に基づく異なる初期化が原因でスコアが変動しないようにするためです。または、実際の最適化の効果を非表示にして、スコアの変更のどの部分がパラメーターの変更に起因し、何がRNGの異なる開始状態に起因するのかを特定できませんでした。
jottbe

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

配列または行列をランダムトレインとテストサブセットに分割する

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

intの場合、random_stateは乱数ジェネレータによって使用されるシードです。RandomStateインスタンスの場合、random_stateは乱数ジェネレータです。Noneの場合、乱数ジェネレータはnp.randomによって使用されるRandomStateインスタンスです。ソース:http : //scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

ランダムな状態については、擬似乱数ジェネレータに渡されるランダムシードを決定するために、sklearnの多くのランダム化アルゴリズムで使用されます。したがって、アルゴリズムの動作のどの側面も制御しません。結果として、検証セットで適切に実行されたランダムな状態値は、新しい目に見えないテストセットで適切に実行される値に対応しません。実際、アルゴリズムによっては、トレーニングサンプルの順序を変更するだけで完全に異なる結果が表示される場合があります」出典:https : //stats.stackexchange.com/questions/263999/is-random-state-a-parameter -調整する

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.