Случайное состояние 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

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