Случайное состояние (псевдослучайное число) в Scikit Learn

Я хочу реализовать алгоритм машинного обучения в Scikit Learn, но я не понимаю, что это за параметр random_state делает? Почему я должен использовать это?

Я также не мог понять, что такое псевдослучайное число.

8 ответов

Решение

train_test_split разбивает массивы или матрицы на случайные подмножества поезд и тест. Это означает, что каждый раз, когда вы запускаете его без указания random_state, вы получите другой результат, это ожидаемое поведение. Например:

Прогон 1:

>>> a, b = np.arange(10).reshape((5, 2)), range(5)
>>> train_test_split(a, b)
[array([[6, 7],
        [8, 9],
        [4, 5]]),
 array([[2, 3],
        [0, 1]]), [3, 4, 2], [1, 0]]

Run 2

>>> train_test_split(a, b)
[array([[8, 9],
        [4, 5],
        [0, 1]]),
 array([[6, 7],
        [2, 3]]), [4, 2, 0], [3, 1]]

Меняется. С другой стороны, если вы используете random_state=some_number, тогда вы можете гарантировать, что результат прогона 1 будет равен выходу прогона 2, т. е. ваше разделение будет всегда одинаковым. Неважно, что на самом деле random_state число равно 42, 0, 21, ... Важно то, что каждый раз, когда вы используете 42, вы всегда получите один и тот же вывод при первом выполнении разделения. Это полезно, если вам нужны воспроизводимые результаты, например, в документации, чтобы каждый мог последовательно видеть одинаковые цифры при запуске примеров. На практике я бы сказал, вы должны установить random_state на некоторое фиксированное число, пока вы тестируете материал, но затем удалите его в производстве, если вам действительно нужно случайное (а не фиксированное) разделение.

Что касается вашего второго вопроса, генератор псевдослучайных чисел - это генератор чисел, который генерирует почти действительно случайные числа. Почему они не являются действительно случайными, выходит за рамки этого вопроса и, вероятно, не имеет значения в вашем случае, вы можете посмотреть здесь для получения более подробной информации.

Если вы не укажете random_state в вашем коде каждый раз, когда вы запускаете (выполняете) свой код, генерируется новое случайное значение, и наборы данных train и test будут каждый раз иметь разные значения.

Однако, если фиксированное значение присваивается как random_state = 42 тогда независимо от того, сколько раз вы выполняете свой код, результат будет одинаковым.ie, одинаковыми значениями в наборах данных train и test.

На вопрос, что такое «случайное состояние» и почему оно используется, люди, приведенные выше, хорошо ответили на этот вопрос. Я попытаюсь ответить на вопрос «Почему мы очень часто выбираем случайное состояние как 42 во время обучения модели машинного обучения? Почему мы не выбираем 12, 32 или 5?» Есть ли научное объяснение?

Многие студенты и практики используют это число (42) как случайное состояние, потому что оно используется многими преподавателями на онлайн-курсах. Они часто устанавливают случайное состояние или numpy seed на номер 42, и учащиеся следуют той же практике, не задумываясь об этом.

Если быть точным, 42 не имеет ничего общего с AI или ML. На самом деле это общее число. В машинном обучении не имеет значения, что такое фактическое случайное число, как упоминалось в документе scikit API, любого INTEGER достаточно для поставленной задачи.

42 - это отсылка к книге «Автостопом» по галактике . Ответ на жизненную вселенную и все остальное задумано как шутка . Другого значения это не имеет.

Ссылки :

  1. Википедия: автостопом по галактике
  2. Обмен стеками: почему число 42 предпочтительнее, когда обозначает что-то случайное
  3. Почему число 42
  4. Quora: почему число 42 предпочтительнее, когда обозначает что-то случайное
  5. YouTube: Красивое простое видео, объясняющее использование случайного состояния в поезд-тест-сплит

Если вы не упоминаете random_state в коде, то всякий раз, когда вы выполняете свой код, генерируется новое случайное значение, и наборы данных train и test каждый раз будут иметь разные значения.

