Случайное состояние Python в наборе данных расщепления
Я немного новичок в питоне. Может ли кто-нибудь сказать мне, почему мы устанавливаем случайное состояние в ноль при разделении поезда и тестового набора.
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.30, random_state=0)
Я видел такие ситуации, когда случайное состояние установлено в единицу!
X_train, X_test, y_train, y_test = \
train_test_split(X, y, test_size=0.30, random_state=1)
Каковы же последствия этого случайного состояния при перекрестной проверке?
11 ответов
Не имеет значения, является ли random_state 0 или 1 или любым другим целым числом. Важно то, что для него должно быть установлено одно и то же значение, если вы хотите проверить свою обработку по нескольким прогонам кода. Кстати я видел random_state=42
используется во многих официальных примерах scikit, а также в других местах.
random_state
как следует из названия, используется для инициализации внутреннего генератора случайных чисел, который будет определять разбиение данных на индексы обучения и тестирования в вашем случае. В документации указано, что:
Если random_state имеет значение None или np.random, то возвращается случайно инициализированный объект RandomState.
Если random_state является целым числом, то оно используется для заполнения нового объекта RandomState.
Если random_state является объектом RandomState, то он пропускается.
Это делается для проверки и проверки данных при многократном запуске кода. настройка random_state
фиксированное значение гарантирует, что одна и та же последовательность случайных чисел генерируется при каждом запуске кода. И если в процессе не присутствует какая-то другая случайность, полученные результаты будут такими же, как и всегда. Это помогает в проверке вывода.
Когда random_state установлен в целое число, train_test_split будет возвращать одинаковые результаты для каждого выполнения.
когда для random_state установлено значение None, train_test_split будет возвращать разные результаты для каждого выполнения.
см. пример ниже:
from sklearn.model_selection import train_test_split
X_data = range(10)
y_data = range(10)
for i in range(5):
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3,random_state = 0) # zero or any other integer
print(y_test)
print("*"*30)
for i in range(5):
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size = 0.3,random_state = None)
print(y_test)
Выход:
[2, 8, 4]
[2, 8, 4]
[2, 8, 4]
[2, 8, 4]
[2, 8, 4]
[4, 7, 6]
[4, 3, 7]
[8, 1, 4]
[9, 5, 8]
[6, 4, 5]
Если вы не упоминаете random_state в коде, то всякий раз, когда вы выполняете свой код, генерируется новое случайное значение, и наборы данных train и test каждый раз будут иметь разные значения.
Однако, если вы используете конкретное значение для random_state(random_state = 1 или любое другое значение) каждый раз, когда результат будет одинаковым, то есть одинаковыми значениями в наборах данных train и test.
Random_state разбивает случайно выбранные данные, но с изюминкой. И поворот в том, что порядок данных будет одинаковым для определенного значения random_state. Вы должны понимать, что это не булевое значение. начиная с 0 до любого целого числа no, если вы передадите как random_state, это будет постоянный заказ для него. Пример: заказ, который вы получите в random_state=0
остаются такими же. После этого, если вы выполните random_state=5
и снова вернуться к random_state=0
вы получите тот же заказ. И, как 0 для всех целое число будет идти так же. Тем не мение random_state=None
расщепляется случайным образом каждый раз.
Если все еще есть сомнения, посмотрите это
Random _state по умолчанию - None, что означает, что каждый раз, когда вы запускаете свою программу, вы будете получать разные выходные данные, потому что разделение между поездом и тестом варьируется в пределах.
random_state = любое значение int означает, что каждый раз, когда вы запускаете свою программу, вы будете получать один и тот же результат, потому что разделение между поездом и тестом не меняется в пределах.
Если вы не укажете random_state в своем коде, то каждый раз, когда вы запускаете (выполняете) свой код, генерируется новое случайное значение, и наборы данных для обучения и тестирования будут каждый раз иметь разные значения.
Однако, если фиксированное значение присваивается, например, random_state = 0, 1 или 42, то независимо от того, сколько раз вы выполняете свой код, результат будет одним и тем же. Т.е. одинаковые значения в наборах данных для обучения и тестирования.
Random_state - это целое число, которое подразумевает выбор случайной комбинации поезда и теста. Когда вы устанавливаете test_size как 1/4, создается набор перестановок и комбинаций train и test, и каждая комбинация имеет одно состояние. Предположим, у вас есть набор данных ---> [1,2,3,4]
Train | Test | State
[1,2,3] [4] **0**
[1,3,4] [2] **1**
[4,2,3] [1] **2**
[2,4,1] [3] **3**
Нам это нужно, потому что при настройке параметров модели одно и то же состояние будет рассматриваться снова и снова. Чтобы не было никаких выводов о точности.
Но в случае случайного леса тоже есть похожая история, но по-другому относительно переменных.
Мы использовали параметр random_state для воспроизводимости начального перемешивания наборов обучающих данных после каждой эпохи.
Для многократного выполнения нашей модели случайное состояние гарантирует, что значения данных будут одинаковыми для наборов данных обучения и тестирования. Исправляет порядок данных для train_test_split
Допустим, в нашем наборе данных есть одна функция и 10 точек данных. X=[0,1,2,3,4,5,6,7,8,9] и, допустим, 0,3 (30% - набор тестов) указано как процент тестовых данных, тогда у нас будет 10C3=120 различных комбинаций. данных. [См. изображение в ссылке для табличного объяснения]: https://stackru.com/images/0ddafeb907616a7e2c5c31c59d7cd18fffc4ba03.png
На основе указанного случайного числа система выберет случайное состояние и назначит данные для обучения и тестирования.
В дополнение к тому, что уже было сказано, разные значения случайного состояния могут давать разные результаты на этапе обучения.
Внутри функция train_test_split() использует начальное число, которое позволяет псевдослучайным образом разделить данные на две группы: обучающий и тестовый наборы.
Число является псевдослучайным, поскольку одно и то же подразделение данных соответствует одному и тому же начальному значению. Этот аспект очень полезен для обеспечения воспроизводимости экспериментов.
К сожалению, использование одного начального числа вместо другого может привести к совершенно другим наборам данных и даже изменить производительность выбранной модели машинного обучения, которая получает обучающий набор в качестве входных данных.
Вы можете прочитать следующую статью, чтобы углубить этот аспект:https://towardsdatascience.com/why-you-should-not-trust-the-train-test-split-function-47cb9d353ad2
В статье также показан практический пример.
Вы также можете найти другие соображения в этой статье:https://towardsdatascience.com/is-a-small-dataset-risky-b664b8569a21