random_state в scikit-learn: повторяем один запуск обучения

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

Зафиксировать все части конкретного запуска

Случайный лес выбирает обучающие подвыборки и случайные варианты признаков. Целое число random_state позволяет воспроизвести этот выбор при повторном fit в одинаковых условиях. Важно сохранить и порядок строк: одинаковый индекс случайной выборки при другом порядке означает другой объект.

Передача изменяемого генератора случайных чисел имеет другую семантику: его состояние расходуется. Для простого повторения конкретного запуска удобнее записать целое число и использовать его при создании независимых estimator. Если случайность есть и в разделении данных, её источник фиксируют отдельно.

Сравнить структуру, а не только несколько ответов

Две разные модели иногда возвращают одинаковые классы на маленьком входе. Поэтому пример сравнивает также случайные состояния деревьев и сохранённые пороги разбиений. Это подтверждает воспроизводимость построения на данном наборе. Проверка не требует ожидать, что другой seed обязательно изменит каждый прогноз.

Используется встроенный iris: вход не скачивается, порядок фиксирован библиотекой. n_jobs=1 убирает лишний уровень параллельного исполнения из учебной проверки. Число деревьев небольшое, поскольку здесь нужен воспроизводимый механизм, а не подбор качества.

from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier

X, y = load_iris(return_X_y=True)
params = dict(n_estimators=12, max_depth=3, random_state=17, n_jobs=1)
first = RandomForestClassifier(**params).fit(X, y)
second = RandomForestClassifier(**params).fit(X, y)
def signature(model):
    return [(tree.random_state, tree.tree_.feature.tolist(),
             tree.tree_.threshold.tolist()) for tree in model.estimators_]
assert signature(first) == signature(second)
assert first.predict(X).tolist() == second.predict(X).tolist()
print("repeated trees:", len(first.estimators_))

Seed не заменяет описание эксперимента

Сохраните параметры, версии Python и scikit-learn, идентификатор данных и обучающий код. Новая версия библиотеки или другая численная среда может изменить результат. Для передачи уже найденной модели сохраняйте сам обученный объект; повторение обучения — отдельная процедура, а не единственный способ восстановить прогноз.

При исследовании устойчивости, наоборот, нужны разные независимые seed. Сначала обеспечьте повторяемость одного запуска, затем запустите заранее выбранный набор состояний. Не выбирайте удобный seed по результату контрольной выборки: воспроизводимость объясняет происхождение результата, но не делает удачный случай представительным.

Закрепить базовую операцию

В первом открытом уроке fit и predict можно пройти полный запуск на небольших данных. Добавьте явные настройки и повторите его на двух отдельных объектах. Откройте урок «Первый fit и predict на своих данных». Затем вернитесь к сценарию статьи и проверьте его на своём небольшом наборе. Посмотрите программу курса первой ML-модели, чтобы пройти путь от обучения к использованию результата.

Продолжить на практике