Выбор random_state для алгоритмов sklearn

Я это понимаю random_state используется в различных алгоритмах sklearn для разрыва связи между разными предикторами (деревьями) с одинаковым значением метрики (например, в GradientBoosting). Но документация не уточняет и не детализирует это. подобно

1) где еще эти семена используются для генерации случайных чисел? Скажи за RandomForestClassifier Случайное число может использоваться, чтобы найти набор случайных признаков для построения предиктора. Алгоритмы, которые используют подвыборку, могут использовать случайные числа, чтобы получить разные подвыборки. Может / Это же семя (random_state) играть роль в нескольких поколениях случайных чисел?

Что меня больше всего беспокоит, так это

2) насколько далеко длится эффект этой переменной random_state.? Может ли значение существенно повлиять на прогноз (классификация или регрессия)? Если да, то о каких наборах данных мне следует больше заботиться? Или это скорее стабильность, чем качество результатов?

3) Если это может иметь большое значение, как лучше выбрать это random_state? Трудно сделать GridSearch без интуиции. Особенно, если набор данных таков, что одно резюме может занять час.

4) Если мотив состоит в том, чтобы иметь только устойчивый результат / оценку моих моделей и результаты перекрестной проверки при повторных прогонах, имеет ли это тот же эффект, если я установлю random.seed(X) прежде чем использовать какой-либо из алгоритмов (и использовать random_state как нет).

5) Скажи, что я использую random_state значение в классификаторе GradientBoosted, и я перекрестная проверка, чтобы найти добротность моей модели (выигрывая по проверке установлен каждый раз). После того, как я буду удовлетворен, я буду тренировать свою модель на всем тренировочном наборе, прежде чем применить ее на испытательном наборе. Теперь у полного обучающего набора есть больше экземпляров, чем у меньших обучающих наборов в перекрестной проверке. Итак random_state Значение может теперь привести к совершенно другому поведению (выбор функций и отдельных предикторов) по сравнению с тем, что происходило в цикле cv. Точно так же такие вещи, как лист минимальных выборок и т. Д., Могут также привести к неполноценной модели теперь, когда настройки по количеству экземпляров в CV, а фактическое количество экземпляров больше. Это правильное понимание? Каков подход к защите от этого?

3 ответа

Да, выбор случайных семян повлияет на результаты вашего прогноза, и, как вы указали в своем четвертом вопросе, это влияние не является предсказуемым.

Обычный способ избежать случайных предсказаний, которые оказываются хорошими или плохими, состоит в том, чтобы обучить несколько моделей (основанных на разных случайных состояниях) и осмысленно усреднить их предсказания. Точно так же вы можете рассматривать перекрестную проверку как способ оценить "истинную" производительность модели путем усреднения производительности по нескольким разделениям данных обучения / тестирования.

1) где еще эти семена используются для генерации случайных чисел? Скажем, для RandomForestClassifier, случайное число может быть использовано для поиска набора случайных объектов для построения предиктора. Алгоритмы, которые используют подвыборку, могут использовать случайные числа, чтобы получить разные подвыборки. Может ли одно семя (random_state) играть роль в нескольких поколениях случайных чисел?

random_state используется везде, где необходима случайность:

Если ваш код использует генератор случайных чисел, он никогда не должен использовать такие функции, как numpy.random.random или же numpy.random.normal, Такой подход может привести к проблемам повторяемости в модульных тестах. Вместо этого numpy.random.RandomState объект должен быть использован, который построен из random_state аргумент передан классу или функции.

2) насколько далеко длится эффект этой переменной random_state.? Может ли значение существенно повлиять на прогноз (классификация или регрессия)? Если да, то о каких наборах данных мне следует больше заботиться? Или это скорее стабильность, чем качество результатов?

Хорошие проблемы не должны слишком сильно зависеть от random_state,

3) Если это может иметь большое значение, как лучше выбрать это random_state? Трудно сделать GridSearch без интуиции. Особенно, если набор данных таков, что одно резюме может занять час.

Не выбирай это. Вместо этого попытайтесь оптимизировать другие аспекты классификации для достижения хороших результатов, независимо от random_state,

4) Если мотив состоит в том, чтобы иметь только устойчивый результат / оценку моих моделей и результаты перекрестной проверки при повторных прогонах, имеет ли это тот же эффект, если я устанавливаю random.seed(X), прежде чем использовать какой-либо из алгоритмов (и использовать random_state как нет).

Должен ли я использовать `random.seed` или`numpy.random.seed` для управления генерацией случайных чисел в `scikit-learn`?, random.seed(X) не используется sklearn. Если вам нужно контролировать это, вы можете установить np.random.seed() вместо.

5) Скажем, я использую значение random_state в классификаторе GradientBoosted, и я перекрестно проверяю, чтобы найти добротность моей модели (каждый раз оценивая набор валидации). После того, как я буду удовлетворен, я буду тренировать свою модель на всем тренировочном наборе, прежде чем применить ее на испытательном наборе. Теперь у полного обучающего набора есть больше экземпляров, чем у меньших обучающих наборов в перекрестной проверке. Таким образом, значение random_state теперь может привести к совершенно другому поведению (выбор функций и отдельных предикторов) по сравнению с тем, что происходило в цикле cv. Точно так же такие вещи, как лист минимальных выборок и т. Д., Могут также привести к неполноценной модели теперь, когда настройки по количеству экземпляров в CV, а фактическое количество экземпляров больше. Это правильное понимание? Каков подход к защите от этого?

Как я могу узнать, что данных обучения достаточно, чтобы ответы машинного обучения в основном утверждали, что чем больше данных, тем лучше.

Если вы делаете большой выбор моделей, возможно, Sacred тоже может помочь. Помимо прочего, он устанавливает и может регистрировать случайное начальное число для каждой оценки, например:

>>./experiment.py with seed=123

Во время эксперимента для настройки и воспроизводимости вы фиксируете временно случайное состояние, но вы повторяете эксперимент с разными случайными состояниями и берете среднее значение результатов.

      # Set a Random State value
RANDOM_STATE = 42

# Set Python random a fixed value
import random
random.seed(RANDOM_STATE)

# Set numpy random a fixed value
import numpy as np
np.random.seed(RANDOM_STATE)

# Set other library like TensorFlow random a fixed value
import tensorflow as tf
tf.set_random_seed(RANDOM_STATE)

# Eventually don't forget to set random_state parameter in function like
RandomizedSearchCV(random_state = RANDOM_STATE, ...)

Для производственной системы вы удаляете случайное состояние, задав для него значение Нет.

      # Set a Random State value
RANDOM_STATE = None
Другие вопросы по тегам