Гайд · TNWS AI

Как сделать multi-output регрессию через MLPRegressor

4 мин—

Два непрерывных target в MLPRegressor: форма y `(n,2)`, output `(n,2)`, n_outputs_, последняя матрица весов и MAE по каждому выходу.

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

Актуальный запрос: «как MLPRegressor предсказывает несколько target multi output». Предсказывать два связанных непрерывных показателя одной сетью. Для multi-output y передаётся двумерным массивом (n_samples, n_outputs). Последний слой имеет по одному выходному нейрону на target. Метрики нужно смотреть и агрегировано, и отдельно по столбцам, иначе слабое качество одного выхода скроется средним.

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

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

  1. Создайте два target из общей матрицы признаков.
  2. Разделите X и двумерный y одним вызовом.
  3. Обучите Pipeline с MLPRegressor.
  4. Проверьте форму predictions, n_outputs_ и MAE каждого столбца.

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

import numpy as np
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor
from sklearn.metrics import mean_absolute_error

X, y = make_regression(n_samples=600,n_features=8,n_informative=6,n_targets=2,noise=4,random_state=42)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=.25,random_state=42)
model=make_pipeline(StandardScaler(),MLPRegressor(hidden_layer_sizes=(8,),solver="lbfgs",max_iter=2000,random_state=42))
model.fit(X_train,y_train); pred=model.predict(X_test); mlp=model[-1]
mae=mean_absolute_error(y_test,pred,multioutput="raw_values")
assert pred.shape==(150,2)
assert mlp.n_outputs_==2 and mlp.coefs_[-1].shape[1]==2
assert (mae<20).all()
print(pred.shape, [round(float(x),2) for x in mae])

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

На входе 600 строк и два target. После split prediction имеет форму (150,2), n_outputs_=2, а последняя матрица весов содержит два столбца. MAE возвращается массивом из двух значений.

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

Назовите и версионируйте порядок target-столбцов. Рассчитайте raw_values и рабочие пороги для каждого выхода. Проверьте единицы: усреднять рубли и секунды без осмысленной нормировки нельзя.

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

Перед заменой синтетики опишите единицу 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-диапазона. Не обрезайте такие значения молча: либо отклоняйте запрос по явному правилу, либо отмечайте низкую надёжность. Для денежных, медицинских и иных критичных величин задайте предметные ограничения результата после консультации с владельцем процесса, а не извлекайте их из случайного синтетического примера.

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

  • Не передавайте два target как случайно сплющенный вектор.
  • Не меняйте порядок target между fit и интерпретацией.
  • Не скрывайте слабый выход одним uniform_average.

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

FAQ

Какой shape нужен y?

(n_samples, n_outputs) для нескольких targets.

Что возвращает predict?

Массив той же второй размерности outputs.

Где видно число выходов?

В обученном атрибуте n_outputs_.

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

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

Какой shape нужен y?

`(n_samples, n_outputs)` для нескольких targets.

Что возвращает predict?

Массив той же второй размерности outputs.

Где видно число выходов?

В обученном атрибуте `n_outputs_`.

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

Комментарии

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