Что такое случайное семя в машинном обучении Azure? - PullRequest
0 голосов
/ 02 июля 2019

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

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

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


Вопросы

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

Pretext

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

ML Studio Snap


Наблюдения

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

Random-seed-321

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

Random-seed-123

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

Random-seed-12345

Ответы [ 2 ]

1 голос
/ 02 июля 2019

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

Не буду вдаваться в подробности относительно того, что такое случайное семя в целом; Есть простой материал, доступный с помощью простого поиска в Интернете (см., например, эту ветку 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 матриц путаницы (в небольших выборках , проценты могут быть вводящими в заблуждение ), вы сможете убедить себя в том, что различия не настолько велики, и их можно обоснованно обосновать случайным элементом, присущим всей процедуре (здесь точное разделение набора данных на обучение и тестирование).

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

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

1 голос
/ 02 июля 2019

Начальное число используется для инициализации генератора псевдослучайных чисел в 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
...