Что такое случайное семя в машинном обучении Azure?

Я изучаю машинное обучение Azure. Я часто сталкиваюсь со Случайным Семенем на некоторых из шагов, таких как,

  1. Разделить данные
  2. Необученные алгоритмы модели как регрессия двух классов, регрессия нескольких классов, дерево, лес,..

В этом уроке они выбирают "Случайное семя" как "123"; обученная модель имеет высокую точность, но когда я пытаюсь выбрать другие случайные целые числа, такие как 245, 256, 12, 321,... это не сработало.


Вопросов

  • Что такое случайное целое число?
  • Как тщательно выбрать случайное семя из диапазона целых значений? Какой ключ или стратегия, чтобы выбрать его?
  • Почему Random Seed существенно влияет на оценку, прогнозирование и качество ML обученной модели?

отговорка

  1. У меня есть Iris-Sepal-Petal-Dataset с Sepal (длина и ширина) и Petal (длина и ширина)
  2. Последним столбцом в наборе данных является 'Binomial ClassName'
  3. Я тренирую набор данных с помощью Multiclass Decision Forest Algorithm и делю данные на разные случайные начальные числа 321, 123 и 12345, чтобы
  4. Это влияет на конечное качество обучаемой модели. Случайное начальное число 123 является лучшим из оценки вероятности прогноза: 1.


наблюдения

1. Случайное семя: 321

2. Случайное семя: 123

3. Случайное семя: 12345

2 ответа

Решение

Что такое случайное целое число?

Не буду вдаваться в подробности относительно того, что такое случайное семя в целом; есть простой материал, доступный простым поиском в сети (см., например, эту ветку SO).

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

Как тщательно выбрать случайное семя из диапазона целых значений? Какой ключ или стратегия, чтобы выбрать его?

Возможно, на это уже неявно ответили выше: вы просто не должны выбирать какое-то конкретное случайное начальное число, и ваши результаты должны быть примерно одинаковыми для разных случайных начальных чисел.

Почему Random Seed существенно влияет на оценку, прогнозирование и качество ML обученной модели?

Теперь к сути вашего вопроса. Ответ здесь (то есть с набором данных радужной оболочки) является эффектами малой выборки...

Начнем с того, что ваши зарегистрированные результаты по разным случайным семенам не так уж различны. Тем не менее, я согласен, что, на первый взгляд, разница в макро-средней точности 0,9 и 0,94 может показаться большой; но при более внимательном рассмотрении выясняется, что разница на самом деле не является проблемой. Почему?

Использование 20% вашего (только) набора данных из 150 выборок оставляет вам только 30 выборок в наборе тестов (где проводится оценка); это стратифицировано, т.е. около 10 образцов из каждого класса. Теперь для наборов данных такого небольшого размера нетрудно представить, что разница в правильной классификации только 1-2 выборок может иметь это очевидное различие в сообщаемых показателях производительности.

Попробуем проверить это в scikit-learn с использованием классификатора дерева решений (суть проблемы не зависит от конкретной структуры или используемого алгоритма ML):

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.model_selection import train_test_split

X, y = load_iris(return_X_y=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=321, stratify=y)
dt = DecisionTreeClassifier()
dt.fit(X_train, y_train)
y_pred = dt.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

Результат:

[[10  0  0]
 [ 0  9  1]
 [ 0  0 10]]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      0.90      0.95        10
           2       0.91      1.00      0.95        10

   micro avg       0.97      0.97      0.97        30
   macro avg       0.97      0.97      0.97        30
weighted avg       0.97      0.97      0.97        30

Давайте повторим код выше, изменив только random_state аргумент в train_test_split; за random_state=123 мы получили:

[[10  0  0]
 [ 0  7  3]
 [ 0  2  8]]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       0.78      0.70      0.74        10
           2       0.73      0.80      0.76        10

   micro avg       0.83      0.83      0.83        30
   macro avg       0.84      0.83      0.83        30
weighted avg       0.84      0.83      0.83        30

в то время как для random_state=12345 мы получили:

[[10  0  0]
 [ 0  8  2]
 [ 0  0 10]]
              precision    recall  f1-score   support

           0       1.00      1.00      1.00        10
           1       1.00      0.80      0.89        10
           2       0.83      1.00      0.91        10

   micro avg       0.93      0.93      0.93        30
   macro avg       0.94      0.93      0.93        30
weighted avg       0.94      0.93      0.93        30

Глядя на абсолютные числа 3 матриц путаницы (в небольших выборках проценты могут вводить в заблуждение), вы сможете убедить себя в том, что различия не так уж велики, и их можно обоснованно обосновать случайным элементом, присущим целому процедура (здесь точное разделение набора данных на обучение и тестирование).

Если ваш набор тестов будет значительно больше, эти расхождения будут практически незначительными...

Последнее уведомление; Я использовал те же самые начальные числа, что и вы, но на самом деле это ничего не значит, так как в общем случае генераторы случайных чисел для разных платформ и языков не одинаковы, поэтому соответствующие начальные числа на самом деле не совместимы. См. Собственный ответ в разделе " Являются ли случайные семена совместимыми между системами? для демонстрации.

Семя используется для инициализации генератора псевдослучайных чисел в Python.

Случайный модуль использует начальное значение в качестве основы для генерации случайного числа. если начальное значение отсутствует, это занимает системное текущее время. если вы передадите случайные данные одно и то же начальное значение, оно даст те же данные. обратитесь к https://pynative.com/python-random-seed/ для получения более подробной информации.

Пример:

import random
random.seed( 30 )
print ("first number  - ", random.randint(25,50))  

random.seed( 30 )
print ("Second number- ", random.randint(25,50))

Output:

first number - 42
Second  number - 42
Другие вопросы по тегам