Случайное состояние (псевдослучайное число) в Scikit Learn
Я хочу реализовать алгоритм машинного обучения в scikit learn, но я не понимаю, что делает этот параметр random_state
? Почему я должен использовать его?
Я также не мог понять, что такое псевдослучайное число.
Ответы
Ответ 1
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]]
Запуск 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
, вы можете гарантировать, что вывод Run 1 будет равен выходу Run 2, т. random_state=some_number
Ваш split будет всегда одинаковым. Не имеет значения, каково фактическое число random_state
42, 0, 21,... Важно то, что каждый раз, когда вы используете 42, вы всегда будете получать тот же результат при первом расколе. Это полезно, если вы хотите воспроизводимых результатов, например, в документации, чтобы каждый мог последовательно видеть одинаковые номера при запуске примеров. На практике я бы сказал, вы должны установить random_state
на некоторое фиксированное число, пока вы тестируете материал, но затем удаляете его в процессе производства, если вам действительно нужен случайный (а не фиксированный) раскол.
Что касается вашего второго вопроса, генератор псевдослучайных чисел - это генератор чисел, который генерирует почти по-настоящему случайные числа. Почему они не являются по-настоящему случайными, выходит за рамки этого вопроса и, вероятно, не имеет значения в вашем случае, вы можете посмотреть здесь, чтобы получить более подробную информацию.
Ответ 2
Если вы не укажете random_state
в своем коде, то каждый раз, когда вы запускаете (выполняете) свой код, генерируется новое случайное значение, а наборы данных поездов и тестов будут иметь разные значения каждый раз.
Однако, если фиксированное значение присваивается как random_state = 42
то независимо от того, сколько раз вы выполняете свой код, результат будет таким же.ie, то же значение в наборах поездов и тестовых наборов данных.
Ответ 3
Если вы не упоминаете 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))
Теперь здесь вывод будет разным при каждом выполнении кода.
Ответ 4
Число random_state случайным образом разделяет наборы тестовых и обучающих данных. В дополнение к тому, что объясняется здесь, важно помнить, что значение random_state может оказать существенное влияние на качество вашей модели (под качеством я, по сути, подразумеваю точность прогнозирования). Например, если вы берете определенный набор данных и обучаете его регрессионной модели, не указывая значение random_state, существует вероятность того, что каждый раз вы будете получать другой результат точности для вашей обученной модели на тестовых данных.
Поэтому важно найти лучшее значение random_state, чтобы предоставить вам наиболее точную модель. И затем это число будет использовано для воспроизведения вашей модели в другом случае, например в другом исследовательском эксперименте.
Для этого можно разбить и обучить модель в цикле for, назначив случайные числа параметру 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)'
Ответ 5
Если нет предоставленного случайного состояния, система будет использовать случайное состояние, созданное внутри. Таким образом, когда вы запускаете программу несколько раз, вы можете увидеть разные точки данных поезда/теста, и поведение будет непредсказуемым. В случае, если у вас возникла проблема с вашей моделью, вы не сможете ее воссоздать, поскольку вы не знаете случайное число, которое было сгенерировано при запуске программы.
Если вы видите древовидные классификаторы - либо DT, либо RF, они пытаются построить попытку, используя оптимальный план. Хотя в большинстве случаев этот план может быть одним и тем же, могут быть случаи, когда дерево может отличаться, и поэтому прогнозы. При попытке отладки вашей модели вы не сможете воссоздать тот же экземпляр, для которого было построено дерево. Таким образом, чтобы избежать всех этих хлопот, мы используем random_state при создании DecisionTreeClassifier или RandomForestClassifier.
PS: Вы можете немного углубиться в то, как дерево построено в DecisionTree, чтобы лучше это понять.
randomstate в основном используется для воспроизведения вашей проблемы одинаково при каждом запуске. Если вы не используете случайное состояние в Traintestsplit, каждый раз, когда вы делаете разделение, вы можете получить различный набор обучающих и тестовых точек данных и не поможет вам в отладке в случае возникновения проблемы.
От Дока:
Если int, randomstate - это начальное число, используемое генератором случайных чисел; Если экземпляр RandomState, то randomstate является генератором случайных чисел; Если None, генератор случайных чисел - это экземпляр RandomState, используемый np.random.
Ответ 6
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 для определения случайного начального числа, передаваемого в генератор псевдослучайных чисел. Следовательно, он не управляет каким-либо аспектом поведения алгоритма. Как следствие, значения случайных состояний, которые хорошо работали в наборе проверки, не соответствуют тем, которые будут хорошо работать в новом, невидимом наборе испытаний. В самом деле, в зависимости от алгоритма вы можете увидеть совершенно разные результаты, просто изменив порядок обучающих образцов. '' 'Источник: https://stats.stackexchange.com/info/263999/is-random-state-a-parameter -настраивать