Получи случайную криптовалюту за регистрацию!

Сегодня выкатилась scikit-learn==1.0.0, и в ней - квантильная | Матчасть

Сегодня выкатилась scikit-learn==1.0.0, и в ней - квантильная линейная регрессия

Когда я рассказываю новичкам про регрессию, меня обычно спрашивают, почему мы минимизируем сумму квадратов ошибок, а не их модулей? Я отвечаю "так принято" и говорю что-то про дифференцируемость всюду и про то, что одна большая ошибка критичнее нескольких маленьких. Но аргумент с ошибками применим не всегда (особенно если в данных есть выбросы), и есть куча методов оптимизации, которые плевать хотели на производную в нуле. Таки что получится, если минимизировать сумму модулей ошибок?

А получится предсказание медианы. Ибо сумма модулей ошибок минимальна, когда половина ошибок - отрицательные, а половина - положительные. А если минимизировать, например, 0.9 модулей положительных ошибок плюс 0.1 модулей отрицательных ошибок, то в результате получится 90% квантиль. Поэтому такая модель и называется "квантильная регрессия".

Запускается это очень просто:
#! pip install --upgrade scikit-learn
from sklearn.linear_model import QuantileRegressor
model = QuantileRegressor().fit(X,y)

Как понять, что квантильная регрессия предпочтительнее классической?
- Ваша целевая метрика - MAE, а не RMSE или R^2.
- В данных есть выбросы, и вы не хотите, чтобы они слишком влияли на результат.
- Вам важнее правильно предсказать медиану, чем среднее арифметическое.
- Большие и маленькие ошибки одинаково важны: например, одна ошибка в 300 рублей для вас не более плачевна, чем три ошибки в 100 рублей.
- Важность ошибок несимметричная, например, ошибка -100 гораздо хуже, чем ошибка +100. Тогда вам может быть полезно предсказывать квантиль, отличную от 50%.
- Вы хотите доверительный интервал для вашего предсказания, но не хотите завязываться на допущение, что ошибки распределены нормально с одинаковой дисперсией. Тогда вы можете просто предсказать, например, 5% и 95% квантили отдельными формулами.
- Ваши данные гетероскедастичные, т.е. дисперсия ошибок в разных частях выборки разная. И при этом вы хотите, чтобы модель одинаково усердно старалась предсказывать и в зонах высокой дисперсии, и в зонах низкой.

Примеры кода, картинки и дополнительные рассуждения вы можете посмотреть в документации: https://scikit-learn.org/stable/auto_examples/linear_model/plot_quantile_regression.html

Собственно, идея имплементировать квантильную регрессию в sklearn пришла мне ещё в 2017, когда я начал переодеваться из аналитиков в кодеры. Тогда я закодил свой градиентный спуск, и работал он не очень стабильно, а занятые ревьюеры sklearn давали свой фидбек очень долго. И в результате я погрузился в свою работу и забил. А в этом году я решил добить этот пул-реквест, и пересадил его на scipy.linprog: он масштабируется не так хорошо, как градиентный спуск, зато гарантированно сходится за не очень большое число итераций. Совместными усилиями с активистами sklearn мы привели пул-реквест в порядок и катнули, а сегодня выехала версия sklearn, в которую он вошёл.