web-dev-qa-db-fra.com

Dois-je utiliser `random.seed` ou` numpy.random.seed` pour contrôler la génération de nombres aléatoires dans `scikit-learn`?

J'utilise scikit-learn et numpy et je veux définir la graine globale pour que mon travail soit reproductible.

Dois-je utiliser numpy.random.seed ou random.seed?

Edit: D'après le lien dans les commentaires, je comprends qu'ils sont différents et que la version numpy n'est pas thread-safe. Je veux savoir précisément lequel utiliser pour créer des blocs-notes IPython pour l'analyse des données. Certains des algorithmes de scikit-learn impliquent la génération de nombres aléatoires, et je veux être sûr que le portable affiche les mêmes résultats à chaque exécution.

32
shadowtalker

Dois-je utiliser np.random.seed ou random.seed?

Cela dépend si vous utilisez dans votre code le générateur de nombres aléatoires de numpy ou celui dans random.

Les générateurs de nombres aléatoires dans numpy.random Et random ont des états internes totalement séparés, donc numpy.random.seed() n'affectera pas les séquences aléatoires produites par random.random(), et de même random.seed() n'affectera pas numpy.random.randn() etc. Si vous utilisez à la fois random et numpy.random dans votre code, vous devrez définir séparément les valeurs de départ pour tous les deux.

Mise à jour

Votre question semble concerner spécifiquement les générateurs de nombres aléatoires de scikit-learn. Pour autant que je sache, scikit-learn utilise tout le temps numpy.random, Vous devez donc utiliser np.random.seed() plutôt que random.seed().

Une mise en garde importante est que np.random N'est pas threadsafe - si vous définissez une graine globale, puis lancez plusieurs sous-processus et générez des nombres aléatoires en utilisant np.random, Chaque sous-processus héritera de l'état RNG de son parent , ce qui signifie que vous obtiendrez des variables aléatoires identiques dans chaque sous-processus. La manière habituelle de contourner ce problème consiste à passer une graine différente (ou numpy.random.Random Instance) à chaque sous-processus, de sorte que chacun ait un état RNG local distinct.

Étant donné que certaines parties de scikit-learn peuvent s'exécuter en parallèle à l'aide de joblib, vous verrez que certaines classes et fonctions ont une option pour passer soit une graine soit une instance de np.random.RandomState (Par exemple le paramètre random_state= À sklearn.decomposition.MiniBatchSparsePCA ). J'ai tendance à utiliser une seule graine globale pour un script, puis à générer de nouvelles graines aléatoires basées sur la graine globale pour toutes les fonctions parallèles.

31
ali_m