Я хочу реализовать алгоритм машинного обучения в scikit learn, но я не понимаю, что random_state
делает этот параметр ? Почему я должен использовать это?
Я также не мог понять, что такое псевдослучайное число.
Я хочу реализовать алгоритм машинного обучения в scikit learn, но я не понимаю, что random_state
делает этот параметр ? Почему я должен использовать это?
Я также не мог понять, что такое псевдослучайное число.
Ответы:
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.
Если вы не упоминаете 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 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)`
Если не предоставлено случайное состояние, система будет использовать случайное состояние, созданное внутри. Таким образом, когда вы запускаете программу несколько раз, вы можете увидеть разные точки данных поезда / теста, и поведение будет непредсказуемым. В случае, если у вас возникла проблема с вашей моделью, вы не сможете восстановить ее, поскольку вы не знаете случайное число, которое было сгенерировано при запуске программы.
Если вы видите древовидные классификаторы - либо DT, либо RF, они пытаются создать попытку, используя оптимальный план. Хотя в большинстве случаев этот план может быть одним и тем же, могут быть случаи, когда дерево может отличаться, и поэтому прогнозы. При попытке отладки вашей модели вы не сможете воссоздать тот же экземпляр, для которого было построено дерево. Итак, чтобы избежать всех этих хлопот, мы используем random_state при создании DecisionTreeClassifier или RandomForestClassifier.
PS: Вы можете немного углубиться в то, как дерево построено в DecisionTree, чтобы лучше это понять.
randomstate в основном используется для воспроизведения вашей проблемы одинаково при каждом запуске. Если вы не используете случайное состояние в Traintestsplit, каждый раз, когда вы делаете разделение, вы можете получить различный набор обучающих и тестовых точек данных и не поможет вам в отладке в случае возникновения проблемы.
Из Док:
Если int, randomstate - это начальное число, используемое генератором случайных чисел; Если экземпляр RandomState, randomstate является генератором случайных чисел; Если None, генератор случайных чисел - это экземпляр RandomState, используемый np.random.
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 -настраивать