Гайд · TNWS AI

Как продолжить обучение MLPRegressor через warm_start

4 мин—

Проверка warm_start без переинициализации весов: два fit, изменение coefs_, loss до и после, границы метода и отличие от partial_fit.

Задача и применимость

Актуальный запрос: «как продолжить обучение MLPRegressor warm_start». Продолжить оптимизацию тем же estimator при повторном fit, сохранив предыдущие веса. При warm_start=True решение прошлого fit используется как начальная точка. Это удобно для контролируемого продолжения на совместимых данных, но не заменяет систему онлайн-обучения, версионирование и проверку drift. Смена числа входов или архитектуры несовместима с прежними весами.

Материал применим к scikit-learn 1.8.0 и числовой регрессии на табличных данных. MLPRegressor — полносвязный многослойный перцептрон, который предсказывает непрерывные значения; это не классификатор и не генеративная модель. Пример использует синтетические данные, чтобы результат можно было повторить без внешних файлов, ключей и персональных сведений. Порог теста подтверждает именно код примера и не является обещанием для рабочего набора. Перед запуском убедитесь, что используется указанная версия API и отдельное воспроизводимое окружение с закреплёнными зависимостями.

Пошаговое решение

  1. Обучите scaler один раз на train и преобразуйте признаки.
  2. Создайте MLPRegressor с warm_start и небольшим max_iter.
  3. Сохраните веса и loss после первого fit.
  4. Повторите fit тем же объектом и подтвердите изменение весов и loss.

Готовый проверяемый шаблон

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split

X, y = make_regression(n_samples=600, n_features=8, n_informative=6,
                       noise=5.0, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, random_state=42
)
import warnings, numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.exceptions import ConvergenceWarning

scaler=StandardScaler().fit(X_train); Xt=scaler.transform(X_train)
model=MLPRegressor(hidden_layer_sizes=(24,),solver="adam",learning_rate_init=.01,max_iter=30,warm_start=True,random_state=42)
with warnings.catch_warnings():
    warnings.simplefilter("ignore",ConvergenceWarning); model.fit(Xt,y_train)
first=[w.copy() for w in model.coefs_]; loss1=model.loss_
with warnings.catch_warnings():
    warnings.simplefilter("ignore",ConvergenceWarning); model.fit(Xt,y_train)
loss2=model.loss_
assert any(not np.array_equal(a,b) for a,b in zip(first,model.coefs_))
assert loss2 < loss1
assert model.score(scaler.transform(X_test),y_test)>.85
print(round(loss1,2),round(loss2,2))

Вход и ожидаемый результат

Один estimator дважды получает одинаковый train. После второго fit хотя бы одна матрица весов отличается, loss уменьшается, а test R² превышает 0,85. Предупреждение малого max_iter подавляется только в локальном проверяемом блоке.

Как проверить результат

Сравните копии весов, loss и независимую метрику. Храните checkpoint до продолжения, чтобы откатиться. Если данные или preprocessing изменились, warm start требует отдельного экспериментального обоснования.

Перенос на рабочую нейросеть

Перед заменой синтетики опишите единицу target, допустимый диапазон и момент времени, на который делается прогноз. Сформируйте признаки так, чтобы ни один столбец не содержал будущую информацию. Все преобразования X объединяйте с estimator в Pipeline, а преобразование y — в явно проверяемую обёртку. Зафиксируйте имена и порядок колонок, обработку пропусков, категории и версии данных. Разделяйте строки с учётом времени или групп, если обычный случайный split смешивает связанные наблюдения.

Критерии приёмки

  1. Train и test не пересекаются, индексы разбиения сохранены.
  2. Preprocessing обучается только на train.
  3. Prediction имеет ожидаемую форму, исходные единицы и только конечные значения.
  4. Модель превосходит заранее выбранный простой baseline.
  5. MAE или RMSE проверяется вместе с R² и хвостовой ошибкой.
  6. Повторный запуск в закреплённом окружении воспроизводит контрольный массив predictions.

Регрессионный протокол

Сохраните небольшой обезличенный набор X, y и ожидаемые predictions с численным допуском. После изменения данных или параметров сравните метрики, квантили residuals, число итераций, время fit и latency predict. Гиперпараметры выбирайте на validation либо внутри кросс-валидации; test используйте один раз для оценки окончательной процедуры. Не принимайте выпуск по лучшему случайному split: при небольшом наборе сообщайте разброс нескольких повторов.

Диагностика расхождений

При резком изменении результата проверяйте по порядку: версию набора, target, split, порядок и dtype столбцов, статистики scaler, версии NumPy/SciPy/scikit-learn, random_state, затем optimizer и архитектуру. Сравните одну сохранённую строку до и после preprocessing и prediction двух выпусков. Не увеличивайте сеть до выяснения причины: дополнительная ёмкость может скрыть утечку или усилить переобучение.

Контроль после внедрения

В эксплуатации журналируйте версию модели, схему и агрегированные показатели без исходных персональных признаков. Установите пределы для latency, доли невалидных входов и ошибок на отложенной разметке. Контролируйте drift признаков и residuals. При нарушении порога переключайтесь на предыдущий проверенный артефакт; автоматическое дообучение без независимой проверки не считается безопасным восстановлением.

Границы применимости

Отдельно проверьте область применимости. Интерполяция внутри знакомого диапазона признаков и прогноз для новых условий — разные режимы риска. Зафиксируйте минимумы, максимумы и долю входов вне train-диапазона. Не обрезайте такие значения молча: либо отклоняйте запрос по явному правилу, либо отмечайте низкую надёжность. Для денежных, медицинских и иных критичных величин задайте предметные ограничения результата после консультации с владельцем процесса, а не извлекайте их из случайного синтетического примера.

Типичные ошибки и чего не делать

  • Не создавайте новый estimator перед вторым fit.
  • Не меняйте архитектуру или число признаков между вызовами.
  • Не принимайте падение training loss за гарантированное улучшение test.

Не выбирайте конфигурацию по test и не публикуйте одну выгодную метрику без baseline и размера выборки. Не используйте чувствительные признаки без необходимости и правового основания. Для решений с материальными последствиями предусмотрите человеческую проверку, мониторинг и безопасный отказ.

FAQ

Сохраняются ли веса?

Да, у того же estimator при warm_start=True.

Чем отличается от partial_fit?

Повторный fit запускает обычную процедуру обучения с указанным max_iter, используя старые веса.

Можно ли продолжать на другой схеме X?

Нет, входной контракт и архитектура должны быть совместимы.

Официальные источники

Частые вопросы

Сохраняются ли веса?

Да, у того же estimator при warm_start=True.

Чем отличается от partial_fit?

Повторный fit запускает обычную процедуру обучения с указанным max_iter, используя старые веса.

Можно ли продолжать на другой схеме X?

Нет, входной контракт и архитектура должны быть совместимы.

Читайте также

Комментарии

Пока тихо. Скажите первое слово