TATECHATLAS
◎ Русский
Математика и модели / Руководство

Оценка многовыходной регрессии в scikit-learn

Узнайте, как использовать параметр multioutput в scikit-learn для получения ошибок по каждой целевой переменной или применения пользовательских весов к прогнозам многовыходной регрессии.

В этом материале

Для оценки модели с несколькими выходными рядами в scikit-learn используйте параметр multioutput в поддерживаемых метриках, таких как mean_absolute_error или r2_score. Установка multioutput='raw_values' возвращает массив, содержащий отдельный показатель для каждого выходного потока, что позволяет проводить детальную диагностику. Чтобы рассчитать единый взвешенный показатель, где определенные выходы являются более критичными, передайте массивоподобный объект весов (например, [0.3, 0.7]) в параметр multioutput. Это заменяет стандартное поведение 'uniform_average', при котором все целевые переменные считаются равнозначными.

Понимание метрик многовыходной регрессии

В многоцелевой регрессии модель одновременно предсказывает несколько непрерывных переменных. Стандартные метрики оценки обычно возвращают одно скалярное значение, которое может скрыть плохую производительность одного конкретного выхода, если остальные работают хорошо. Scikit-learn решает эту проблему, предоставляя механизмы либо для разложения ошибки по каждому выходу, либо для их агрегации с использованием конкретных стратегий взвешивания.

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

При использовании пользовательских весов для многовыходных метрик убедитесь, что сумма весов равна 1.0. Это позволит сохранить исходный масштаб метрики и ее интерпретируемость как средневзвешенного значения.

Использование raw_values для оценки каждого выхода

Опция 'raw_values' необходима для диагностики того, какая именно целевая переменная приводит к снижению производительности модели. Вместо усреднения результатов scikit-learn возвращает массив, где каждый элемент соответствует метрике, рассчитанной для одного выходного столбца.

Это особенно полезно, когда целевые переменные имеют разные масштабы или разные уровни шума, так как это предотвращает доминирование ошибки переменной с большой величиной в общем показателе.

from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); scores = mean_absolute_error(y_true, y_pred, multioutput='raw_values'); print(scores) # Illustrative output: [0.5, 1. ]

Реализация пользовательского взвешивания для нескольких выходов

Когда определенные выходные ряды более критичны для бизнеса, чем другие, равномерное усреднение вводит в заблуждение. Scikit-learn позволяет передавать массив весов в параметр multioutput. Результирующий показатель представляет собой взвешенную сумму индивидуальных ошибок.

Например, если второй выход в два раза важнее первого, можно применить веса вроде [0.33, 0.67]. Это гарантирует, что итоговое скалярное значение отражает приоритетную важность конкретных целевых переменных.

from sklearn.metrics import mean_absolute_error; import numpy as np; y_true = np.array([[0.5, 1], [-1, 1], [7, -6]]); y_pred = np.array([[0, 2], [-1, 2], [8, -5]]); weighted_mae = mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]); print(weighted_mae) # Illustrative output: 0.85

Сравнение взвешенного и равномерного усреднения

Равномерное усреднение ('uniform_average') является поведением по умолчанию, при котором каждый выход считается равнозначным. Это подходит, когда все цели имеют одинаковую природу и важность.

Напротив, взвешенное усреднение позволяет пользователю сильнее штрафовать ошибки в конкретных измерениях. Сравнение 'raw_values' со взвешенным средним помогает определить, искажается ли глобальный показатель одним проблемным выходом или модель работает посредственно по всем целям.

Применение логики multi-output к различным метрикам

Не все метрики scikit-learn поддерживают параметр multioutput. Его поддерживают распространенные метрики регрессии, такие как средняя абсолютная ошибка (MAE), среднеквадратическая ошибка (RMSE) и коэффициент детерминации R2.

Однако некоторые робастные метрики, такие как median_absolute_error, не поддерживают многовыходные входные данные. В таких случаях пользователям приходится вручную итерировать по выходным столбцам и рассчитывать метрику для каждого из них.

Создание пользовательских скореров для взвешенного многовыхода

Чтобы использовать взвешенную многовыходную метрику внутри GridSearchCV или cross_val_score, необходимо обернуть метрику с помощью make_scorer. Поскольку параметр multioutput является именованным аргументом, его нужно передавать при создании скорера.

Так как эти метрики обычно являются функциями потерь (где меньше - значит лучше), параметр greater_is_better в make_scorer должен быть установлен в False, чтобы алгоритм поиска правильно максимизировал отрицательную потерю.

from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.model_selection import GridSearchCV; from sklearn.linear_model import LinearRegression; weighted_mae_scorer = make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False); grid = GridSearchCV(LinearRegression(), param_grid={}, scoring=weighted_mae_scorer)

Одновременная оценка нескольких метрик

Для получения комплексного представления вы можете отслеживать несколько показателей производительности с помощью cross_validate. Передав словарь в параметр scoring, вы сможете одновременно мониторить как взвешенный агрегат, так и другие метрики, такие как R2.

Это позволяет разработчику увидеть, не происходит ли улучшение взвешенного MAE за счет общего объясненного разброса (R2) по всем выходам.

from sklearn.model_selection import cross_validate; from sklearn.metrics import make_scorer, mean_absolute_error; from sklearn.linear_model import LinearRegression; import numpy as np; X = np.random.rand(10, 3); y = np.random.rand(10, 2); scoring_dict = {'weighted_mae': make_scorer(mean_absolute_error, multioutput=[0.3, 0.7], greater_is_better=False), 'r2': 'r2'}; results = cross_validate(LinearRegression(), X, y, scoring=scoring_dict, cv=2); print(results['test_weighted_mae'])

Выбор согласованных функций оценки

Согласованность в оценке означает, что метрика должна соответствовать целевому функционалу прогноза. Если модель обучена предсказывать среднее значение, уместны RMSE или MAE.

При работе с многовыходными задачами убедитесь, что стратегия взвешивания непреднамеренно не меняет статистический смысл метрики. Например, с RMSE следует работать осторожно при усреднении, так как квадратный корень должен сохраняться при переходе от MSE к RMSE для поддержания исходного масштаба ошибки.

Что проверить

  • Проверьте, что y_true и y_pred имеют совпадающие формы (n_samples, n_outputs).
  • Подтвердите, что выбранная метрика поддерживает параметр multioutput.
  • Убедитесь, что в make_scorer для метрик на основе ошибок установлено greater_is_better=False.
  • Проверьте, что длина массива весов соответствует количеству выходных столбцов.

Параметр multioutput поддерживается не всеми метриками, в частности, он отсутствует в median_absolute_error. Также требуется, чтобы массивы целевых значений и предсказаний имели совпадающие размерности.

Источники

  1. scikit-learn: model evaluation ↗
  2. scikit-learn: mean_absolute_error ↗
  3. scikit-learn: root_mean_squared_error ↗
Наверх ↑