GBDTE log-loss dataset

В этом посте хочу торжественно заявить: я не математик. Друзья-математики, уверен, решили бы эту задачу через байесовский формализм без особых усилий. Я же могу в основном объяснять на пальцах.

Итак, в чем задача?

Я хочу сгенерировать синтетический датасет со свойствами, похожими на исходный датасет про мошеннических пользователей. При этом мне важно контролировать, сколько информации признаки дают о целевой переменной. Плюс хочу добавить переменную t (время) и сделать статистику датасета зависящей от времени.

Из-за математической неуверенности я опираюсь на физическую интуицию. Сначала рисуем схему с картинки. По горизонтали бинарный фактор f (feature), по вертикали бинарный таргет l (label). Высота линии, разделяющей l=0 и l=1, имеет понятный смысл - это среднее значение таргета alpha. Пусть alpha = 0.5. Это второе уравнение, первое - a + b + c + d = 1.

Теперь о среднем значении фактора. Я хочу 16 факторов и хочу, чтобы суммарно они давали чуть меньше информации, чем нужно для 100%-го восстановления таргета. Значит среднее значение фактора beta берем 1/16 = 0.0625. beta - это покрытие, то есть как часто фактор равен 1. Это третье уравнение.

И наконец, lift. Это отношение: в числителе вероятность target = 1 при factor = 1, в знаменателе - средний таргет. В наших обозначениях d/(d+b) - это средний таргет при f = 1, а alpha - общий средний таргет.

Когда lift = 1, фактор не дает информации о таргете. Когда lift > 1, видно, насколько сильнее становится сигнал при использовании этого фактора. Например, lift = 1.3 означает примерно на 30% больше пойманных фрод-пользователей. Удобно использовать log-lift: он равен 0 при отсутствии выигрыша и имеет тот же знак, что и корреляция между фактором и таргетом.

В моем датасете время идет от 0 до 1, и нужны две группы факторов: с растущим и с падающим lift. Формулы простые:

lift_up = 0.25 + 0.5*t
lift_down = 0.75 - 0.5*t

Теперь у нас четыре переменные и четыре уравнения. Систему я решил методом Гаусса, результат на нижней картинке.

Эти выражения я закладываю в скрипт генерации синтетического датасета. Код уже готов, а здесь я хотел зафиксировать логику. В следующем посте - сам датасет.