web-dev-qa-db-fra.com

confus au sujet de random_state dans l'arbre de décision de scikit learn

Confus à propos de random_state paramètre, je ne sais pas pourquoi la formation de l'arbre de décision a besoin d'un peu de hasard. Mes pensées, (1) est-ce lié à la forêt aléatoire? (2) est-ce lié à un ensemble de données de test de formation fractionné? Si oui, pourquoi ne pas utiliser directement la méthode de fractionnement des tests de formation ( 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.      ])

salutations, Lin

15
Lin Ma

Ceci est expliqué dans la documentation

Le problème de l'apprentissage d'un arbre de décision optimal est connu pour être NP-complet sous plusieurs aspects de l'optimalité et même pour des concepts simples. Par conséquent, les algorithmes d'apprentissage pratique de l'arbre de décision sont basés sur des algorithmes heuristiques tels que l'algorithme gourmand où des décisions localement optimales sont prises à chaque nœud. De tels algorithmes ne peuvent garantir le retour de l'arbre de décision globalement optimal. Cela peut être atténué en entraînant plusieurs arbres dans un apprenant d'ensemble, où les caractéristiques et les échantillons sont échantillonnés au hasard avec remplacement.

Donc, fondamentalement, un algorithme gourmand sous-optimal est répété plusieurs fois en utilisant des sélections aléatoires de caractéristiques et d'échantillons (une technique similaire utilisée dans les forêts aléatoires). Le paramètre random_state Permet de contrôler ces choix aléatoires.

documentation de l'interface indique spécifiquement:

Si int, random_state est la graine utilisée par le générateur de nombres aléatoires; Si l'instance RandomState, random_state est le générateur de nombres aléatoires; Si aucun, le générateur de nombres aléatoires est l'instance RandomState utilisée par np.random.

Ainsi, l'algorithme aléatoire sera utilisé dans tous les cas. La transmission d'une valeur (qu'il s'agisse d'un entier spécifique, par exemple 0 ou d'une instance RandomState) ne changera pas cela. La seule raison de transmettre une valeur int (0 ou autre) est de rendre le résultat cohérent entre les appels: si vous appelez cela avec random_state=0 (Ou toute autre valeur), à chaque fois, vous obtenir le même résultat.

18
Ami Tavory