Однако, если вы используете конкретное значение для random_state(random_state = 1 или любое другое значение) каждый раз, когда результат будет одинаковым, то есть одинаковыми значениями в наборах данных train и test. Смотрите ниже код:

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,random_state = 1,test_size = .3)
size25split = train_test_split(test_series,random_state = 1,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Не имеет значения, сколько раз вы запустите код, результат будет 70.

70

Попробуйте удалить random_state и запустить код.

import pandas as pd 
from sklearn.model_selection import train_test_split
test_series = pd.Series(range(100))
size30split = train_test_split(test_series,test_size = .3)
size25split = train_test_split(test_series,test_size = .25)
common = [element for element in size25split[0] if element in size30split[0]]
print(len(common))

Теперь здесь вывод будет отличаться при каждом выполнении кода.

Число random_state случайным образом разделяет наборы тестовых и обучающих данных. В дополнение к тому, что объясняется здесь, важно помнить, что значение random_state может оказать существенное влияние на качество вашей модели (под качеством я, по сути, подразумеваю точность прогнозирования). Например, если вы берете определенный набор данных и обучаете его регрессионной модели, не указывая значение random_state, существует вероятность того, что каждый раз вы будете получать другой результат точности для вашей обученной модели на тестовых данных. Поэтому важно найти лучшее значение random_state, чтобы предоставить вам наиболее точную модель. И затем это число будет использовано для воспроизведения вашей модели в другом случае, например в другом исследовательском эксперименте. Для этого можно разбить и обучить модель в цикле for, назначив случайные числа параметру random_state:

`для j в диапазоне (1000):

        X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =j,     test_size=0.35)
        lr = LarsCV().fit(X_train, y_train)

        tr_score.append(lr.score(X_train, y_train))
        ts_score.append(lr.score(X_test, y_test))

    J = ts_score.index(np.max(ts_score))

    X_train, X_test, y_train, y_test = train_test_split(X, y , random_state =J, test_size=0.35)
    M = LarsCV().fit(X_train, y_train)
    y_pred = M.predict(X_test)`

Если случайное состояние отсутствует, система будет использовать случайное состояние, которое генерируется внутренне. Таким образом, если вы запустите программу несколько раз, вы можете увидеть разные точки данных для обучения / тестирования, и поведение будет непредсказуемым. В случае, если у вас возникла проблема с вашей моделью, вы не сможете ее воссоздать, так как вы не знаете случайное число, которое было сгенерировано при запуске программы.

Если вы видите древовидные классификаторы - либо DT, либо RF, они пытаются построить попытку, используя оптимальный план. Хотя в большинстве случаев этот план может быть одинаковым, могут быть случаи, когда дерево может быть другим, и, следовательно, прогнозы. Когда вы пытаетесь отладить свою модель, вы не сможете воссоздать тот же экземпляр, для которого было построено Дерево. Итак, чтобы избежать всех этих хлопот, мы используем random_state при создании DecisionTreeClassifier или RandomForestClassifier.

PS: Вы можете немного углубиться в то, как Tree строится в DecisionTree, чтобы лучше понять это.

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

Из Док:

Если int, randomstate - это начальное число, используемое генератором случайных чисел; Если экземпляр RandomState, randomstate является генератором случайных чисел; Если None, генератор случайных чисел - это экземпляр RandomState, используемый np.random.

Предположим, у нас есть набор данных из 10 чисел от 1 до 10, и теперь, если мы хотим разделить его на набор данных для обучения и набор данных для тестирования, а размер набора данных для тестирования составляет 20% от всего набора данных.

Набор обучающих данных имеет 8, а набор тестовых данных имеет 2 образца данных. Таким образом, мы гарантируем, что случайный процесс каждый раз будет выводить один и тот же результат, что делает код воспроизводимым. Потому что, если мы не будем перемешивать набор данных, он будет каждый раз создавать разные наборы данных, и нехорошо каждый раз обучать модель с разными данными.

Для всех случайных наборов данных каждому присваивается значение random_state. Это означает, что одно значение random_state имеет фиксированный набор данных. Это означает, что каждый раз, когда мы запускаем код со значением random_state 1, он будет создавать одни и те же наборы данных разделения.

На изображении ниже показано все, что делает random_state.

См. введите описание ссылки здесь

sklearn.model_selection.train_test_split(*arrays, **options)[source]

Разбить массивы или матрицы на случайные подмножества поездов и тестов

Parameters: ... 
    random_state : int, RandomState instance or None, optional (default=None)

Если int, random_state - начальное число, используемое генератором случайных чисел; Если экземпляр RandomState, random_state является генератором случайных чисел; Если None, генератор случайных чисел является экземпляром RandomState, используемым np.random. источник: http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.train_test_split.html

'' 'Что касается случайного состояния, оно используется во многих рандомизированных алгоритмах в sklearn для определения случайного начального числа, передаваемого в генератор псевдослучайных чисел. Следовательно, он не управляет каким-либо аспектом поведения алгоритма. Как следствие, значения случайных состояний, которые хорошо работали в наборе проверки, не соответствуют тем, которые будут хорошо работать в новом, невидимом наборе испытаний. Indeed, depending on the algorithm, you might see completely different results by just changing the ordering of training samples.''' source: https://stats.stackexchange.com/questions/263999/is-random-state-a-parameter-to-tune

Другие вопросы по тегам