Гайд · TNWS AI
Как использовать Poisson loss в MLPRegressor для положительного target
Poisson loss в scikit-learn 1.8: строго неотрицательный target, положительный прогноз через exponential link и воспроизводимый негативный тест.
Задача и применимость
Актуальный запрос: «как использовать MLPRegressor loss poisson». Применить loss='poisson' к неотрицательному target и проверить ограничение данными. В scikit-learn этот режим использует внутренний exponential link, поэтому prediction положителен. Он подходит не автоматически для любых чисел: отрицательные значения target недопустимы, а уместность Poisson deviance определяется природой задачи и распределением ошибок.
Материал применим к scikit-learn 1.8.0 и числовой регрессии на табличных данных. MLPRegressor — полносвязный многослойный перцептрон, который предсказывает непрерывные значения; это не классификатор и не генеративная модель. Пример использует синтетические данные, чтобы результат можно было повторить без внешних файлов, ключей и персональных сведений. Порог теста подтверждает именно код примера и не является обещанием для рабочего набора. Перед запуском убедитесь, что используется указанная версия API и отдельное воспроизводимое окружение с закреплёнными зависимостями.
Пошаговое решение
- Создайте строго положительный target из контролируемой зависимости.
- Разделите данные и масштабируйте X в Pipeline.
- Обучите MLPRegressor с loss='poisson'.
- Проверьте положительность predictions и отклонение отрицательного y.
Готовый проверяемый шаблон
import numpy as np
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
rng = np.random.default_rng(42)
X = rng.normal(size=(500, 4))
y = np.exp(0.35 * X[:,0] - 0.2 * X[:,1] + 0.1) + 0.05
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.25, random_state=42)
model = make_pipeline(StandardScaler(), MLPRegressor(
loss="poisson", hidden_layer_sizes=(12,), solver="lbfgs", max_iter=2000, random_state=42
))
model.fit(X_train, y_train); pred = model.predict(X_test)
assert (pred > 0).all() and model.score(X_test, y_test) > 0.90
def validate_poisson_target(values):
if np.any(values < 0):
raise ValueError("Poisson target contains negative values")
try:
validate_poisson_target(y_train - y_train.max() - 1)
raise AssertionError("negative target must fail validation")
except ValueError as exc:
assert "negative" in str(exc).lower()
print(float(pred.min()))
Вход и ожидаемый результат
Target строится экспонентой и всегда выше нуля. После fit все 125 predictions положительны, а R² на фиксированном наборе выше 0,90. Искусственно отрицательный target обязан быть отклонён явным валидатором до вызова fit.
Как проверить результат
Проверяйте минимум y явным валидатором до обучения и минимум prediction после него: не полагайтесь на то, что каждая версия solver обязательно выдаст удобное исключение. Сравните Poisson deviance и бизнес-метрику с squared_error на одинаковом split. Положительный output ещё не доказывает соответствие распределению.
Перенос на рабочую нейросеть
Перед заменой синтетики опишите единицу target, допустимый диапазон и момент времени, на который делается прогноз. Сформируйте признаки так, чтобы ни один столбец не содержал будущую информацию. Все преобразования X объединяйте с estimator в Pipeline, а преобразование y — в явно проверяемую обёртку. Зафиксируйте имена и порядок колонок, обработку пропусков, категории и версии данных. Разделяйте строки с учётом времени или групп, если обычный случайный split смешивает связанные наблюдения.
Критерии приёмки
- Train и test не пересекаются, индексы разбиения сохранены.
- Preprocessing обучается только на train.
- Prediction имеет ожидаемую форму, исходные единицы и только конечные значения.
- Модель превосходит заранее выбранный простой baseline.
- MAE или RMSE проверяется вместе с R² и хвостовой ошибкой.
- Повторный запуск в закреплённом окружении воспроизводит контрольный массив 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 произвольной константой без изменения смысла.
- Не выбирайте Poisson только ради положительного output.
- Не применяйте пороги синтетического примера к реальным счётчикам.
Не выбирайте конфигурацию по test и не публикуйте одну выгодную метрику без baseline и размера выборки. Не используйте чувствительные признаки без необходимости и правового основания. Для решений с материальными последствиями предусмотрите человеческую проверку, мониторинг и безопасный отказ.
FAQ
Можно ли передать отрицательный y?
Нет, Poisson loss требует y >= 0.
Почему prediction положителен?
Используется exponential link для выхода.
Это только для целых counts?
API требует неотрицательный target; статистическую уместность проверяют отдельно.
Официальные источники
Частые вопросы
Можно ли передать отрицательный y?
Нет, Poisson loss требует y >= 0.
Почему prediction положителен?
Используется exponential link для выхода.
Это только для целых counts?
API требует неотрицательный target; статистическую уместность проверяют отдельно.
Читайте также
Как масштабировать target MLPRegressor через TransformedTargetRegressor
StandardScaler для признаков и отдельное преобразование target через TransformedTargetRegressor с автоматическим inverse_transform прогноза.
Как обучать MLPRegressor пакетами через partial_fit
Потоковое обучение регрессионной нейросети: Incremental StandardScaler, пять пакетов, 25 эпох, счётчик обновлений, t_ и независимый test.
Как обучить MLPRegressor со StandardScaler в Pipeline
Полносвязная нейросеть для числового прогноза: честный train/test split, StandardScaler внутри Pipeline, MAE, R² и проверка preprocessing.
Комментарии
Пока тихо. Скажите первое слово