Параметры модели изменили, прогноз остался: нужен новый fit

В конфигурации увеличили регуляризацию, вызвали set_params и заново сохранили estimator. В манифесте уже новое alpha, а коэффициенты остались от старого обучения. set_params меняет настройки; он не запускает оптимизатор.

Разделить конфигурацию и найденное состояние

У Ridge параметр alpha определяет силу регуляризации. После fit коэффициенты находятся в coef_. Метод set_params обновляет значение alpha в настройках, но уже вычисленный массив coef_ не пересчитывает. Поэтому predict продолжает использовать старое состояние. Успешное сохранение объекта не обнаруживает этого рассогласования.

Перед выпуском новой конфигурации создайте независимый estimator, примените настройки и выполните fit на закреплённом наборе. Это особенно важно в скриптах, где один объект живёт между запусками ячеек. Переменная с новым именем может всё ещё ссылаться на старый обученный объект.

Воспроизвести ложное обновление и правильное обучение

В примере прямая зависимость y=2x даёт исходный прогноз около восьми для x=4. После set_params(alpha=100) коэффициенты и прогноз не меняются. Затем clone создаёт необученную конфигурацию с тем же alpha, и новый fit действительно пересчитывает коэффициенты.

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

from math import isclose
from sklearn.base import clone
from sklearn.linear_model import Ridge

X, y = [[0], [1], [2], [3]], [0, 2, 4, 6]
current = Ridge(alpha=0).fit(X, y)
before = float(current.predict([[4]])[0])
old_coef = current.coef_.tolist()
current.set_params(alpha=100)
assert current.get_params()["alpha"] == 100
assert current.coef_.tolist() == old_coef
assert isclose(float(current.predict([[4]])[0]), before)

candidate = clone(current).fit(X, y)
after = float(candidate.predict([[4]])[0])
assert candidate.get_params()["alpha"] == 100
assert candidate.coef_.tolist() != old_coef
assert after < before
assert candidate is not current
print("before refit:", before, "after refit:", after)

Связать артефакт с завершённым запуском

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

Проверка нескольких контрольных прогнозов полезна, но не всегда обнаружит пропущенный fit: две конфигурации могут дать близкие ответы. Надёжнее организовать код так, чтобы сохранить модель можно было только из результата законченной обучающей функции. Тогда изменение файла конфигурации не станет само по себе выпуском нового артефакта.

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

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

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