Гайд · TNWS AI
Как обучать MLPClassifier пакетами через partial_fit
Потоковое обучение MLPClassifier мини-пакетами: первый classes, Incremental StandardScaler, несколько эпох, контроль n_iter_ и accuracy.
Задача и применимость
Актуальный запрос: «как обучать MLPClassifier частями partial_fit online learning». Обновлять MLPClassifier по мини-пакетам, когда весь набор нельзя обработать одним fit. partial_fit выполняет одну итерацию по переданным данным; при первом вызове для classifier нужно передать полный набор возможных классов. StandardScaler тоже поддерживает partial_fit, но его статистики должны обновляться аккуратно. Простой учебный протокол сначала обучает scaler последовательными пакетами, затем несколько раз проходит моделью по преобразованным пакетам.
Материал относится к scikit-learn 1.8.0 и табличным числовым данным. MLPClassifier — полносвязный многослойный перцептрон для обучения с учителем, а не готовая языковая или vision-модель. Все вычисления ниже выполняются локально на синтетическом наборе make_classification: интернет, ключи API и внешние персональные данные не нужны. Значения метрик в рабочем проекте будут другими, поэтому фиксированные пороги примера являются проверкой кода, а не обещанием качества.
Пошаговое решение
- Разделите train на стабильные мини-пакеты.
- Обновите StandardScaler.partial_fit на каждом train-пакете.
- В первом MLP partial_fit передайте classes=[0,1].
- Сделайте несколько эпох, не затрагивая test, и измерьте итоговую accuracy.
Готовый проверяемый шаблон
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 numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
batches = np.array_split(np.arange(len(X_train)), 5)
scaler = StandardScaler()
for ids in batches:
scaler.partial_fit(X_train[ids])
model = MLPClassifier(hidden_layer_sizes=(16,), solver="adam", random_state=42)
updates = 0
for epoch in range(20):
for number, ids in enumerate(batches):
kwargs = {"classes": np.array([0, 1])} if epoch == 0 and number == 0 else {}
model.partial_fit(scaler.transform(X_train[ids]), y_train[ids], **kwargs)
updates += 1
score = model.score(scaler.transform(X_test), y_test)
assert updates == 100
assert model.t_ == len(X_train) * 20
assert model.n_iter_ == 1
assert score > 0.75
print(updates, model.t_, round(score, 3))
Вход и ожидаемый результат
375 train-строк делятся на пять пакетов и проходят 20 эпох: ожидаются 100 вызовов partial_fit и накопительный счётчик t_=7500. Атрибут n_iter_ после partial_fit равен одной итерации последнего вызова, поэтому суммарное число обновлений считается отдельно. Полный список классов передан только на первом вызове. Test используется один раз после завершения обучения.
Как проверить результат
Считайте число вызовов самостоятельно и сверяйте накопительный t_, фиксируйте порядок пакетов и контролируйте drift. В реальном потоке заморозьте preprocessing или формально опишите его обновление: меняющийся scaler меняет представление старых и новых данных.
Перенос на рабочую нейросеть
Заменяя синтетические данные рабочими, сначала составьте контракт: одна строка соответствует одному объекту, столбцы имеют стабильный порядок и единицы измерения, target формируется без информации из будущего. Категориальные поля кодируются отдельным преобразованием, пропуски обрабатываются до StandardScaler совместимым способом. Объединяйте preprocessing и estimator в Pipeline или ColumnTransformer, чтобы одинаковая логика применялась при fit, validation и predict. Версионируйте список признаков, код подготовки, разбиение и сам estimator как единый выпуск.
Критерии приёмки
- Train, validation и test не пересекаются, а random_state и алгоритм разбиения записаны.
- Preprocessing обучается только на train и входит в сохраняемый Pipeline.
- Форма, dtype и порядок признаков проверяются до predict.
- Метрика считается на независимой выборке и сопровождается support.
- Повторный запуск в закреплённом окружении воспроизводит контрольные predictions.
- Негативный тест с лишним или отсутствующим признаком завершается явной ошибкой, а не молчаливой перестановкой.
Регрессионный протокол
Сохраните маленький обезличенный regression-набор и ожидаемые классы либо вероятности. После изменения параметров сравнивайте не только одну итоговую метрику, но и confusion matrix, время обучения, число итераций и распределение вероятностей. Меняйте один фактор за эксперимент. Гиперпараметры выбирайте на validation или внутри кросс-валидации; test открывайте только для финальной оценки выбранной процедуры. Если обучающих данных мало, публикуйте разброс по нескольким разбиениям, а не лучший результат.
Диагностика расхождений
Если качество резко изменилось, проверяйте по порядку: набор и target, индексы split, порядок столбцов, статистики preprocessing, версии зависимостей, random_state и только затем внутренние параметры нейросети. Убедитесь, что признаки не содержат идентификатор ответа или данные из будущего. При расхождении после загрузки сравните predictions на одном сохранённом массиве, classes_, число входных признаков и параметры scaler. Не лечите неизвестную причину увеличением сети: это усложняет диагностику и часто усиливает переобучение.
Контроль после внедрения
Для эксплуатации добавьте журнал версии модели и схемы входа, но не записывайте в него исходные персональные признаки. До выкладки задайте допустимые границы latency, доли ошибок и целевой метрики. После выкладки сравнивайте распределения признаков и прогнозов с контрольным периодом. Если входная схема изменилась или качество вышло за порог, переключайтесь на предыдущий проверенный артефакт; автоматическое дообучение без независимой оценки не является безопасным исправлением.
Типичные ошибки и чего не делать
- Не забывайте classes при первом вызове.
- Не вызывайте fit между partial_fit: он переинициализирует обучение.
- Не обновляйте scaler тестовыми или будущими данными.
Не подбирайте архитектуру и пороги по тестовой выборке. Не передавайте в модель персональные или чувствительные поля без правового основания и необходимости. Не считайте высокую метрику на синтетическом примере доказательством готовности к эксплуатации. Для важных решений добавьте человеческую проверку, мониторинг drift и безопасный сценарий отказа.
FAQ
Сколько эпох делает partial_fit?
Один вызов выполняет одну итерацию по переданному пакету.
Зачем classes в первый раз?
Чтобы classifier заранее знал полный набор классов.
Подходит ли lbfgs?
partial_fit доступен только для стохастических solver.
Официальные источники
Частые вопросы
Сколько эпох делает partial_fit?
Один вызов выполняет одну итерацию по переданному пакету.
Зачем classes в первый раз?
Чтобы classifier заранее знал полный набор классов.
Подходит ли lbfgs?
partial_fit доступен только для стохастических solver.
Читайте также
Как обучить MLPClassifier со StandardScaler без утечки данных
Проверяемый Pipeline из StandardScaler и MLPClassifier: раздельная выборка, обучение scaler только на train, accuracy и защита от утечки.
Как оценить MLPClassifier через classification report и confusion matrix
Оценка нейросети не одной accuracy: classification_report как dict, confusion_matrix, support, macro F1 и точные критерии проверки.
Как оценить важность признаков MLP через permutation importance
Permutation importance для Pipeline с MLPClassifier: baseline на test, перестановки столбцов, mean/std, воспроизводимость и ограничения интерпретации.
Комментарии
Пока тихо. Скажите первое слово