web-dev-qa-db-ja.com

scikit学習の決定木でrandom_stateについて混乱している

random_stateパラメータについて混乱しています。決定木トレーニングにランダム性が必要な理由がわかりません。私の考え、(1)それはランダムフォレストに関連していますか? (2)分割トレーニングテストデータセットに関連していますか?もしそうなら、なぜトレーニングテスト分割メソッドを直接使用しないのですか( http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html )?

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import cross_val_score
>>> from sklearn.tree import DecisionTreeClassifier
>>> clf = DecisionTreeClassifier(random_state=0)
>>> iris = load_iris()
>>> cross_val_score(clf, iris.data, iris.target, cv=10)
...                             
...
array([ 1.     ,  0.93...,  0.86...,  0.93...,  0.93...,
        0.93...,  0.93...,  1.     ,  0.93...,  1.      ])

よろしく、林

15
Lin Ma

これは ドキュメント で説明されています

最適な決定木を学習する問題は、最適性のいくつかの側面の下で、さらには単純な概念でさえNP完全であることが知られています。その結果、実用的な決定木学習アルゴリズムは、各ノードで局所的に最適な決定が行われる欲張りアルゴリズムなどの発見的アルゴリズムに基づいています。このようなアルゴリズムは、グローバルに最適な決定木を返すことを保証できません。これは、アンサンブル学習器で複数のツリーをトレーニングすることで軽減できます。この場合、特徴とサンプルは置換でランダムにサンプリングされます。

そのため、基本的には、特徴とサンプルのランダムな選択を使用して、次善の貪欲アルゴリズムが何度も繰り返されます(ランダムフォレストで使用される同様の手法)。 random_stateパラメーターを使用すると、これらのランダムな選択を制御できます。

インターフェイスのドキュメント の具体的な状態:

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

したがって、いずれの場合もランダムアルゴリズムが使用されます。値を渡しても(特定のint、たとえば0、またはRandomStateインスタンス)、それは変更されません。 int値(0またはそれ以外)を渡す唯一の理由は、呼び出し間で結果を一貫させることです。これをrandom_state=0(または他の値)で呼び出すと、毎回、同じ結果。

18
Ami Tavory