scikit learnに機械学習アルゴリズムを実装したいのですが、このパラメーターのrandom_state
機能がわかりません。なぜそれを使用する必要があるのですか?
また、疑似乱数とは何なのか理解できませんでした。
scikit learnに機械学習アルゴリズムを実装したいのですが、このパラメーターのrandom_state
機能がわかりません。なぜそれを使用する必要があるのですか?
また、疑似乱数とは何なのか理解できませんでした。
回答:
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番目の質問に関しては、疑似乱数ジェネレータは、ほぼ真の乱数を生成する数値ジェネレータです。それらが本当にランダムではない理由はこの質問の範囲外であり、おそらくあなたのケースでは問題にならないでしょう。詳細については、こちらをご覧ください。
コードで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))
ここでの出力は、コードを実行するたびに異なります。
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)`
ランダムステートがない場合、システムは内部で生成されたランダムステートを使用します。そのため、プログラムを複数回実行すると、異なる学習/テストデータポイントが表示され、動作が予測できなくなります。プログラムに問題が発生した場合、プログラムを実行したときに生成された乱数がわからないため、モデルを再作成できません。
ツリー分類子(DTまたはRF)が表示された場合、最適な計画を使用して試行を構築しようとします。ほとんどの場合、この計画は同じかもしれませんが、ツリーが異なる場合があるため、予測が異なる場合があります。モデルをデバッグしようとすると、ツリーが構築されたのと同じインスタンスを再作成できない場合があります。したがって、この面倒な作業をすべて回避するために、DecisionTreeClassifierまたはRandomForestClassifierを構築するときに、random_stateを使用します。
PS:ツリーをDecisionTreeでどのように構築するかを少し深く理解して、これをよりよく理解することができます。
randomstateは基本的に、実行されるたびに同じ問題を再現するために使用されます。traintestsplitでランダムな状態を使用しない場合、分割を行うたびに、異なる一連の学習データポイントとテストデータポイントが取得される可能性があり、問題が発生した場合のデバッグに役立ちません。
Docから:
intの場合、randomstateは乱数ジェネレータによって使用されるシードです。RandomStateインスタンスの場合、randomstateは乱数ジェネレーターです。Noneの場合、乱数ジェネレータはnp.randomによって使用されるRandomStateインスタンスです。
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 -調整する