Гайд · TNWS AI

Как проверить остатки MLPRegressor по квантилям

4 мин—

Residual analysis без графика: среднее, медиана, квантили абсолютной ошибки, худшие строки и проверка смещения прогноза.

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

Актуальный запрос: «как анализировать residuals остатки MLPRegressor». Проверить структуру ошибок, которую скрывает средняя метрика. Остаток задаётся явно как y_true - y_pred: положительное значение означает недооценку target. Среднее остатка помогает заметить систематическое смещение, а квантили абсолютной ошибки показывают типичный и хвостовой масштаб. Худшие строки изучаются по идентификаторам test, а не возвращаются в обучение.

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

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

  1. Обучите модель и сохраните predictions test.
  2. Вычислите residuals и absolute residuals.
  3. Получите median, p90 и p95.
  4. Найдите индексы пяти крупнейших ошибок и проверьте исходные данные отдельно.

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

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 numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPRegressor

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)
residuals = y_test - pred
absolute = np.abs(residuals)
q50, q90, q95 = np.quantile(absolute, [.5, .9, .95])
worst = np.argsort(absolute)[-5:][::-1]
assert q50 <= q90 <= q95
assert len(set(worst.tolist())) == 5
assert np.isfinite(residuals).all()
print(round(residuals.mean(),2), [round(x,2) for x in (q50,q90,q95)], worst.tolist())

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

Результат содержит средний signed residual, медиану, p90 и p95 абсолютной ошибки, а также пять позиций test с максимальной ошибкой. Квантили обязаны возрастать. Конкретные значения не переносятся на другие данные.

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

Зафиксируйте знак residual в отчёте, иначе недооценку легко перепутать с переоценкой. Разбейте ошибки по важным рабочим сегментам, но не публикуйте группы с персональными данными. Проверяйте хвост наряду со средним.

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

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

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

  • Не меняйте определение знака между отчётами.
  • Не удаляйте худшие строки автоматически как выбросы.
  • Не дообучайте модель на test после анализа ошибок.

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

FAQ

Что такое residual?

Разность истинного и предсказанного значения по принятому здесь определению.

Зачем p95?

Чтобы оценить хвост больших ошибок.

Нулевая средняя гарантирует хорошую модель?

Нет, положительные и отрицательные ошибки могут компенсироваться.

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

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

Что такое residual?

Разность истинного и предсказанного значения по принятому здесь определению.

Зачем p95?

Чтобы оценить хвост больших ошибок.

Нулевая средняя гарантирует хорошую модель?

Нет, положительные и отрицательные ошибки могут компенсироваться.

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

Комментарии

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