Гайд · TNWS AI

Почему MLPClassifier показывает ConvergenceWarning и как это проверить

4 мин—

Воспроизводимый ConvergenceWarning у MLPClassifier: слишком малый max_iter, контроль n_iter_, масштабирование и проверка исправления без замалчивания предупреждения.

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

Актуальный запрос: «почему MLPClassifier maximum iterations reached ConvergenceWarning». Воспроизвести и диагностировать предупреждение о достижении лимита итераций. Оно означает, что выбранный solver не выполнил критерий остановки до max_iter; это не автоматически означает плохой прогноз и не доказывает сходимость после простого увеличения лимита. Сначала проверяются масштаб признаков, кривая loss, learning rate, solver и качество на независимой выборке.

Материал относится к scikit-learn 1.8.0 и табличным числовым данным. MLPClassifier — полносвязный многослойный перцептрон для обучения с учителем, а не готовая языковая или vision-модель. Все вычисления ниже выполняются локально на синтетическом наборе make_classification: интернет, ключи API и внешние персональные данные не нужны. Значения метрик в рабочем проекте будут другими, поэтому фиксированные пороги примера являются проверкой кода, а не обещанием качества.

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

  1. Создайте Pipeline со StandardScaler.
  2. Поставьте заведомо малый max_iter=1 и перехватите ConvergenceWarning.
  3. Убедитесь, что n_iter_ равен лимиту.
  4. Обучите разумную конфигурацию и проверьте отсутствие этого предупреждения и качество.

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

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split

X, y = make_classification(
    n_samples=500, n_features=8, n_informative=6, n_redundant=0,
    class_sep=1.4, random_state=42
)
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, stratify=y, random_state=42
)
import warnings
from sklearn.exceptions import ConvergenceWarning
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier

bad = make_pipeline(StandardScaler(), MLPClassifier(max_iter=1, random_state=42))
with warnings.catch_warnings(record=True) as seen:
    warnings.simplefilter("always")
    bad.fit(X_train, y_train)
assert any(issubclass(w.category, ConvergenceWarning) for w in seen)
assert bad[-1].n_iter_ == 1

good = make_pipeline(StandardScaler(), MLPClassifier(
    hidden_layer_sizes=(12,), solver="lbfgs", max_iter=500, random_state=42
))
with warnings.catch_warnings(record=True) as seen:
    warnings.simplefilter("always")
    good.fit(X_train, y_train)
assert not any(issubclass(w.category, ConvergenceWarning) for w in seen)
assert good.score(X_test, y_test) > 0.80

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

Первая модель ограничена одной итерацией: ожидаются ConvergenceWarning и n_iter_=1. Вторая использует масштабирование и lbfgs с достаточной верхней границей; на этом фиксированном наборе предупреждение отсутствует, accuracy выше 0,80.

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

Перехватывайте конкретную категорию, а не все warnings. Сравните начальный и конечный loss, test metric и время. Для рабочих данных повторите на нескольких разбиениях. Если предупреждение остаётся, не подавляйте его глобально.

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

Заменяя синтетические данные рабочими, сначала составьте контракт: одна строка соответствует одному объекту, столбцы имеют стабильный порядок и единицы измерения, target формируется без информации из будущего. Категориальные поля кодируются отдельным преобразованием, пропуски обрабатываются до StandardScaler совместимым способом. Объединяйте preprocessing и estimator в Pipeline или ColumnTransformer, чтобы одинаковая логика применялась при fit, validation и predict. Версионируйте список признаков, код подготовки, разбиение и сам estimator как единый выпуск.

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

  1. Train, validation и test не пересекаются, а random_state и алгоритм разбиения записаны.
  2. Preprocessing обучается только на train и входит в сохраняемый Pipeline.
  3. Форма, dtype и порядок признаков проверяются до predict.
  4. Метрика считается на независимой выборке и сопровождается support.
  5. Повторный запуск в закреплённом окружении воспроизводит контрольные predictions.
  6. Негативный тест с лишним или отсутствующим признаком завершается явной ошибкой, а не молчаливой перестановкой.

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

Сохраните маленький обезличенный regression-набор и ожидаемые классы либо вероятности. После изменения параметров сравнивайте не только одну итоговую метрику, но и confusion matrix, время обучения, число итераций и распределение вероятностей. Меняйте один фактор за эксперимент. Гиперпараметры выбирайте на validation или внутри кросс-валидации; test открывайте только для финальной оценки выбранной процедуры. Если обучающих данных мало, публикуйте разброс по нескольким разбиениям, а не лучший результат.

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

Если качество резко изменилось, проверяйте по порядку: набор и target, индексы split, порядок столбцов, статистики preprocessing, версии зависимостей, random_state и только затем внутренние параметры нейросети. Убедитесь, что признаки не содержат идентификатор ответа или данные из будущего. При расхождении после загрузки сравните predictions на одном сохранённом массиве, classes_, число входных признаков и параметры scaler. Не лечите неизвестную причину увеличением сети: это усложняет диагностику и часто усиливает переобучение.

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

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

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

  • Не отключайте warnings, не выяснив причину.
  • Не увеличивайте max_iter бесконечно без контроля loss и validation.
  • Не сравнивайте solver одновременно с изменённой архитектурой и данными.

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

FAQ

Это фатальная ошибка?

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

Всегда ли помогает больше max_iter?

Нет, важны масштаб, solver и параметры обучения.

Можно ли скрыть warning?

Технически да, но сначала его нужно диагностировать и тестировать.

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

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

Это фатальная ошибка?

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

Всегда ли помогает больше max_iter?

Нет, важны масштаб, solver и параметры обучения.

Можно ли скрыть warning?

Технически да, но сначала его нужно диагностировать и тестировать.

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

Комментарии

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