Как в Яндекс Погоде использовали фичу для таргета, чтобы улучшить точность предсказания осадков

Яндекс запустил новые модели краткосрочного прогноза осадков — подробнее о них можно почитать на Хабре. А специально для нашего канала ML-разработчик в Яндекс Погоде Дмитрий Стефеев рассказал о важной идее, которая позволила обойти возникшие в начале работы трудности.

Цель — создать модель регрессии для прогноза выпавших за час осадков (в мм). Основными фичами являются прогнозы глобальных численных моделей (NWP).

Главная проблема заключалась в том, что радарные данные, которые мы используем в качестве таргета для обучения, значительно отличаются от прогноза численных моделей на входе. Всё из-за сложности прогноза осадков. Очень легко промазать как по времени, так и пространству. Все функции потерь и их комбинации, которые мы пробовали, приводили к тому, что модель прогнозировала значительно меньше осадков, чем нужно, боясь промазать. Можно было бы попробовать перейти от регрессии к классификации и подбирать пороги, но их, скорее всего, пришлось бы подбирать для каждого шага прогноза (как делали, к примеру, в Metnet от Google) и, вероятно, они бы отличались для разных мест на Земле и разных сезонов. Это значительно усложнило бы поддержку модели и увеличило вероятность непредсказуемого поведения.

Тогда нам пришла идея использовать прогноз осадков одной из численных моделей в фичах в качестве второго таргета, помимо радаров. Получается, что модель начала частично обучаться к собственной фиче! Сначала мы пробовали выставлять фиксированные веса лоссов к радарному таргету и прогнозу численной модели. Стало значительно лучше, но местами проблема сохранялась. Тогда мы сделали предположение, что веса должны зависеть от согласованности прогноза численных моделей на входе отдельно в каждой точке прогноза: чем более согласованный прогноз дают численные модели, тем меньший вес мы используем для радарного лосса и больший — для лосса численной модели.

В ходе экспериментов мы пришли к простой формуле для весов. Сначала считаем медиану для прогнозов осадков всех численных моделей в каждой точке прогноза. Далее считаем среднюю абсолютную разность прогнозов численных моделей и медианы, а затем делим полученное значение на медиану, клипая результат по подобранным границам. Полученное значение W мы применяем для лосса к радарам, а для лосса к прогнозу численной модели используем вес 1 - W. И такой трюк позволяет полностью устранить проблему с уменьшением объёма осадков — по сути это можно считать регуляризацией выхода модели к численному прогнозу, так как мы привязываем прогноз к физической модели, не давая ему отойти слишком далеко.

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

На изображении выше в первой строке показан пример радарного таргета по первым 12 часам прогноза. Ниже — прогноз нашей модели и прогноз численной модели в дополнительном таргете. Для удобства отображения значения мм приведены к трём классам осадков. Видно, что на первых шагах, прогноз модели больше похож на радары, а далее становится ближе к прогнозу численной модели, что позволяет улучшать качество прогноза на первых шагах за счёт исторических радарных данных, если они доступны на входе модели.

ML Underhood