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

Есть одна причина, которая появляется снова и снова за этим сценарием, и это то, что некоторые из ваших тренировочных функций на самом деле означают не то, что вы думаете. Как бы это было? Посмотрим на примере.

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

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

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

Итак, вы запрашиваете этот столбец и добавляете его к своим функциям, и, наконец, ваш набор данных выглядит примерно так:

Затем вы тренируете свою модель. Обученная модель будет хорошо работать на тестовой выборке, но будет плохо работать в производственной среде. Причина в том, что данные в таблице pro представляют собой текущее количество выполненных заданий для каждого профессионала. Не количество выполненных работ на момент, когда профессионал подал заявку на вакансию. Фактически это одна из форм утечки данных.

Это привело бы к ошибкам в данных обучения. Например, вы не найдете ни одного профессионала, который будет выбран для любой работы с нулевым количеством выполненных заданий, потому что все профессионалы, которые были выбраны для работы в прошлом, в настоящее время выполнили хотя бы одну работу. Хотя на самом деле это могла быть первая работа профессионала, а количество его выполненных работ могло быть нулевым в то время. И наоборот, вы обнаружите, что все профессионалы, у которых нет завершенных заданий, выбраны не во всех заданиях в обучающей выборке.

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

TL; DR: убедитесь, что ваши входные функции представляют состояние в соответствующий момент времени, а не текущее состояние.