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