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

148

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

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

Элизабет Сьюзан Джозеф
источник

Ответы:

220

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какое-то фиксированное число во время тестирования, но затем удалить его в производстве, если вам действительно нужно случайное (а не фиксированное) разделение.

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

elyase
источник
7
так какое случайное состояние я должен установить, я обычно вижу это число 42.
Элизабет Сьюзан Джозеф
1
@ ElizabethSusanJoseph, это не имеет большого значения, я всегда использую 0, если я хочу воспроизводимость или None в противном случае. Может быть, такие парни, как 42.
Elyase
53
Это, вероятно, объясняет,
почему
3
Хорошо, вот больше возможностей .
Elyase
1
@ Херберт Это сложный вопрос. Основной PRNG-материал основан на Numpy, который является последовательным (они ввели много проверок для этого после некоторой проблемы в прошлом). Если в sklearn нет ошибок в использовании, он также будет работать согласованно. Я бы предположил это (особенно для менее сложных функций, таких как train-test-split и co). Edit : упс, немного поздно :-)
sascha
13

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

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

Умар Салман
источник
4

Если вы не упоминаете 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))

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

Риши Бансал
источник
3

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

for j in range(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)`
Арад Хаселирад
источник
1

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

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

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

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

Из Док:

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

MdNazmulHossain
источник
Хорошее объяснение. Я бы только добавил, что причина, по которой мы пропустили бы случайное состояние, заключается в том, что если мы, например, пытаемся оптимизировать гиперпараметры, мы не хотим иметь колебания в счете из-за различных инициализаций на основе случайных чисел, которые могут охватывать или скрыть эффект фактической оптимизации, и, таким образом, мы не могли определить, какая часть изменения оценки произошла из-за изменения параметра, а какая - из-за другого начального состояния ГСЧ.
Jottbe
-1
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 для определения случайного начального числа, передаваемого в генератор псевдослучайных чисел. Следовательно, он не управляет каким-либо аспектом поведения алгоритма. Как следствие, значения случайного состояния, которые хорошо работали в наборе проверки, не соответствуют тем, которые будут хорошо работать в новом, невидимом наборе испытаний. В самом деле, в зависимости от алгоритма вы можете увидеть совершенно разные результаты, просто изменив порядок обучающих образцов. '' 'Источник: /stats/263999/is-random-state-a-parameter -настраивать

Богдан Корецкий
источник