Квантильная регрессия с использованием Pinball Loss в scikit-learn
Узнайте, как внедрять, оценивать и настраивать модели квантильной регрессии с использованием функции потерь pinball loss и показателя эффективности D² в библиотеке scikit-learn.
В этом материале
Короткий ответ
Чтобы выполнить квантильную регрессию в scikit-learn, вы должны согласовать целевую функцию вашей модели с метрикой оценки, выбрав один и тот же целевой квантиль (alpha). Вы можете использовать такие регрессоры, как HistGradientBoostingRegressor с параметром loss='quantile', указав целевое значение через параметр 'quantile'. Для оценки используйте mean_pinball_loss с соответствующим параметром 'alpha'. Чтобы использовать эти метрики в кросс-валидации или при настройке гиперпараметров, оберните их с помощью make_scorer, убедившись, что вы установили greater_is_better=False, так как pinball loss - это значение, которое необходимо минимизировать. Для оценки эффективности модели относительно базового уровня используйте d2_pinball_score, который обобщает концепцию R² на квантили. При работе с несколькими целевыми переменными используйте параметр multioutput, чтобы определить, как ошибки агрегируются по всем выходным данным.
Определите целевой квантиль для принятия решения
Перед обучением вы должны определить конкретный квантиль (alpha), необходимый для ваших бизнес-задач или научных целей. В отличие от регрессии среднего значения, которая нацелена на математическое ожидание, квантильная регрессия нацелена на конкретную точку в условном распределении. Например, поставщику сетевых услуг может потребоваться предсказать 99-й процентиль перебоев в соединении, чтобы гарантировать надежность обслуживания. Как только этот alpha выбран, он должен оставаться неизменным на этапах обучения и оценки, чтобы модель была оптимизирована под правильную функцию.
Практический совет
При выполнении настройки гиперпараметров с помощью GridSearchCV всегда используйте отрицательное значение pinball loss (через make_scorer), чтобы оптимизатор правильно определял лучшую модель путем максимизации показателя.
Выберите модель, минимизирующую pinball loss
В scikit-learn вы выбираете оценщик, который поддерживает квантильную функцию потерь. Например, HistGradientBoostingRegressor можно настроить с параметром loss='quantile' и специфическим параметром 'quantile'. Другие варианты включают QuantileRegressor. Модель будет пытаться минимизировать pinball loss, чтобы найти значение, соответствующее выбранному уровню квантиля.
from sklearn.ensemble import HistGradientBoostingRegressor
import numpy as np
X = np.random.rand(100, 1)
y = 2 * X.ravel() + np.random.normal(0, 0.5, 100)
# Target the 95th percentile
model = HistGradientBoostingRegressor(loss='quantile', quantile=0.95)
model.fit(X, y)Оценивайте с помощью mean_pinball_loss с тем же alpha
Чтобы измерить эффективность вашей модели, используйте функцию mean_pinball_loss. Критически важно, чтобы параметр alpha, передаваемый в эту функцию, был идентичен квантилю, выбранному во время обучения модели. Если вы обучали модель для 0.95 квантиля, но оцениваете ее с использованием 0.50, полученная метрика ошибки будет бессмысленной для вашей конкретной задачи.
from sklearn.metrics import mean_pinball_loss
y_pred = model.predict(X)
loss = mean_pinball_loss(y, y_pred, alpha=0.95)
print(f'Pinball Loss: {loss}')Создайте пользовательский скорер для настройки и валидации
При использовании кросс-валидации или GridSearchCV вы не можете передать mean_pinball_loss напрямую, так как это функция потерь (которую нужно минимизировать), а не показатель (который нужно максимизировать). Вы должны обернуть ее с помощью make_scorer. Поскольку логика оптимизации scikit-learn ожидает, что более высокие значения являются лучшими, вы должны установить greater_is_better=False. Это говорит скореру о необходимости внутреннего отрицания значения потерь.
from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score
# Create a scorer for the 95th percentile
scorer = make_scorer(mean_pinball_loss, alpha=0.95, greater_is_better=False)
# Use in cross-validation
scores = cross_val_score(model, X, y, scoring=scorer, cv=5)
print(f'CV Scores: {scores}')Интерпретируйте D² pinball score для оценки эффективности
d2_pinball_score служит показателем эффективности, аналогичным коэффициенту детерминации R² для регрессии среднего значения. Он измеряет долю отклонения, объясняемого вашей моделью, по сравнению с базовой моделью, которая всегда предсказывает alpha-квантиль обучающих данных. Значение 1.0 указывает на идеальную модель, 0.0 означает, что модель не лучше базовой, а отрицательные значения указывают на то, что модель работает хуже базовой.
from sklearn.metrics import d2_pinball_score
skill_score = d2_pinball_score(y, y_pred, alpha=0.95)
print(f'D2 Pinball Score: {skill_score}')Правильно визуализируйте квантильные прогнозы
Стандартная визуализация регрессии предполагает проверку того, лежат ли точки на диагонали (y_true = y_pred). Однако в квантильной регрессии точки не будут группироваться на диагонали. Вместо этого для квантиля alpha вы ожидаете, что определенная доля точек будет находиться выше и ниже диагонали. Например, если вы предсказываете 0.95 квантиль, примерно 95% фактических значений должны быть ниже предсказанных значений, при условии, что модель хорошо откалибрована.
Обработка многовыходной регрессии
Если ваша целевая переменная является вектором (многовыходной), как mean_pinball_loss, так и d2_pinball_score предоставляют параметр multioutput. По умолчанию установлено значение 'uniform_average', которое вычисляет ошибку для каждого выхода, а затем берет среднее. Вы также можете использовать 'raw_values', чтобы получить массив ошибок, по одной для каждой целевой переменной, или предоставить массив весов, чтобы приоритизировать определенные выходы.
Согласуйте имена параметров при обучении и оценке
Распространенным источником ошибок является несоответствие имен аргументов в scikit-learn. Оценщики обычно используют имя параметра 'quantile' для определения целевого уровня (например, HistGradientBoostingRegressor(quantile=0.95)). Однако функции метрик mean_pinball_loss и d2_pinball_score используют имя параметра 'alpha' (например, mean_pinball_loss(y_true, y_pred, alpha=0.95)). Всегда следите за тем, чтобы эти значения были синхронизированы для поддержания математической согласованности.
Что проверить
- Проверьте, соответствует ли параметр quantile в оценщике параметру alpha в метрике.
- Убедитесь, что make_scorer используется с greater_is_better=False для pinball loss.
- Подтвердите, что d2_pinball_score используется для оценки эффективности, а не для прямого измерения ошибки.
- Проверьте, правильно ли настроены параметры multioutput для многоцелевых наборов данных.
Границы применения
Pinball loss является строго согласованным только для квантильного прогнозирования; он не подходит для прогнозирования среднего значения или моды. Визуальная интерпретация графиков ошибок прогнозирования отличается от моделей, нацеленных на условное среднее.