Я пытаюсь написать модульный тест для некоторого моего кода, который использует scikit-learn. Однако мои модульные тесты кажутся недетерминированными.
Насколько я знаю, единственные места в моем коде, где scikit-learn использует какую-либо случайность, находятся в его модели LogisticRegression
и train_test_split
, поэтому у меня есть следующее:
RANDOM_SEED = 5
self.lr = LogisticRegression(random_state=RANDOM_SEED)
X_train, X_test, y_train, test_labels = train_test_split(docs, labels, test_size=TEST_SET_PROPORTION, random_state=RANDOM_SEED)
Но это, похоже, не работает — даже когда я передаю фиксированные docs
и фиксированные labels
, вероятности предсказания в фиксированном наборе проверки меняются от запуска к запуску.
Я также пытался добавить вызов numpy.random.seed(RANDOM_SEED)
вверху своего кода, но это тоже не сработало.
Есть ли что-то, что я упускаю? Есть ли способ передать семя в scikit-learn в одном месте, чтобы это семя использовалось во всех вызовах scikit-learn?
scikit-learn
. Создайте экземплярprng=numpy.random.RandomState(RANDOM_SEED)
, затем передайте его какrandom_state=prng
каждой отдельной функции. Если вы просто передадитеRANDOM_SEED
, каждая отдельная функция перезапустится и выдаст одни и те же числа в разных местах, что приведет к плохой корреляции. - person Robert Kern   schedule 23.11.2016scikit-learn
в одном и том же конвейере. Вы хотите, чтобы ровно один экземплярRandomState
использовался всеми функциями в конвейере. - person Robert Kern   schedule 23.11.2016random_state=
). Вот почему я поместил это в комментарий. Я категорически заявляю, что способ, который я упомянул, является единственным правильным способом использования указанного семени для среды/задачи OP и PRNG. - person Robert Kern   schedule 23.11.2016